在XMonad的多监视器设置中循环工作区

4

我目前是使用 alt + ctrl + leftalt + ctrl + right 来在工作区之间进行切换:

...

    , ((altModMask .|. controlMask, xK_Left),
      prevWS)
    , ((altModMask .|. controlMask, xK_Right),
      nextWS)

这对于单显示器设置来说很好用。然而,当使用双显示器设置时有点令人困惑。这是因为如果当前在另一个屏幕上可见,则要显示的工作区将更改屏幕。例如,如果我在屏幕0上有WS1,屏幕1上有WS2,并且焦点在屏幕0上:

1:term (2:web) 3:txt

当我执行nextWS命令后,当前在屏幕1上的ws 2将被绘制到屏幕0上,屏幕1将显示ws 1。
(1:term) 2:web 3:txt

我希望的行为是,prexWSnextWS只选择当前未显示的工作区,并且可以跳过在其他监视器上显示的工作区。是否已经有这样的命令或者是否有xmonad.hs的示例实现了这个功能?
2个回答

5

使用来自xmonad-contribXMonad.Actions.DynamicWorkspaceOrder

import qualified XMonad.Actions.DynamicWorkspaceOrder as DO

...

    , ((altModMask .|. controlMask, xK_Left),
      DO.moveTo Prev HiddenNonEmptyWS)
    , ((altModMask .|. controlMask, xK_Right),
      DO.moveTo Next HiddenNonEmptyWS)

请注意,您需要导入 XMonad.Actions.CycleWS 来使用 HiddenNonEmptyWS - marbu

0

不完全是你要求的,但这是一个跳过在其他显示器上可见的工作区的 cycleRecentNonEmptyWS 版本:

import Data.Maybe (isJust)
import XMonad
import qualified XMonad.StackSet as W
import XMonad.Actions.CycleRecentWS (cycleWindowSets, recentWS)

cycleRecentHiddenNonEmptyWS :: [KeySym] -> KeySym -> KeySym -> X ()
cycleRecentHiddenNonEmptyWS mods keyNext keyPrev = do
  pred <- getPred
  cycleWindowSets (recentWS pred) mods keyNext keyPrev
  where
    -- Based on private function @wsTypeToPred@ in
    -- @Xmonad.Actions.CycleWS@. Select workspaces that are non-empty
    -- and not on another screen.
    getPred :: X (WindowSpace -> Bool)
    getPred = withWindowSet $ \ws -> do
      -- The hidden windows don't include the currently focused
      -- window, which means we can't abort once we start cycling. So,
      -- instead, we define "hidden" as "focused or not visible". The
      -- @W.visible@ screens are the non-focused but visible ones.
      let visibles = map (W.tag . W.workspace) $ W.visible ws
      let hidden w = W.tag w `notElem` visibles
      let nonEmpty w = isJust (W.stack w)
      return (\w -> hidden w && nonEmpty w)

你可以像使用 cycleRecentNonEmptyWS 一样使用它,例如将以下内容添加到你的键映射中:
             -- The 'xK_grave' is backtick ("`"), so tab cycles
             -- forward, and backtick cycles back.
             , ((modm, xK_Tab), cycleRecentHiddenNonEmptyWS [xK_Super_L] xK_Tab xK_grave)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接