xmonadのフォーカス移動をおしゃれにカーソルキーでしてみませんか
xmonadを使い始めてはじめに覚えるキー操作の一つが、 フォーカス移動である「Mod+j」や「Mod+k」でしょう。 指癖にもなってしまうし、それ自体で困ったことはないと思います。 ただ、真剣な作業をしているときではくて、 両手をキーボードのホームポジションに置かずに、 椅子にふんぞり返ってキーをポチポチおしたいときには、 カーソルキーとの組み合わせのほうが楽ですよねー。 そして、カーソルキーだと上下左右の直感的な方向で移動できるのも精神衛生上、良い話です。
XMonad.Actions.Navigation2D
xmonadでは、ウィンドウのフォーカス移動を「方向で指示して」行おうとするモジュールがいくつかありますが、 今回紹介するのはその中の一つである「XMonad.Actions.Navigation2D」です。
まず、この機能を利用する場合のxmonad.hsの例です。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
------------------------------------------------------------------------------
-- shunsk's base xmonad.hs file for custamize
-- https://ok-xmonad.blogspot.com
-- Navigation2Dモジュール説明用
-- 説明で使うxmonad.hsのベースになるファイル
-- ~/.config/xmobar/mobarrcはリネームしておく
-- xmobarのフォントは日本語が使えるIPAフォント
-- 必要アプリ
-- kitty
-- dmenu
-- IPAfont
-- xmobar
------------------------------------------------------------------------------
import System.Exit
import XMonad
import XMonad.Util.Run
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.DynamicLog
import qualified XMonad.StackSet as W
import XMonad.Util.EZConfig
-- 方向の指示でフォーカス移動する
import XMonad.Actions.Navigation2D
---------------------------------------------------------------
-- MAIN
---------------------------------------------------------------
main = do
-- xmobarを使う
h <- spawnPipe "xmobar -f 'xft:IPAGothic:size=14:medium:antialias=true'"
-- xmonadの実行
xmonad
$ docks
$ withNavigation2DConfig myNavi2dConfig
$ def { terminal = "kitty"
, modMask = mod4Mask
, focusFollowsMouse = False
, workspaces = map show [1..5 ::Int]
, manageHook = manageHook def
, handleEventHook = handleEventHook def
, layoutHook = mylayouthook
, logHook = myXmobarLogHook h
, keys = \c -> mkKeymap c (keyMapDataList c)
}
---------------------------------------------
-- Navigation2DConfig型データの調整
---------------------------------------------
myNavi2dConfig
= def { defaultTiledNavigation = sideNavigation
}
---------------------------------------------
-- ステータスバー表示のカスタマイズ
---------------------------------------------
-- xmobar用
myXmobarLogHook h =
dynamicLogWithPP
xmobarPP
{ ppOutput = hPutStrLn h
, ppCurrent = xmobarColor "#FF9F1C" "#1A1B41" . pad . wrap "[" "]"
, ppTitle = xmobarColor "#1A1B41" "#C2E7DA" . shorten 50 . pad
}
---------------------------------------------
-- レイアウト
---------------------------------------------
mylayouthook =
avoidStruts mytall ||| avoidStruts mymirror ||| myfull
where mytall = Tall 1 0.03 0.5
mymirror = Mirror mytall
myfull = Full
---------------------------------------------
-- キーバインド関連
---------------------------------------------
keyMapDataList :: XConfig Layout -> [(String, X ())]
keyMapDataList conf =
[("M-S-<Return>", spawn $ XMonad.terminal conf)
,("M-p", spawn "dmenu_run")
,("M-S-c", kill)
,("M-<Space>", sendMessage NextLayout)
,("M-n", refresh)
,("M-j", windows W.focusDown)
,("M-k", windows W.focusUp)
,("M-m", windows W.focusMaster)
,("M-S-j", windows W.swapDown)
,("M-S-k", windows W.swapUp)
,("M-<Return>", windows W.swapMaster)
,("M-t", withFocused $ windows . W.sink)
,("M-S-q", io (exitWith ExitSuccess))
,("M-q", spawn myRecompileCmd)
-- Navigation2D用のキーバインド
,("M-<R>", windowGo R False)
,("M-<L>", windowGo L False)
,("M-<U>", windowGo U False)
,("M-<D>", windowGo D False)
]
-- workspaceの移動等
++
[("M-" ++ m ++ show k , windows $ f i)
| (i,k) <- zip (XMonad.workspaces conf) ([1..5] :: [Int])
, (f,m) <- [(W.view, ""),(W.shift, "S-")]
]
where
myRecompileCmd =
"xmonad --recompile && (killall xmobar; xmonad --restart)"
この機能を組み込む流れは以下のとおりです。
- 必要モジュールのインポート
- Navigation2DConfigのデフォルトデータを調整
- withNavigation2DConfigで、XConfig l型データを加工
- カーソルキーに移動アクションをバインド
必要モジュール
関連する以下のモジュールだけでOKです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- 方向の指示でフォーカス移動する
import XMonad.Actions.Navigation2D
Navigation2DConfigのデフォルトデータを調整
このモジュールの機能の中枢は、xmonad関数に渡すXConfilg l型をwithNavigation2DConfig関数で加工します。 そして、どのように加工するのかを定義できるのが、このNavigation2DConfig型データです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
---------------------------------------------
-- Navigation2DConfig型データの調整
---------------------------------------------
myNavi2dConfig
= def { defaultTiledNavigation = sideNavigation
}
ここでは、TallやMirror Tallのようなタイル配置の場合でも、方向指示で適当にフォーカス移動できる機能を設定しています。
withNavigation2DConfigで、XConfig l型データを加工
自分でカスタマイズしたNavigation2DConfigデータであるmyNavi2dConfigとXConfig l型データを取って、 設定で加工されたXConfig l型データを得ます。(他にも加工されて、最終的にxmonad関数に渡される)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
xmonad
$ docks
$ withNavigation2DConfig myNavi2dConfig
$ def { terminal = "kitty"
該当部分は上記のうち41行目
カーソルキーに移動アクションをバインド
フォーカス移動のアクションを作る関数を好きなカーソルキーの組み合わせにバインドします。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- Navigation2D用のキーバインド
,("M-<R>", windowGo R False)
,("M-<L>", windowGo L False)
,("M-<U>", windowGo U False)
,("M-<D>", windowGo D False)
ここでは、modキーとカーソルキーの組み合わせで上下左右をバインドしています。
さらなる設定
「XMonad.Actions.Navigation2D」のページを開いてもらうと、 英語が読めなくてもまずわかるのが、文書がめちゃめちゃ長いことです。 ウィンドウのフォーカスをカーソルで移動させるというのは、使う方からしたら、めちゃめちゃ単純な作業なんですが、 xmonadからすると、割と厄介なことのようです。なぜなら、xmonadにとっては、まず、「上下左右」をどうやって決めるのかから考えなければならないからです。 xmonad自身は、スタックセットというデータの構造で、どのワークスペースになんのウィンドウがあってどのウィンドウがフォーカスされているのかということを把握していますが、 ウィンドウがどういうふうに配置されているのかは、レイアウトが決めているで、スタックセットだけではわかりません。 しかも、レイアウトにしても、フォーカスのあるウィンドウから上下左右のウィンドウが何になるのかという事もあまりよくわかりません。 例えば、皆がよく知っていうるTallレイアウトで、左に一つ、右に3つのウィンドウが配置されている場合、左のウィンドウにフォーカスがあって、「右に移動」といわれただけでは、 3つのうちのどれに行けばよいのか決められません。 ですから、そういう場合には、どんなふうに移動するという約束を決めなければならないのです。
先に「Navigation2DConfigのデフォルトデータ」を調整しましたが、あの設定がまさにこの「約束」の選択なのです。
実は、項目defaultTiledNavigation
に定義できるデータはいくつかの選択肢があり、
Navigation2D
型のデータとして定義されています。
Navigation2DConfig
自体には、
レイアウトについてレイアウト毎やフローティングウィンドウの場合に、それぞれどんな「約束」で移動するかを設定できるようになっているので、
興味のある人はリファレンスを参考にいろいろ試してみると良いと思います。
0 件のコメント:
コメントを投稿