本エントリはタイル型ウインドウマネージャの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.conf
のbackend = "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に後を譲る。なにはともあれ、これで諸君らもあらゆる操作をキーボードで完結させたがる異常者集団の仲間入りだ。