Post Page Advertisement [Top]

configkeymove focusxmonad

xmonadのフォーカス移動をおしゃれにカーソルキーでしてみませんか

DSC01994

xmonadを使い始めてはじめに覚えるキー操作の一つが、 フォーカス移動である「Mod+j」や「Mod+k」でしょう。 指癖にもなってしまうし、それ自体で困ったことはないと思います。 ただ、真剣な作業をしているときではくて、 両手をキーボードのホームポジションに置かずに、 椅子にふんぞり返ってキーをポチポチおしたいときには、 カーソルキーとの組み合わせのほうが楽ですよねー。 そして、カーソルキーだと上下左右の直感的な方向で移動できるのも精神衛生上、良い話です。


XMonad.Actions.Navigation2D

xmonadでは、ウィンドウのフォーカス移動を「方向で指示して」行おうとするモジュールがいくつかありますが、 今回紹介するのはその中の一つである「XMonad.Actions.Navigation2D」です。


まず、この機能を利用する場合のxmonad.hsの例です。


------------------------------------------------------------------------------
-- 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)"
view raw xmonad.hs hosted with ❤ by GitHub

この機能を組み込む流れは以下のとおりです。


  • 必要モジュールのインポート
  • Navigation2DConfigのデフォルトデータを調整
  • withNavigation2DConfigで、XConfig l型データを加工
  • カーソルキーに移動アクションをバインド

必要モジュール

関連する以下のモジュールだけでOKです。


-- 方向の指示でフォーカス移動する
import XMonad.Actions.Navigation2D
view raw xmonad.hs hosted with ❤ by GitHub

Navigation2DConfigのデフォルトデータを調整

このモジュールの機能の中枢は、xmonad関数に渡すXConfilg l型をwithNavigation2DConfig関数で加工します。 そして、どのように加工するのかを定義できるのが、このNavigation2DConfig型データです。


---------------------------------------------
-- Navigation2DConfig型データの調整
---------------------------------------------
myNavi2dConfig
= def { defaultTiledNavigation = sideNavigation
}
view raw xmonad.hs hosted with ❤ by GitHub

ここでは、TallやMirror Tallのようなタイル配置の場合でも、方向指示で適当にフォーカス移動できる機能を設定しています。


withNavigation2DConfigで、XConfig l型データを加工

自分でカスタマイズしたNavigation2DConfigデータであるmyNavi2dConfigとXConfig l型データを取って、 設定で加工されたXConfig l型データを得ます。(他にも加工されて、最終的にxmonad関数に渡される)


xmonad
$ docks
$ withNavigation2DConfig myNavi2dConfig
$ def { terminal = "kitty"
view raw xmonad.hs hosted with ❤ by GitHub

該当部分は上記のうち41行目


カーソルキーに移動アクションをバインド

フォーカス移動のアクションを作る関数を好きなカーソルキーの組み合わせにバインドします。


-- Navigation2D用のキーバインド
,("M-<R>", windowGo R False)
,("M-<L>", windowGo L False)
,("M-<U>", windowGo U False)
,("M-<D>", windowGo D False)
view raw xmonad.hs hosted with ❤ by GitHub

ここでは、modキーとカーソルキーの組み合わせで上下左右をバインドしています。


さらなる設定

XMonad.Actions.Navigation2D」のページを開いてもらうと、 英語が読めなくてもまずわかるのが、文書がめちゃめちゃ長いことです。 ウィンドウのフォーカスをカーソルで移動させるというのは、使う方からしたら、めちゃめちゃ単純な作業なんですが、 xmonadからすると、割と厄介なことのようです。なぜなら、xmonadにとっては、まず、「上下左右」をどうやって決めるのかから考えなければならないからです。 xmonad自身は、スタックセットというデータの構造で、どのワークスペースになんのウィンドウがあってどのウィンドウがフォーカスされているのかということを把握していますが、 ウィンドウがどういうふうに配置されているのかは、レイアウトが決めているで、スタックセットだけではわかりません。 しかも、レイアウトにしても、フォーカスのあるウィンドウから上下左右のウィンドウが何になるのかという事もあまりよくわかりません。 例えば、皆がよく知っていうるTallレイアウトで、左に一つ、右に3つのウィンドウが配置されている場合、左のウィンドウにフォーカスがあって、「右に移動」といわれただけでは、 3つのうちのどれに行けばよいのか決められません。 ですから、そういう場合には、どんなふうに移動するという約束を決めなければならないのです。


先に「Navigation2DConfigのデフォルトデータ」を調整しましたが、あの設定がまさにこの「約束」の選択なのです。 実は、項目defaultTiledNavigationに定義できるデータはいくつかの選択肢があり、 Navigation2D型のデータとして定義されています。 Navigation2DConfig自体には、 レイアウトについてレイアウト毎やフローティングウィンドウの場合に、それぞれどんな「約束」で移動するかを設定できるようになっているので、 興味のある人はリファレンスを参考にいろいろ試してみると良いと思います。


0 件のコメント:

コメントを投稿

Bottom Ad [Post Page]