Xmonad:设置屏幕和工作区

5
我遇到了一些问题,无法让这个函数按照我预期的方式工作。
setScreenAndWorkspace i =
  windows (viewOnScreen screenId workspaceId)
  where
    screenId = ((i-1) `mod` numberOfScreens)
    -- workspaceId = show i -- doesn't work for some reason
    workspaceId =
      case i of
        1 -> "1"
        2 -> "2"
        3 -> "3"
        4 -> "4"
        5 -> "5"
        6 -> "6"
        7 -> "7"
        8 -> "8"
        9 -> "9"

我这样调用函数:

myKeys =
  [
    ("M-1"   , setScreenAndWorkspace 1),
    ("M-2"   , setScreenAndWorkspace 2),
    ("M-3"   , setScreenAndWorkspace 3),
    ("M-4"   , setScreenAndWorkspace 4),
    ("M-5"   , setScreenAndWorkspace 5),
    ("M-6"   , setScreenAndWorkspace 6),
    ("M-7"   , setScreenAndWorkspace 7),
    ("M-8"   , setScreenAndWorkspace 8),
    ("M-9"   , setScreenAndWorkspace 9)
  ]

首先,show i似乎与case i不同。我一定误解了一些基本的Haskell东西;如果我使用show i,似乎xmonad找不到任何工作区。
第二个问题是函数可以运行,但并不总是转移焦点。我必须按两次键序列来设置屏幕、设置工作区,并将焦点设置在该工作区。

1
能否详细说明一下 show i 为什么无法工作? - Tener
1
关于焦点:来自文档的说明:“如果 i 可见,使用视图将焦点切换到工作区 i。”。因此,首先使其可见,然后再移动焦点。所以它按照广告所述正常工作。 - Tener
我觉得 show i 不起作用有点可疑。你确定了吗? - luqui
如果你不相信我的show i,那么我的配置并没有什么太激进的地方,如果你想尝试一下,应该很容易。 - mbac32768
1个回答

2

对于 show i 这个问题,很容易在提示中看到为什么它不能按照你的期望工作:

Prelude XMonad> show (1 :: Integer)
"1"
Prelude XMonad> show (1 :: ScreenId)
"S 1"

你可以使用类似于drop 2 . show这样的东西,如果你感觉特别的hacky,或者像下面这样的东西。
unS (S i) = i
workspaceId = show (unS i)

如果你不想要进行黑客式的操作。

至于为什么viewOnScreen不会对屏幕进行聚焦,嗯... 那只是因为它没有被设计成这样。从文档中可以看到:"在屏幕sc上切换到工作区i。如果i可见,则使用视图view将焦点切换到工作区i。"。所以只有当i已经可见时才会改变焦点。那为什么不直接调用两次呢?像这样:

windows (viewOnScreen screenId workspaceId . viewOnScreen screenId workspaceId)

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