riq0h.jp/content/post/i3wmクイックスタートアップガイド.md
2023-08-21 10:07:01 +09:00

386 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: "i3wmクイックスタートアップガイド"
date: 2023-02-25T21:17:17+09:00
draft: false
tags: ['tech']
---
![](/img/184.png)
本エントリはタイル型ウインドウマネージャのi3wmを可及的速やかに動作させるためのテキストである。以下の条件に当てはまるユーザを想定読者層とする。
・Linuxの基本的な操作方法を理解している。
・`i3-wm`パッケージの導入が完了している。
・Arch Linuxかそれに類するディストリビューションを使用している。
Arch Linuxの導入については[この記事](https://riq0h.jp/2022/05/18/094517/)を、i3wm設定後のトラブルシューティングについては[この記事](https://riq0h.jp/2021/04/10/091649/)をそれぞれ参考にされたし。なお、本エントリではSwayとWaylandに関する説明は行わない。
## 初期設定
通常、i3wmを導入した状態で初回起動を行うとウェルカムメッセージと共にmodキーの設定を促される。modキーを決めると`~/.config/i3/`に`config`ファイルが生成され、原則的にはこれを基に設定ファイルを構築する形となる。**しかし、本エントリではこの手順は踏まず、i3wm移行前にあらかじめ設定ファイルを作っておく。** すなわち、`~/.config/i3`フォルダと`config`ファイル(ドットや拡張子は付かない)を手動で作成する。
というのも、ろくに整備されていない環境に放り込まれた状態では情報収集や編集作業に翳りが生じる恐れが否めないからだ。実際、本当になにも設定していないとブラウザの起動さえおぼつかない。したがって、繰り返すが前もって設定ファイルを構築することを強く勧めたい。
## アプリケーションの起動と終了
さっそく`config`ファイルに設定を列挙していく。まず記すべきは前述したmodキーである。modキーとはi3wmにおいてショートカットの始動を司るキーで、`$mod+e`のような形式でキーバインドを定義する際に用いる。デフォルトでは`Mod1`Altキーが採用されているが、Altキーは他のアプリケーションと衝突しやすいので、`Mod4`Windowsキー、Commandキーの方が好ましい。
```bash
set $mod Mod4
```
続いてアプリケーションやコマンドの起動ショートカットを決める。おそらくもっとも書く機会が多い構文だと思われる。一例としてターミナルアプリケーションの例を挙げる。
```bash
bindsym $mod+Return exec --no-startup-id alacritty
```
このショートカットの構文は`bindsym`から始まり、次に任意のキーバインド、アプリケーションやコマンドの起動では`exec --no-startup-id`が加わり、末尾でアプリケーションを指定する。さしあたりターミナル、ブラウザ、ファイラを設定して残りは移行後でも構わない。指定に必要なクラス名は`xprop | grep WM_CLASS`で求められる。実行後、アプリケーションにマウスカーソルを重ねるとターミナル上にクラス名が表示される。
反対に、アプリケーションを終了するショートカットは以下の通りに定める。これでひとまずアプリケーションの起動と終了が行えるようになった。
```bash
bindsym $mod+q kill
```
## 自動起動
システムの起動時にアプリケーションを自動で起動させたい場合は、キーバインドなしで`exec`オプションを書いて直に指定する。コマンドやスクリプトを実行させることもできる。たとえば`feh`は本来は画像ビューアだが、ここでは壁紙を表示させる役割を与えている。
```bash
exec --no-startup-id vivaldi-stable
exec --no-startup-id "feh --no-fehbg --bg-scale ~/Wallpaper.png"
exec --no-startup-id "xset r rate 200 30"
exec --no-startup-id fcitx5
```
## ショートカットの拡張
ショートカットを設定していくと次第に候補となるキーバインドが足りなくなってくる。そこで、ショートカットを二段構えにして実質的にキーバインドを増やす手法が役に立つ。
```bash
bindsym $mod+c mode "CMD"
mode "CMD"{
bindsym v exec vivaldi-stable; mode "default"
bindsym f exec "flameshot gui" mode "default"
bindsym Return mode "default"
bindsym Escape mode "default"
bindsym $mod+c mode "default"
}
```
上記の例では`$mod+c`で一旦"CMD"モードに入り(この名称は自由に決められる)そこから追加のキーを押してアプリケーションが起動する構成になっている。`$mod+c`だけでは一つのショートカットしか設定できないが、このように工夫すると`$mod+c`の配下に複数のショートカットを定義できる。
注意点はショートカットをモード化した際に、そのモードを解除する挙動を定義しておかないといつまでもモード化が維持されてしまうところだ。そうすると他のショートカットを受けつけなくなるため、上記の例にしたがってアプリケーションの起動直後か、任意のキーバインドで通常モードに戻る設定`mode "default"`を書き加えておかなければならない。
## ウインドウの操作
i3wmはタイル型ウインドウマネージャであるからにして、ウインドウの操作もショートカットで完結させることが前提となる。手始めにウインドウフォーカスの設定例を記す。本項ではVimライクなキーバインドと矢印キーを使うものの二通りを紹介する。
```bash
# ウインドウフォーカス
bindsym $mod+h focus left
bindsym $mod+j focus down
bindsym $mod+k focus up
bindsym $mod+l focus right
# 代替ウインドウフォーカス
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right
```
次にウインドウの交換ショートカットを設定する。並んでいるウインドウの位置を入れ替えたい時に用いる。
```bash
# ウインドウ交換
bindsym $mod+Shift+h move left
bindsym $mod+Shift+j move down
bindsym $mod+Shift+k move up
bindsym $mod+Shift+l move right
# 代替ウインドウ交換
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right
```
続いて、ウインドウの分割ショートカットを設定する。ウインドウはもっぱら垂直に展開されるが、下記に倣って`$mod+s`を発動してからアプリケーションを起動すると水平に展開されるようになる。垂直での起動に戻すには`$mod+v`を押す。すでに展開済みのウインドウを水平または垂直に変更したい場合は`layout`オプションで`toggle split`を定義する。
```bash
# 水平ウインドウ分割
bindsym $mod+s split v
# 垂直ウインドウ分割
bindsym $mod+v split h
# ウインドウの分割切り替え
bindsym $mod+e layout toggle split
```
フルスクリーン表示も可能。`toggle`オプションを用いると同一のキーバインドで有効と無効を切り替えられる。
```bash
bindsym $mod+f fullscreen toggle
```
タイル型ウインドウマネージャはその名の通り、あたかもタイルのごとくウインドウを敷き詰める使い方が基本ではあるものの、一般のデスクトップ環境と同じくフローティングさせることもできる。ただし、前述のウインドウフォーカスはフロートウインドウに対しては効かないため、専用の設定を定義しておかなければならない。
```bash
# ウインドウフロート
bindsym $mod+w floating toggle
# フロートウインドウフォーカス
bindsym $mod+space focus mode_toggle
```
同様に、フロートウインドウを動かすキーバインドも個別に設定する。i3wmの仕様上、たとえフロートウインドウであってもマウスのドラッグ単体で動いてくれるとは限らない。
```bash
floating_modifier $mod
```
フロートウインドウの応用例として、特定のアプリケーションを必ずフロート起動させる設定が挙げられる。とりわけファイラや動画プレイヤーはフローティングのモチベが高い。`resize`オプションを定義しないと最大表示で展開してしまうので、こだわりがなくとも適当なウインドウサイズを指定した方がよい。
```bash
for_window [class="Thunar"] floating enable, resize set 1024 780
```
最後にウインドウのリサイズを行うショートカットを記す。僕はモード化して仕立てている。
```bash
bindsym $mod+r mode "RESIZE"
mode "RESIZE" {
bindsym h resize shrink width 10 px or 5 ppt
bindsym j resize grow height 10 px or 5 ppt
bindsym k resize shrink height 10 px or 5 ppt
bindsym l resize grow width 10 px or 5 ppt
# 代替
bindsym Left resize shrink width 10 px or 5 ppt
bindsym Down resize grow height 10 px or 5 ppt
bindsym Up resize shrink height 10 px or 5 ppt
bindsym Right resize grow width 10 px or 5 ppt
# 通常モード遷移
bindsym Return mode "default"
bindsym Escape mode "default"
bindsym $mod+r mode "default"
}
```
## ワークスペースの設定
デスクトップ環境では「仮想デスクトップ」と呼称される機能をi3wmでは「ワークスペース」と呼ぶ。ウインドウを一面に敷き詰める文化は極めて効率に優れる一方で、なにかとすぐに余白が不足する。かつては無縁だったユーザもi3wmではワークスペースの助けなくしては生きられないだろう。
まずはワークスペースの変数を定義する。僕は1から始める数字派だが0から始める人もいる。数字ではなく記号派の人もけっこう多い。
```bash
set $ws1 "1"
set $ws2 "2"
set $ws3 "3"
set $ws4 "4"
set $ws5 "5"
set $ws6 "6"
set $ws7 "7"
set $ws8 "8"
set $ws9 "9"
set $ws10 "10"
```
次にワークスペース間を移動するショートカットを設定する。数字と対応させるのが無難オブ無難だが、ワークスペースが増えるほどmodキーから離れた位置にならざるをえない欠点もある。
```bash
bindsym $mod+1 workspace $ws1
bindsym $mod+2 workspace $ws2
bindsym $mod+3 workspace $ws3
bindsym $mod+4 workspace $ws4
bindsym $mod+5 workspace $ws5
bindsym $mod+6 workspace $ws6
bindsym $mod+7 workspace $ws7
bindsym $mod+8 workspace $ws8
bindsym $mod+9 workspace $ws9
bindsym $mod+0 workspace $ws10
```
使用頻度は人によるが、ウインドウを別のワークスペースに移動させるショートカットも設定しておく。一連のキーバインドには数字キーをすべて割り振っているが、もし他に使うあてがあれば適宜削っても差し支えはない。僕も本当に使用しているワークスペースの数はせいぜい5個くらいしかない。
```bash
bindsym $mod+Shift+1 move container to workspace $ws1
bindsym $mod+Shift+2 move container to workspace $ws2
bindsym $mod+Shift+3 move container to workspace $ws3
bindsym $mod+Shift+4 move container to workspace $ws4
bindsym $mod+Shift+5 move container to workspace $ws5
bindsym $mod+Shift+6 move container to workspace $ws6
bindsym $mod+Shift+7 move container to workspace $ws7
bindsym $mod+Shift+8 move container to workspace $ws8
bindsym $mod+Shift+9 move container to workspace $ws9
bindsym $mod+Shift+0 move container to workspace $ws10
```
特定のアプリケーションを指定したワークスペースでのみ起動させる設定も存在する。ワークスペース単位で用途を決めている人には欠かせない。前述の自動起動と併せて列挙すれば「システム起動時にSlackをワークスペース3に展開」といった挙動も実現できる。
```bash
assign [class="discord"] workspace 3
assign [class="Slack"] workspace 3
```
## システムの再起動と終了
その気になればシステムの再起動などもショートカットで行える。下記の設定では`$mod+Shift+e`を押して、そこからさらに追加のキーを加えないと発動しない仕組みだが、これにはあえて迂遠なキーバインドを採用することで誤爆を避ける意図がある。
```bash
bindsym $mod+Shift+e mode "SHUTDOWN SEQUENCE"
mode "SHUTDOWN SEQUENCE"{
bindsym p exec "systemctl poweroff"
bindsym r exec "systemctl reboot"
bindsym Return mode "default"
bindsym Escape mode "default"
bindsym $mod+Shift+e mode "default"
}
```
対して、設定しておくと便利なのがi3wmの設定再読込みと再起動だ。特に構築中はこのショートカットがあると非常に捗る。
```bash
# 設定再読込み
bindsym $mod+Shift+c reload
# 再起動
bindsym $mod+Shift+r restart
```
## カラー定義
i3wmは外観の色合いも定義できる。当然ながら下記の設定例も僕のものだが、モロ被りすると照れくさいので一度試したら別のにしてほしい。
```bash
# i3wm全体の色
set $bg #1C1E27
set $fg #CACACC
set $darkred #D95882
set $red #E4436F
set $darkgreen #68DDC4
set $green #24E39D
set $darkyellow #E8AEAA
set $yellow #EDA685
set $darkblue #64A4BF
set $blue #2095B4
set $darkmagenta #B382CF
set $darkcyan #54AEB8
set $cyan #00A5AF
set $darkwhite #CACACC
set $white #CACACA
set $darkgrey #6C6F93
# フォーカスカラー
# class border background text indicator child_border
client.focused $bg $darkgrey $fg $yellow $darkyellow
client.unfocused $bg $bg $fg $yellow $bg
```
## その他の設定
マウスカーソルの移動でウインドウがフォーカスされるとたいへん鬱陶しいので無効にする。
```bash
focus_follows_mouse no
```
ウインドウの枠の太さや隙間の広さも自由に決められる。どうでもいい設定と見せかけて意外に奥が深い。
```bash
# ウインドウの枠の太さ
for_window [class="^.*"] border pixel 2
# ウインドウ間の隙間の広さ
gaps top 6
gaps bottom 6
gaps right 6
gaps left 6
gaps inner 6
```
## Rofiの導入
すべてのアプリケーションをショートカットで呼ぶのは逆に非効率なのでランチャを併用する。Rofiはタイル型ウインドウマネージャの界隈ではデファクトスタンダード的なランチャとされている。`rofi`パッケージを導入した後、i3wmの設定ファイルに起動ショートカットを書き加える。
```bash
bindsym $mod+z exec --no-startup-id "rofi -show drun"
bindsym $mod+x exec --no-startup-id "rofi -show run"
```
`drun`はアプリケーションの起動に適したモードで、`run`はLinuxコマンド全体に対応している。この二つと全モードが融合合体した`combi`モードも備わっている。細かい調整を好まないのであれば[Ulauncher](https://ulauncher.io)を使う手もある。
## Dunstの導入
Dunstはi3wmにおいて通知を取り仕切る軽量なデーモンとして機能する。KDEやGnomeと異なり自前の通知システムを持たないタイル型ウインドウマネージャでは必要不可欠と言える。`dunst`パッケージを導入した後、自動起動を設定する。
```bash
exec --no-startup-id dunst
```
より平易な選択肢として`xfce4-notifyd`も挙げられる。i3wmの環境に慣れるまではこちらを使っても問題はない。
## Picomの導入
Picomは様々なグラフィック描写をi3wm環境下で適切に処理してくれる。ウインドウの透過や影の投影に用いられるとの説明が一般的だが、実は動画再生にも影響するため導入は必須である。`picom`パッケージを導入した後、例によって自動起動を設定する。
```bash
exec --no-startup-id "picom -b"
```
動画再生やアニメーションに不審なちらつきが認められる場合は`~/.config/picom.conf`の`backend = "xrender";`を`backend = "glx";`に書き換えると解消される。
## bumblebee-statusの導入
最後にステータスバーを導入する。タイル型ウインドウマネージャの文化ではここに通知領域やワークスペースボタン、現在時刻、ネットワーク情報などを設けることが模範とされる。ステータスバーには`i3blocks`や新進気鋭の`i3status-rust`をはじめとする多種多様なパッケージが存在するが、本エントリでは僕が愛用している`bumblebee-status`を例にとる。
```bash
# ステータスバーの色
set $background #2B303B
set $foreground #C0C5CE
set $lightred #BF616A
set $lightgreen #A3BE8C
set $lightyellow #EBCB8B
set $lightblue #8FA1B3
set $lightmagenta #B48EAD
set $lightcyan #96B5B4
set $lightwhite #C0C5CE
set $pink #FFB6C1
set $orange #F08080
# ステータスバー関連
bar {
font pango:UDEV Gothic 35 11
mode dock
position top
workspace_buttons yes
strip_workspace_numbers yes
binding_mode_indicator yes
tray_padding 2
colors {
background $background
focused_background $background
statusline $lightred
focused_statusline $lightred
# 左からborder, bg, fg
focused_workspace $orange $orange $background
active_workspace $background $background $foreground
inactive_workspace $background $background $foreground
urgent_workspace $green $green $background
binding_mode $green $green $background
}
status_command /usr/bin/bumblebee-status -m playerctl pasink pasource datetime battery \
-p playerctl.hide="true" playerctl.format="{{artist}} - {{title}}" playerctl.layout="playerctl.song" datetime.format="%m/%d %H:%M" -t monotone
}
```
ステータスバーの外観はタイル型ウインドウマネージャの顔と言っても過言ではない。もし読者諸君らがi3wmのunixpornに惹かれて導入を決意したのであれば、いよいよついにセンスの見せどころかもしれない。bumblebee-statusの詳細設定は[公式ドキュメント](https://bumblebee-status.readthedocs.io/en/main/index.html)がとても参考になる。
なお、設定末尾のテーマ`monotone`は僕の自作ゆえ、[このページ](https://bumblebee-status.readthedocs.io/en/main/themes.html)を読んで他の種類に変更されたし。そのままコピペするとエラーを吐く。
## おわりに
以上でクイックスタートアップガイドは終了となる。以降は実際にi3wmを試して構築を楽しんでもらいたい。本エントリの趣旨上、個別の設定項目については[ArchWiki](https://wiki.archlinux.jp/index.php/I3)に後を譲る。なにはともあれ、これで諸君らもあらゆる操作をキーボードで完結させたがる異常者集団の仲間入りだ。