xmonadのフォーカス移動をおしゃれにカーソルキーでしてみませんか
xmonadを使い始めてはじめに覚えるキー操作の一つが、 フォーカス移動である「Mod+j」や「Mod+k」でしょう。 指癖にもなってしまうし、それ自体で困ったことはないと思います。 ただ、真剣な作業をしているときではくて、 両手をキーボードのホームポジションに置かずに、 椅子にふんぞり返ってキーをポチポチおしたいときには、 カーソルキーとの組み合わせのほうが楽ですよねー。 そして、カーソルキーだと上下左右の直感的な方向で移動できるのも精神衛生上、良い話です。
XMonad.Actions.Navigation2D
xmonadでは、ウィンドウのフォーカス移動を「方向で指示して」行おうとするモジュールがいくつかありますが、 今回紹介するのはその中の一つである「XMonad.Actions.Navigation2D」です。
まず、この機能を利用する場合のxmonad.hsの例です。
この機能を組み込む流れは以下のとおりです。
- 必要モジュールのインポート
- Navigation2DConfigのデフォルトデータを調整
- withNavigation2DConfigで、XConfig l型データを加工
- カーソルキーに移動アクションをバインド
必要モジュール
関連する以下のモジュールだけでOKです。
Navigation2DConfigのデフォルトデータを調整
このモジュールの機能の中枢は、xmonad関数に渡すXConfilg l型をwithNavigation2DConfig関数で加工します。 そして、どのように加工するのかを定義できるのが、このNavigation2DConfig型データです。
ここでは、TallやMirror Tallのようなタイル配置の場合でも、方向指示で適当にフォーカス移動できる機能を設定しています。
withNavigation2DConfigで、XConfig l型データを加工
自分でカスタマイズしたNavigation2DConfigデータであるmyNavi2dConfigとXConfig l型データを取って、 設定で加工されたXConfig l型データを得ます。(他にも加工されて、最終的にxmonad関数に渡される)
該当部分は上記のうち41行目
カーソルキーに移動アクションをバインド
フォーカス移動のアクションを作る関数を好きなカーソルキーの組み合わせにバインドします。
ここでは、modキーとカーソルキーの組み合わせで上下左右をバインドしています。
さらなる設定
「XMonad.Actions.Navigation2D」のページを開いてもらうと、 英語が読めなくてもまずわかるのが、文書がめちゃめちゃ長いことです。 ウィンドウのフォーカスをカーソルで移動させるというのは、使う方からしたら、めちゃめちゃ単純な作業なんですが、 xmonadからすると、割と厄介なことのようです。なぜなら、xmonadにとっては、まず、「上下左右」をどうやって決めるのかから考えなければならないからです。 xmonad自身は、スタックセットというデータの構造で、どのワークスペースになんのウィンドウがあってどのウィンドウがフォーカスされているのかということを把握していますが、 ウィンドウがどういうふうに配置されているのかは、レイアウトが決めているで、スタックセットだけではわかりません。 しかも、レイアウトにしても、フォーカスのあるウィンドウから上下左右のウィンドウが何になるのかという事もあまりよくわかりません。 例えば、皆がよく知っていうるTallレイアウトで、左に一つ、右に3つのウィンドウが配置されている場合、左のウィンドウにフォーカスがあって、「右に移動」といわれただけでは、 3つのうちのどれに行けばよいのか決められません。 ですから、そういう場合には、どんなふうに移動するという約束を決めなければならないのです。
先に「Navigation2DConfigのデフォルトデータ」を調整しましたが、あの設定がまさにこの「約束」の選択なのです。
実は、項目defaultTiledNavigation
に定義できるデータはいくつかの選択肢があり、
Navigation2D
型のデータとして定義されています。
Navigation2DConfig
自体には、
レイアウトについてレイアウト毎やフローティングウィンドウの場合に、それぞれどんな「約束」で移動するかを設定できるようになっているので、
興味のある人はリファレンスを参考にいろいろ試してみると良いと思います。
0 件のコメント:
コメントを投稿