恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

i3wmのキーバインドを変更してみる

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 に某機能を割り当てたいので、この挙動を無効化したいのですが・・・。


参考にしたサイト

i3wm,config しないなんて勿体ない!