2023/02/25

i3wmクイックスタートアップガイド

本エントリはタイル型ウインドウマネージャのi3wmを可及的速やかに動作させるためのテキストである。以下の条件に当てはまるユーザを想定読者層とする。

・Linuxの基本的な操作方法を理解している。
i3-wmパッケージの導入が完了している。
・Arch Linuxかそれに類するディストリビューションを使用している。

Arch Linuxの導入についてはこの記事を、i3wm設定後のトラブルシューティングについてはこの記事をそれぞれ参考にされたし。なお、本エントリではSwayとWaylandに関する説明は行わない。

初期設定

通常、i3wmを導入した状態で初回起動を行うとウェルカムメッセージと共にmodキーの設定を促される。modキーを決めると~/.config/i3/configファイルが生成され、原則的にはこれを基に設定ファイルを構築する形となる。しかし、本エントリではこの手順は踏まず、i3wm移行前にあらかじめ設定ファイルを作っておく。 すなわち、~/.config/i3フォルダとconfigファイル(ドットや拡張子は付かない)を手動で作成する。

というのも、ろくに整備されていない環境に放り込まれた状態では情報収集や編集作業に翳りが生じる恐れが否めないからだ。実際、本当になにも設定していないとブラウザの起動さえおぼつかない。したがって、繰り返すが前もって設定ファイルを構築することを強く勧めたい。

アプリケーションの起動と終了

さっそくconfigファイルに設定を列挙していく。まず記すべきは前述したmodキーである。modキーとはi3wmにおいてショートカットの始動を司るキーで、$mod+eのような形式でキーバインドを定義する際に用いる。デフォルトではMod1(Altキー)が採用されているが、Altキーは他のアプリケーションと衝突しやすいので、Mod4(Windowsキー、Commandキー)の方が好ましい。

1set $mod Mod4

続いてアプリケーションやコマンドの起動ショートカットを決める。おそらくもっとも書く機会が多い構文だと思われる。一例としてターミナルアプリケーションの例を挙げる。

1bindsym $mod+Return exec --no-startup-id alacritty

このショートカットの構文はbindsymから始まり、次に任意のキーバインド、アプリケーションやコマンドの起動ではexec --no-startup-idが加わり、末尾でアプリケーションを指定する。さしあたりターミナル、ブラウザ、ファイラを設定して残りは移行後でも構わない。指定に必要なクラス名はxprop | grep WM_CLASSで求められる。実行後、アプリケーションにマウスカーソルを重ねるとターミナル上にクラス名が表示される。

反対に、アプリケーションを終了するショートカットは以下の通りに定める。これでひとまずアプリケーションの起動と終了が行えるようになった。

1bindsym $mod+q kill

自動起動

システムの起動時にアプリケーションを自動で起動させたい場合は、キーバインドなしでexecオプションを書いて直に指定する。コマンドやスクリプトを実行させることもできる。たとえばfehは本来は画像ビューアだが、ここでは壁紙を表示させる役割を与えている。

1exec --no-startup-id vivaldi-stable
2exec --no-startup-id "feh --no-fehbg --bg-scale ~/Wallpaper.png"
3exec --no-startup-id "xset r rate 200 30"
4exec --no-startup-id fcitx5

ショートカットの拡張

ショートカットを設定していくと次第に候補となるキーバインドが足りなくなってくる。そこで、ショートカットを二段構えにして実質的にキーバインドを増やす手法が役に立つ。

1bindsym $mod+c mode "CMD"
2mode "CMD"{
3    bindsym v exec vivaldi-stable; mode "default"
4    bindsym f exec "flameshot gui" mode "default"
5    bindsym Return mode "default"
6    bindsym Escape mode "default"
7    bindsym $mod+c mode "default"
8}

上記の例では$mod+cで一旦"CMD"モードに入り(この名称は自由に決められる)そこから追加のキーを押してアプリケーションが起動する構成になっている。$mod+cだけでは一つのショートカットしか設定できないが、このように工夫すると$mod+cの配下に複数のショートカットを定義できる。

注意点はショートカットをモード化した際に、そのモードを解除する挙動を定義しておかないといつまでもモード化が維持されてしまうところだ。そうすると他のショートカットを受けつけなくなるため、上記の例にしたがってアプリケーションの起動直後か、任意のキーバインドで通常モードに戻る設定mode "default"を書き加えておかなければならない。

ウインドウの操作

i3wmはタイル型ウインドウマネージャであるからにして、ウインドウの操作もショートカットで完結させることが前提となる。手始めにウインドウフォーカスの設定例を記す。本項ではVimライクなキーバインドと矢印キーを使うものの二通りを紹介する。

 1# ウインドウフォーカス
 2bindsym $mod+h focus left
 3bindsym $mod+j focus down
 4bindsym $mod+k focus up
 5bindsym $mod+l focus right
 6
 7# 代替ウインドウフォーカス
 8bindsym $mod+Left focus left
 9bindsym $mod+Down focus down
10bindsym $mod+Up focus up
11bindsym $mod+Right focus right

次にウインドウの交換ショートカットを設定する。並んでいるウインドウの位置を入れ替えたい時に用いる。

 1# ウインドウ交換
 2bindsym $mod+Shift+h move left
 3bindsym $mod+Shift+j move down
 4bindsym $mod+Shift+k move up
 5bindsym $mod+Shift+l move right
 6
 7# 代替ウインドウ交換
 8bindsym $mod+Shift+Left move left
 9bindsym $mod+Shift+Down move down
10bindsym $mod+Shift+Up move up
11bindsym $mod+Shift+Right move right

続いて、ウインドウの分割ショートカットを設定する。ウインドウはもっぱら垂直に展開されるが、下記に倣って$mod+sを発動してからアプリケーションを起動すると水平に展開されるようになる。垂直での起動に戻すには$mod+vを押す。すでに展開済みのウインドウを水平または垂直に変更したい場合はlayoutオプションでtoggle splitを定義する。

1# 水平ウインドウ分割
2bindsym $mod+s split v
3
4# 垂直ウインドウ分割
5bindsym $mod+v split h
6
7# ウインドウの分割切り替え
8bindsym $mod+e layout toggle split

フルスクリーン表示も可能。toggleオプションを用いると同一のキーバインドで有効と無効を切り替えられる。

1bindsym $mod+f fullscreen toggle

タイル型ウインドウマネージャはその名の通り、あたかもタイルのごとくウインドウを敷き詰める使い方が基本ではあるものの、一般のデスクトップ環境と同じくフローティングさせることもできる。ただし、前述のウインドウフォーカスはフロートウインドウに対しては効かないため、専用の設定を定義しておかなければならない。

1# ウインドウフロート
2bindsym $mod+w floating toggle
3
4# フロートウインドウフォーカス
5bindsym $mod+space focus mode_toggle

同様に、フロートウインドウを動かすキーバインドも個別に設定する。i3wmの仕様上、たとえフロートウインドウであってもマウスのドラッグ単体で動いてくれるとは限らない。

1floating_modifier $mod

フロートウインドウの応用例として、特定のアプリケーションを必ずフロート起動させる設定が挙げられる。とりわけファイラや動画プレイヤーはフローティングのモチベが高い。resizeオプションを定義しないと最大表示で展開してしまうので、こだわりがなくとも適当なウインドウサイズを指定した方がよい。

1for_window [class="Thunar"] floating enable, resize set 1024 780

最後にウインドウのリサイズを行うショートカットを記す。僕はモード化して仕立てている。

 1bindsym $mod+r mode "RESIZE"
 2mode "RESIZE" {
 3        bindsym h resize shrink width 10 px or 5 ppt
 4        bindsym j resize grow height 10 px or 5 ppt
 5        bindsym k resize shrink height 10 px or 5 ppt
 6        bindsym l resize grow width 10 px or 5 ppt
 7
 8        # 代替
 9        bindsym Left resize shrink width 10 px or 5 ppt
10        bindsym Down resize grow height 10 px or 5 ppt
11        bindsym Up resize shrink height 10 px or 5 ppt
12        bindsym Right resize grow width 10 px or 5 ppt
13
14        # 通常モード遷移
15        bindsym Return mode "default"
16        bindsym Escape mode "default"
17        bindsym $mod+r mode "default"
18}

ワークスペースの設定

デスクトップ環境では「仮想デスクトップ」と呼称される機能をi3wmでは「ワークスペース」と呼ぶ。ウインドウを一面に敷き詰める文化は極めて効率に優れる一方で、なにかとすぐに余白が不足する。かつては無縁だったユーザもi3wmではワークスペースの助けなくしては生きられないだろう。

まずはワークスペースの変数を定義する。僕は1から始める数字派だが0から始める人もいる。数字ではなく記号派の人もけっこう多い。

 1set $ws1 "1"
 2set $ws2 "2"
 3set $ws3 "3"
 4set $ws4 "4"
 5set $ws5 "5"
 6set $ws6 "6"
 7set $ws7 "7"
 8set $ws8 "8"
 9set $ws9 "9"
10set $ws10 "10"

次にワークスペース間を移動するショートカットを設定する。数字と対応させるのが無難オブ無難だが、ワークスペースが増えるほどmodキーから離れた位置にならざるをえない欠点もある。

 1bindsym $mod+1 workspace $ws1
 2bindsym $mod+2 workspace $ws2
 3bindsym $mod+3 workspace $ws3
 4bindsym $mod+4 workspace $ws4
 5bindsym $mod+5 workspace $ws5
 6bindsym $mod+6 workspace $ws6
 7bindsym $mod+7 workspace $ws7
 8bindsym $mod+8 workspace $ws8
 9bindsym $mod+9 workspace $ws9
10bindsym $mod+0 workspace $ws10

使用頻度は人によるが、ウインドウを別のワークスペースに移動させるショートカットも設定しておく。一連のキーバインドには数字キーをすべて割り振っているが、もし他に使うあてがあれば適宜削っても差し支えはない。僕も本当に使用しているワークスペースの数はせいぜい5個くらいしかない。

 1bindsym $mod+Shift+1 move container to workspace $ws1
 2bindsym $mod+Shift+2 move container to workspace $ws2
 3bindsym $mod+Shift+3 move container to workspace $ws3
 4bindsym $mod+Shift+4 move container to workspace $ws4
 5bindsym $mod+Shift+5 move container to workspace $ws5
 6bindsym $mod+Shift+6 move container to workspace $ws6
 7bindsym $mod+Shift+7 move container to workspace $ws7
 8bindsym $mod+Shift+8 move container to workspace $ws8
 9bindsym $mod+Shift+9 move container to workspace $ws9
10bindsym $mod+Shift+0 move container to workspace $ws10

特定のアプリケーションを指定したワークスペースでのみ起動させる設定も存在する。ワークスペース単位で用途を決めている人には欠かせない。前述の自動起動と併せて列挙すれば「システム起動時にSlackをワークスペース3に展開」といった挙動も実現できる。

1assign [class="discord"] workspace 3
2assign [class="Slack"] workspace 3

システムの再起動と終了

その気になればシステムの再起動などもショートカットで行える。下記の設定では$mod+Shift+eを押して、そこからさらに追加のキーを加えないと発動しない仕組みだが、これにはあえて迂遠なキーバインドを採用することで誤爆を避ける意図がある。

1bindsym $mod+Shift+e mode "SHUTDOWN SEQUENCE"
2mode "SHUTDOWN SEQUENCE"{
3    bindsym p exec "systemctl poweroff"
4    bindsym r exec "systemctl reboot"
5    bindsym Return mode "default"
6    bindsym Escape mode "default"
7    bindsym $mod+Shift+e mode "default"
8}

対して、設定しておくと便利なのがi3wmの設定再読込みと再起動だ。特に構築中はこのショートカットがあると非常に捗る。

1# 設定再読込み
2bindsym $mod+Shift+c reload
3
4# 再起動
5bindsym $mod+Shift+r restart

カラー定義

i3wmは外観の色合いも定義できる。当然ながら下記の設定例も僕のものだが、モロ被りすると照れくさいので一度試したら別のにしてほしい。

 1# i3wm全体の色
 2set $bg           #1C1E27
 3set $fg           #CACACC
 4set $darkred      #D95882
 5set $red          #E4436F
 6set $darkgreen    #68DDC4
 7set $green        #24E39D
 8set $darkyellow   #E8AEAA
 9set $yellow       #EDA685
10set $darkblue     #64A4BF
11set $blue         #2095B4
12set $darkmagenta  #B382CF
13set $darkcyan     #54AEB8
14set $cyan         #00A5AF
15set $darkwhite    #CACACC
16set $white        #CACACA
17set $darkgrey     #6C6F93
18
19# フォーカスカラー
20# class                     border      background      text        indicator       child_border
21client.focused              $bg         $darkgrey       $fg         $yellow         $darkyellow
22client.unfocused            $bg         $bg             $fg         $yellow         $bg

その他の設定

マウスカーソルの移動でウインドウがフォーカスされるとたいへん鬱陶しいので無効にする。

1focus_follows_mouse no

ウインドウの枠の太さや隙間の広さも自由に決められる。どうでもいい設定と見せかけて意外に奥が深い。

1# ウインドウの枠の太さ
2for_window [class="^.*"] border pixel 2
3
4# ウインドウ間の隙間の広さ
5gaps top 6
6gaps bottom 6
7gaps right 6
8gaps left 6
9gaps inner 6

Rofiの導入

すべてのアプリケーションをショートカットで呼ぶのは逆に非効率なのでランチャを併用する。Rofiはタイル型ウインドウマネージャの界隈ではデファクトスタンダード的なランチャとされている。rofiパッケージを導入した後、i3wmの設定ファイルに起動ショートカットを書き加える。

1bindsym $mod+z exec --no-startup-id "rofi -show drun"
2bindsym $mod+x exec --no-startup-id "rofi -show run"

drunはアプリケーションの起動に適したモードで、runはLinuxコマンド全体に対応している。この二つと全モードが融合合体したcombiモードも備わっている。細かい調整を好まないのであればUlauncherを使う手もある。

Dunstの導入

Dunstはi3wmにおいて通知を取り仕切る軽量なデーモンとして機能する。KDEやGnomeと異なり自前の通知システムを持たないタイル型ウインドウマネージャでは必要不可欠と言える。dunstパッケージを導入した後、自動起動を設定する。

1exec --no-startup-id dunst

より平易な選択肢としてxfce4-notifydも挙げられる。i3wmの環境に慣れるまではこちらを使っても問題はない。

Picomの導入

Picomは様々なグラフィック描写をi3wm環境下で適切に処理してくれる。ウインドウの透過や影の投影に用いられるとの説明が一般的だが、実は動画再生にも影響するため導入は必須である。picomパッケージを導入した後、例によって自動起動を設定する。

1exec --no-startup-id "picom -b"

動画再生やアニメーションに不審なちらつきが認められる場合は~/.config/picom.confbackend = "xrender";backend = "glx";に書き換えると解消される。

bumblebee-statusの導入

最後にステータスバーを導入する。タイル型ウインドウマネージャの文化ではここに通知領域やワークスペースボタン、現在時刻、ネットワーク情報などを設けることが模範とされる。ステータスバーにはi3blocksや新進気鋭のi3status-rustをはじめとする多種多様なパッケージが存在するが、本エントリでは僕が愛用しているbumblebee-statusを例にとる。

 1# ステータスバーの色
 2set $background #2B303B
 3set $foreground #C0C5CE
 4set $lightred #BF616A
 5set $lightgreen #A3BE8C
 6set $lightyellow #EBCB8B
 7set $lightblue #8FA1B3
 8set $lightmagenta #B48EAD
 9set $lightcyan #96B5B4
10set $lightwhite #C0C5CE
11set $pink #FFB6C1
12set $orange #F08080
13
14# ステータスバー関連
15bar {
16    font pango:UDEV Gothic 35 11
17    mode dock
18    position top
19    workspace_buttons yes
20    strip_workspace_numbers yes
21    binding_mode_indicator yes
22    tray_padding 2
23    colors {
24        background $background
25        focused_background $background
26        statusline $lightred
27        focused_statusline $lightred
28        # 左からborder, bg, fg
29        focused_workspace  $orange $orange $background
30        active_workspace $background $background $foreground
31        inactive_workspace $background $background $foreground
32        urgent_workspace   $green $green $background
33        binding_mode       $green $green $background
34    }
35    status_command /usr/bin/bumblebee-status -m playerctl pasink pasource datetime battery \
36    -p playerctl.hide="true" playerctl.format="{{artist}} - {{title}}" playerctl.layout="playerctl.song" datetime.format="%m/%d %H:%M" -t monotone
37}

ステータスバーの外観はタイル型ウインドウマネージャの顔と言っても過言ではない。もし読者諸君らがi3wmのunixpornに惹かれて導入を決意したのであれば、いよいよついにセンスの見せどころかもしれない。bumblebee-statusの詳細設定は公式ドキュメントがとても参考になる。

なお、設定末尾のテーマmonotoneは僕の自作ゆえ、このページを読んで他の種類に変更されたし。そのままコピペするとエラーを吐く。

おわりに

以上でクイックスタートアップガイドは終了となる。以降は実際にi3wmを試して構築を楽しんでもらいたい。本エントリの趣旨上、個別の設定項目についてはArchWikiに後を譲る。なにはともあれ、これで諸君らもあらゆる操作をキーボードで完結させたがる異常者集団の仲間入りだ。

©2011 Rikuoh Tsujitani | Fediverse | Bluesky | Keyoxide | RSS | 小説