i3wmのキーバインドを少しだけ変更しました。
目次
keycodeとkeysym
i3wmのconfigファイルを見ると次のような感じでキーバインドが設定されています。
# start a terminal bindsym $mod+Return exec i3-sensible-terminal # kill focused window bindsym $mod+Shift+q kill
これを見ると、「Return」や「Shift」というワードをどこで調べるのか気になりますね。
ターミナルで
xmodmap -pke
を実行すると
keycode 36 = Return NoSymbol Return keycode 37 = Control_L NoSymbol Control_L (備考)本当はもっと沢山出力されます。これは一部を抜粋したものです。
という感じで、キーの情報が出力されます。
この出力結果から、我々が「Enterキー」と呼んでいるもののkeycodeは「36」、keysymは「Return」だと分かります。同様に、我々が「左のCtrlキー」と呼んでいるもののkeycodeは「37」、keysymは「Control_L」だと分かります。
Mod2とMod3はどのキーなのか?
i3wmのサイトに以下の記述がありました。
This is the Alt key (Mod1) by default, with the Windows key (Mod4) being a popular alternative that largely prevents conflicts with application-defined shortcuts.
この記述からMod1というのはAltキーで、Mod4というのはWindowsキーだと分かります。では、Mod2やMod3はどのキーでしょうか?
今度は
xmodmap -pm
を実行しました。
xmodmap: up to 4 keys per modifier, (keycodes in parentheses): shift Shift_L (0x32), Shift_R (0x3e) lock Caps_Lock (0x42) control Control_L (0x25), Control_R (0x69) mod1 Alt_L (0x40), Alt_R (0x6c), Meta_L (0xcd) mod2 Num_Lock (0x4d) mod3 mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf) mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
この結果を見ると、Mod2はNum_Lockのようです。一方、Mod3に該当するキーは無いようです。
変更したキーバインド
dmenuの呼び出しを $mod + M にしました。
bindsym $mod+m exec --no-startup-id dmenu_run
フォーカスウィンドウを閉じるキーバインドを $mod + Q にしました。
# kill focused window bindsym $mod+q kill
フォーカスウィンドウの切り替えと移動をVim風味にしました。
# change focus bindsym $mod+h focus left bindsym $mod+j focus down bindsym $mod+k focus up bindsym $mod+l focus right # move focused window bindsym $mod+Shift+h move left bindsym $mod+Shift+j move down bindsym $mod+Shift+k move up bindsym $mrd+Shift+l move right
Vim風味にするために $mod+h を使用したので、「split h」の機能をコメントアウトし、「split toggle」を追加しました。
# bindsym $mod+h split h この行をコメントアウト bindsym $mod+v split v bindsym $mod+t split toggle この行を追加
私の場合、「split v」はよく使うのですが「split h」を使うことがほとんど無いという事情もあります。
i3wmの終了を $mod + Shift + = にしました。
# exit i3 (logs you out of your X session) bindsym $mod+Shift+equal exit
resizeモードにおけるキー操作をVim風味にしました。
# resize window (you can also use the mouse for that) mode "resize" { bindsym h resize shrink width 10 px or 10 ppt bindsym j resize grow height 10 px or 10 ppt bindsym k resize shrink height 10 px or 10 ppt bindsym l resize grow width 10 px or 10 ppt # 変更前 # bindsym j resize shrink width 10 px or 10 ppt # bindsym k resize grow height 10 px or 10 ppt # bindsym l resize shrink height 10 px or 10 ppt # bindsym semicolon resize grow width 10 px or 10 ppt (以下略) }
$mod + G でgvimを起動するようにしました。
# gvimを起動 bindsym $mod+g exec vim -g
モード(mode)
i3wm,config しないなんて勿体ない!
というサイトにmodeを使ってlayoutを変更する設定例が載っていました。
(備考)これは上記サイトからの引用です
set $layout "layout [h: splith] [v: splitv] [s: stacking] [t: tabbed] [f: floating toggle]"
bindsym Mod4+l mode $layout
mode $layout {
bindsym Return mode "default"
bindsym h layout splith; mode "default"
bindsym v layout splitv; mode "default"
bindsym s layout stacking; mode "default"
bindsym t layout tabbed; mode "default"
bindsym f floating toggle; mode "default"
}
内容に関しては元サイトの説明をご覧ください(丁寧で分かりやすいです)。
しかし、私自身、時間が経てば忘れてしまいそうなので、簡単な説明メモを書いておきます。
・set行は $layout という変数を設定しています ・「Mod4 + L」でlayoutモードに入ります ・layoutモードに入ったら { }内のキーバインドを使います ・たとえば S を押下すると、stackingレイアウトになります その後、defaultモードに移行します (備考)セミコロンはコマンドを区切るためのものです
私は上記の設定をほぼそのまま使わせていただいています。ただ、私の環境ではWindowsキーが無効になっているので、以下のとおり、Mod4ではなく$modを使っています。
# 上記設定と同じ内容を $mod + P に割り当てています set $layout "layout [h: splith] [v: splitv] [s: stacking] [t: tabbed] [f: floating toggle]" mode $layout { bindsym Return mode "default" bindsym h layout splith; mode "default" bindsym v layout splitv; mode "default" bindsym s layout stacking; mode "default" bindsym t layout tabbed; mode "default" bindsym f floating toggle; mode "default" } bindsym $mod+p mode $layout
上記サイトには以下の注意喚起が書かれています。
あるモードに入ると,そのモード内で定義されたキーバインド/マウスバインド以外全部無効になってしまうため注意が必要です.特に, default モードに戻る手段を書き忘れると大変なことになります.
これは確かに危ないですね。「mode "default"」を忘れずに記述するように心がけようと思います。
困っていること(F11)
F11 を押したら、フォーカスウィンドウが最大化しました(もしくはfull screen?)。そういう設定をした記憶はないので、デフォルトでそうなっているのでしょう。
個人的には、Vimで Shift + F11 に某機能を割り当てたいので、この挙動を無効化したいのですが・・・。