i3wmをubuntuで導入し、いい感じにする

これはRICORA言語班 Advent Calendarの18日目の記事です。新入生相手におままごとをしていたら完全に書くのを忘れていたので、適当なことを書きます。すみません。

背景

windows10をサクサク動かせないPCを普段使いするためにはどうすればいいのだろうか?という問題が与えられたとき、大体ubuntuとかlinux mintみたいな軽量ディストロがおすすめされると思うのですが、あえてウィンドウマネージャーの方から攻めてみたいと思ったので書きます。

導入とか

dotfileとかどうせ上げてるんだろ? → はい。これです。見たければ見てもいいよ。

i3はフリーソースのタイル型ウィンドウマネージャです。 タイル型ウィンドウマネージャは、画面上のアプリケーションを画面を埋めるように配置します。

個人的に感じるi3のメリットは、カーソルを動かす必要がない(=キーボード上で操作が完結する)ことと、バッテリーの持ちが非常に良くなることです。 もちろんacpiで充電の上限は設けていますが、大体70%充電しておけば6時間程度は使えるはずです。 さらに、fehなどを用いることで背景を設定することもでき、i3bari3statusを調整することで、天気やバッテリー情報などを常時表示することもできます。

導入方法

i3は文献があまりになさすぎるので、いつものarch wikiに全面的に頼ることになります。 私も全面的に頼りました。

archで入れているわけではないので、ubuntuを使いつつ入れる方法を説明します。

公式でおすすめされているのは、配布されているtarballを用いる方法ですが、aptでも拾ってこれます。

sudo apt install i3 i3-wm

このくらいで十分だった気がする。 足りなくなったら都度足してください。

i3をインストールすると、ログイン画面の右下に歯車マークが出て、ログイン後のウィンドウマネージャが選べるようになります。 これでi3を選択してログインすれば、無事にインストール完了です。

操作

i3はまあまあ独特な動きをします(vimよりは習得コストが低いかもしれない)。 キーマップの完全版はDefault Keybindingsを参照してください。

i3を使う際にはmodと呼ばれる特殊キーを設定する必要があります。 私はaltキーに設定して使っていますが、このmodキーと何らかのキーを同時に押すことで画面の操作を行います。

例えば、mod + 1なら1番目のウィンドウに移動します。 また、mod + shift + 1なら現在のウィンドウを1番目のウィンドウに移動させます。 意味がわかりませんね。手を動かさないと理解できないので自分で頑張ってi3を使ってみてください。

i3

i3の設定ファイルは、ルート直下の.config/i3/configになります。 デフォルトでは生成されていなかったと思うので、そのようなファイルを新しく作って設定してあげると勝手にファイルを見に行ってくれます。 確か開発レポジトリをクローンしてきてブランチをcheckoutするとデフォの設定が入っているconfigがあるはずです。 おそらく初見で利用する際にはそれをコピー・コピーアンドペーストするといいと思います。

私が追記している設定は確かこんな感じです。

画面閉じたらスリープさせる(だった気がする)
exec --no-startup-id xss-lock --transfer-sleep-lock -- i3lock --nofork

日本語入力用のibusを裏で起動
exec --no-startup-id ibus-daemon -x -d -r

背景の起動
exec --no-startup-id ~/.fehbg

明るさ
exec --no-startup-id compton -cbm 0.6

通知マネージャのDunstをきちんと動かしたかった...
exec --no-startup-id dunst -print -config "/home/n/.config/dunst/dunstrc"

音量の上げ下げ
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status

ミュート
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status
bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status

音量調整
bindsym XF86MonBrightnessUp exec --no-startup-id brightnessctl set +10%
bindsym XF86MonBrightnessDown exec --no-startup-id brightnessctl set 10%-

音量調整はだるいというかリファレンスがなくてstack overflowとかに頼りまくりですが多分これで動くはず。

i3bar

大抵のOSは(勝手、あるいは不親切もしくは手を回しすぎているので)上か下に何らかの情報を表示するバーみたいなのがあります。 i3のバーはデフォルトではクソダサなのでどうにかこうにか整えていきましょう。

(username)/.config/i3/configの一番下にバーという項目があります。 いろんな設定ができるので、適当に参照して動かしてください。 この設定の中で割と参照される設定はfontcolorspositionとかだと思います。

  • fontはまあフォントなんですが、実は記号っぽい(例:バッテリーとか)を付け加えるフォントが存在し、それを利用するとメモリマークなどを表示させることができます。詳しくはAwesome Fontで調べてみてください。
  • colorsは色ですが、RGB16進表示で色変できます。よかったですね。
  • positionは確かtopとbottomしかないのですが、位置は変えられます。よかったですね2。

いや肝心の表示するものは!?という話ですが、この設定は(username)/.config/i3status/configで行います。 このファイルもデフォルトでは存在しないので、作ってくださいね。

i3statusの設定によってバーに表示されるものの指定を行うことができます。 私のstatusにはこんな感じのものが表示されているらしいです。

order += "read_file spotify"
order += "read_file weather"
order += "cpu_usage"
order += "memory"
order += "battery all"
order += "tztime local"
order += "wireless _first_"
order += "volume master"

read_file以外はそれぞれの機器の現在の状況を読み取って表示してくれます。あとは詳細を読んでね。

read_fileはファイルを読んで表示してくれる感じのやつです。 上のspotify、weatherはそれぞれspotifyとwttr.inから情報を拾ってきて表示するスクリプ卜のログを読んでいます。wttr.inはたまに止まってバグってわろてる。

まあこんな感じでカスタマイズできます。

スクリプトについて

スクリプトっていってもどういうスクリプトやねん。 はい。

#/usr/bin/bash

WEATHER_LOG="/home/$(whoami)/.cache/weather/weather.log"

echo "Tsukuba " > $WEATHER_LOG
curl wttr.in/Tsukuba?format=1 | tr -d '\n ' >> $WEATHER_LOG 
echo " / Unga " >> $WEATHER_LOG
curl wttr.in/Unga.Station?format=1 | tr -d '\n ' >> $WEATHER_LOG

こんなん。大学が運河にあり、家がつくばにあるのでcurlしてそれを表示しています。 cronで15分ごとに更新される手筈だが、wttr.inの天気の更新が遅いのでもはや参考情報にしかならないので観葉植物みたいなもん。spotifyのも同じ感じで、これもspofityを動かしてないといけないので観葉植物もどき。

あとディスプレイの照度調整をするスクリプトを書かないと照度調整ができなかった(カス!)ので、それも書いた。

CURRENT_VAL=$(cat /sys/class/backlight/intel_backlight/actual_brightness)
MAX_VAL=$(cat /sys/class/backlight/intel_backlight/max_brightness)

if [ $1 = '-' ]; then
  echo $(expr $CURRENT_VAL - $(expr $MAX_VAL / 20)) > /sys/class/backlight/intel_backlight/brightness
elif [ $1 = '+' ]; then
  echo $(expr $CURRENT_VAL + $(expr $MAX_VAL / 20)) > /sys/class/backlight/intel_backlight/brightness
fi

/sys/class/backlight/intel_backlight/brightnessを読み書きすることで明るさ調整をしているらしいので、入力によってプラスしたりマイナスしたりした値を返すようにしています。なぜこれが組み込まれていないか謎。

ファイル管理について

dotfileというレポを作って、init.shで初期設定を勝手にできるようにしています。というか.vimrcと.bashrcもあるので、それはrootにおいて、それ以外は.configを作成してそれに突っ込んでる。ubuntuでしか動かんが、ワシはそれでいいのでそれでいい。

結論

i3を使いたい気持ちになりましたか?早くwindowsかOS Xをディスクから完全に消し去り、i3と心中しましょう。おわり。