Post Page Advertisement [Top]

configNSPscratchpadworkspacexmonad

xmonadのNSPワークスペースをお洒落にskipさせる

xmonadでスクラッチパッドの機能を使っている人はわかると思いますが、 「NSP」と呼ばれるワークスペースは、邪魔なのです。 このノートでは、「NSP」がわからないようにする方法を紹介します。


問題となる点を整理すると以下のとおりです。


  • logHookの出力にNSPが出ないようにする
  • キーでのワークスペース移動(サイクル)の時にNSPを含まないようにする

logHook出力からNSPを消す

スクラッチパッドの機能を定義している「XMonad.Util.NamedScratchpad」モジュールに有る namedScratchpadFilterOutWorkspacePP関数を使います。 この関数は、logHookで表示する内容を定義するPPを渡すと、そのなかから「NSP」を削除したPPを返してくれます。


通常、XConfig l型のlogHookには、自分で定義したmyPPをdynamicLogWithPP関数に渡したものを定義していると思います。


-- 普通のlogHook
  logHook = dynamicLogWithPP myPP 


NSPワークスペースの表示を隠すには、 そのmyPPをnamedScratchpadFilterOutWorkspacePPで加工し、それをdynamicLogWithPP関数に渡せばOKです。


-- NSPを隠す(その1)
  logHook = dynamicLogWithPP $ namedScratchpadFilterOutWorkspacePP myPP 


myPPに該当する部分が引数付きの関数で定義されているような場合(ステータスバーを起動してhとかを受け取っているパターン)、 以下のパターンの参考にしてみてください。($とか.の事がよくわからない時は、「haskellの関数をおしゃれに把握する」も参考にしてみて下さい)


-- NSPを隠す(その2 myPP相当部分が引数を持つ)
  logHook = dynamicLogWithPP $ namedScratchpadFilterOutWorkspacePP $ myPP h 


または、次のように関数合成を使うことも出来ます。


-- NSPを隠す(その3 関数合成をつかう)
  logHook = dynamicLogWithPP . namedScratchpadFilterOutWorkspacePP $ myPP h 


logHookの引数のあたりは、他人のxmonad.hsからコピペしてくると複雑な形になっているかもしれないので、 ここでの幾つかのパターンを参考にして、何がどれの引数になっているのか整理しながら設定してみて下さい。


Cycle移動でNSPを飛ばす

次は、ワークスペースの移動の際にNSPに入らないようにする方法です。 実際には、ワークスペースの移動の方法には色々あり、 xmonadのデフォルトの定義のように、 「Mod+数字」等で直接特定のワークスペースへ移動したりような場合や、 プロンプトで直接特定のワークスペースへ移動する場合には、 NSPは邪魔になりません。


問題になるのは、あるキーを押す毎に隣のワークスペースに切り替わっていく 「XMonad.Actions.CycleWS」モジュールで定義されたnextWSアクションとprevWSアクションを使う場合です。 この場合、次々とワークスペースを切り替えているとその中にNSPが入り込んでしまいます。 ですから、ここでは、この「XMonad.Actions.CycleWS」モジュールの用なワークスペースを切り替える時に NSPが入り込まない処理を考えます。


この機能は、ネット上でもよく検索されるようで、私も、検索している時にRedditで見つけました。https://www.reddit.com/r/xmonad/comments/hqbqv0/skip_nsp_when_cycling_non_empty_workspaces/で、ある人が質問したものに対する答えとして、https://github.com/altercation/dotfiles-tilingwm/blob/master/.xmonad/xmonad.hs#L1145が紹介されています。


そのコードが次のもので、特に変更しなくてもそのまま使うことが出来ます。


-- from altercation/dotfiles-tilingwm's xmonad.hs

nextNonEmptyWS = findWorkspace getSortByIndexNoSP Next HiddenNonEmptyWS 1
        >>= \t -> (windows . W.view $ t)

prevNonEmptyWS = findWorkspace getSortByIndexNoSP Prev HiddenNonEmptyWS 1
        >>= \t -> (windows . W.view $ t)

getSortByIndexNoSP =
        fmap (.namedScratchpadFilterOutWorkspace) getSortByIndex



これに必要となるのは、以下のモジュールなので、自分のxmonad.hsに無いものがアレば付け足しておきましょう。


-- 必要なモジュール
import XMonad.Util.NamedScratchpad
import qualified XMonad.StackSet as W
import XMonad.Util.WorkspaceCompare
import XMonad.Actions.CycleWS


上記の定義で、「nextNonEmptyWS」と「prevNonEmptyWS」といいう、2つのアクション関数が使えるようになりました。 これは、何のウィンドウも開かれていないワークスペースを飛ばして、更に、NSPも飛ばした次のワークスペースに移動するアクションを作ってくれる関数です。 あとは、この関数を「Mod + 右矢印、左矢印」等にバインドしてあげましょう。(キーバインドについては「xmonadでお洒落にキーのカスタマイズ」を参考にしてみて下さい。)


-- keyバインドの一部
  -- workspaceの移動等
  ,("M-C-<R>", nextNonEmptyWS)
  ,("M-C-<L>", prevNonEmptyWS)


logHookでのワークスペース等の表示のカスタマイズについては、別の機会にしたいと思いますが、 このlogHookでの出力の既定値でも、ウィンドウのないワークスペースは表示されない定義になっているので、 このキーでのワークスペース移動と、ステータスバーでのワークスペース移動は連動する様になっていると思います。


0 件のコメント:

コメントを投稿

Bottom Ad [Post Page]