【问题标题】:xmonad: set screen and workspacexmonad:设置屏幕和工作区
【发布时间】:2011-06-10 09:50:55
【问题描述】:

我无法让此功能按预期工作。

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 找不到任何工作区。

第二个问题是该功能有效,但并不总是转移焦点。我必须按两次按键序列来设置屏幕、设置工作区并将焦点设置在该工作区上。

【问题讨论】:

  • 您能否详细说明show i 不起作用的原因?
  • 关于焦点:来自文档:“如果 i 可见,请使用视图将焦点切换到工作区 i。”。所以首先你让它可见,然后你转移焦点。所以它像宣传的那样工作。
  • 我怀疑show i 不起作用。你确定吗?
  • 我的配置没有什么太激进的地方,如果你不相信我关于 show i 的内容,你自己试试应该很容易。

标签: haskell xmonad


【解决方案1】:

对于show i 问题,很容易在提示符处看到为什么它没有按您期望的方式工作:

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

如果你觉得特别hacky,你可以使用drop 2 . show之类的东西,或者类似的东西

unS (S i) = i
workspaceId = show (unS i)

如果你不觉得 hacky。

至于为什么viewOnScreen 不聚焦屏幕,嗯...只是因为它不是设计的。从文档中:“在屏幕 sc 上切换到工作区 i。如果 i 可见,请使用视图将焦点切换到工作区 i。”。所以它只在i 已经可见时才改变焦点。为什么不直接调用两次呢?应该这样做:

windows (viewOnScreen screenId workspaceId . viewOnScreen screenId workspaceId)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    相关资源
    最近更新 更多