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)
  ]

まず、showiはのケースiと同じようには見えません。私はいくつかの基本的なHaskellのことを誤解しているに違いありません。show iを使用すると、xmonadがワークスペースを見つけることができないようです。

2番目の問題は、関数が機能するが、常にフォーカスを転送するとは限らないことです。画面を設定し、ワークスペースを設定し、そのワークスペースにフォーカスを設定するには、キーシーケンスを2回押す必要があります。

4

1 に答える 1

2

質問についてshow iは、プロンプトで、期待どおりに機能しない理由を簡単に確認できます。

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

drop 2 . show特にハックだと感じた場合、または次のようなものを使用できます

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

あなたがハッキーを感じていないなら。

がなぜviewOnScreen画面の焦点を合わせないのかというと、それは設計されていないからです。ドキュメントから: 「画面 sc でワークスペース i に切り替えます。i が表示されている場合は、ビューを使用してフォーカスをワークスペース i に切り替えます。」. iしたがって、すでに表示されている場合にのみフォーカスが変更されます。2回だけ呼び出してみませんか?このようなことをする必要があります:

windows (viewOnScreen screenId workspaceId . viewOnScreen screenId workspaceId)
于 2011-06-10T01:50:55.133 に答える