i3 window manager Tips

タイル型 window managerの一つであるi3wmに関するメモ。 タイル型WMは基本的にウィンドウを重ねず表示するため、配置を気にしなくて良いのが利点。 その中でもi3wmはある程度マウス操作もでき、フロートモードもあるためストイック過ぎず、使いやすいと思う。

インストール

(TBE)

クイックスタート

公式にショートカットキーのリファレンスカードがある。
ユーザーガイド

i3 config

キーバインド等の細かな挙動をカスタマイズできる。
~/.config/i3/configに設定ファイルがある。一般的な設定が初回起動時のダイアログで自動生成される。

マウスによる操作設定

参考

# マウスオーバーでフォーカスさせない
focus_follows_mouse no

# タイトルバー中クリックでウィンドウを閉じる
bindsym --release button2 kill
# Mod+ウィンドウ中クリックでウィンドウを閉じる
bindsym --whole-window $mod+button2 kill
# タイトルバー右クリックでフロート切り替え
bindsym button3 floating toggle

壁紙

fehで表示するのが良い exec

# 単独表示
exec --no-startup-id "feh --bg-fill ~/PATH/TO/PICTURE.png"
# --bg-fill はみ出して拡大, --bg-max はみ出さず拡大, --bg-scale 縦横比を変えて拡大,
# --bg-tile タイル表示, --bg-center 中央に表示
# 起動するたびランダム表示
# alwaysにするとMod+shift+rでリセットするたび変更できる
exec_always --no-startup-id "feh --bg-fill --randomize --recursive ~/PATH/TO/PICTURES/"

ハードウェア電源ボタンの挙動

ハードウェアの電源ボタンの挙動はi3wmでなくsystemdが管轄している。
挙動を変えるには/etc/systemd/logind.confを編集する。

[Login]
#...
#HandlePowerKey=poweroff
#HandleSuspendKey=suspend
#HandleHibernateKey=hibernate
#HandleLidSwitch=suspend
#HandleLidSwitchDocked=ignore
#...

となっている部分を HandlePowerKey=ignore などすると無効化できる。 HandleLidSwitch でラップトップの蓋を閉じたときの挙動も変更できる。 変更を反映させるには再起動するか、 sudo systemctl restart systemd-logind をコマンドする。

参考

トラックパッド切り替え

ラップトップのトラックパッド切り替えボタンを有効化する。 まず次のbashファイルを作っておく。

#!/bin/bash
declare -a STATES=(1 0)
DEVICE=$(xinput list --name-only | grep -i TouchPad)
STATE=$(xinput list-props "$DEVICE" | grep 'Device Enabled' | sed 's/^.*:[ \t]*//')
xinput set-prop "$DEVICE" 'Device Enabled' ${STATES[$STATE]}

chmod +x touch_toogle.sh で実行権を付与。 パスの通った /usr/local/bin/ などに置いておくと便利。 これをi3configでキーバインドする。

# toogle touchpad
bindsym XF86TouchpadToogle exec touch_toogle.sh

(上手く動作しない?)
参考

画面調整

マルチモニタ

xrandrなどで直接Xを設定する。arandrを使えばGUIで設定できる。
sudo apt install arandr

DPI調整

基本は勝手に調整しているが、手動でしたい場合は xrandr --dpi 96 で設定できる。 設定はi3wmをリスタートすると反映される。
HiDPI - ArchWiki

シャットダウン

デフォルトだと i3wm からはログアウトしかできないので不便。 なので $mod+Shift+e に次をバインドする。 system mode に入ることでキー操作だけでシャットダウン等ができる。

bindsym $mod+Shift+e mode "$mode_system"
set $Locker "i3lock -i ~/Pictures/i3lock.png && sleep 1"
set $mode_system System (l) lock, (s) suspend, (h) hibernate, (Shift+e) logout, (Shift+r) reboot, (Shift+s) shutdown
mode "$mode_system" {
	bindsym l exec --no-startup-id $Locker, mode "default"
	bindsym s exec --no-startup-id "systemctl suspend", mode "default"
	bindsym h exec --no-startup-id "systemctl hibernate", mode "default"
	bindsym Shift+e exec --no-startup-id i3-msg exit, mode "default"
	bindsym Shift+r exec --no-startup-id "systemctl reboot", mode "default"
	bindsym Shift+s exec --no-startup-id "systemctl poweroff -i", mode "default"

	# back to normal: Enter or Escape
	bindsym Return mode "default"
	bindsym Escape mode "default"
}

その他

no_focus for_window

# 新規ウィンドウにフォーカスしない
# (ブラクラ的なやつで操作不能になるのを防ぐ)
no_focus [window_role=".*"]

# アプリケーションごとのウィンドウ設定
# xpropで調べて
# >WM_CLASS(STRING) = "nemo", "Nemo"
# と出てくる内の後者"Nemo"をclassに指定する
for_window [class="Nemo"] floating enable
# 前者はinstanceで指定しても良い
for_window [class="Gnome-terminal" instance="gnome-terminal-server"] floating enable

dmenu

mod+d で出てくるアプリケーションランチャー。 パスの通ったコマンドが実行できる。

i3-dmenu-desktop

デフォルトではコメントアウトされてる代替のランチャー。 dmenu と同じ見た目だが、 Lens とかと同じく /usr/share/applications/ あたりにある desktop ファイルを参照する。 こっちのほうが便利なことも多い。

rofi

dmenu だと文字が小さくて読みづらい!、と思ったらいい感じの代替ランチャーソフトがあった。 画面中央に出してくれるので見やすい。 また、ウィンドウセレクターの役割も果たす。

# dmenu
bindsym $mod+d exec --no-startup-id dmenu_run
# i3-dmenu-desktop
bindsym $mod+d exec --no-startup-id i3-dmenu-desktop
# rofi (Ctrl+Tab でコマンドとアプリケーションの候補を切り替え)
bindsym $mod+d exec --no-startup-id "rofi -modi 'run,drun' -show run"
# rofi as windows-changer
bindsym Mod1+Tab exec --no-startup-id "rofi -show window"

i3-msg

基本的にはキー操作によって予めconfigに記載されたコマンドをi3に送って操るわけだが、端末から直接コマンドを送ることもできる。
例えば i3-msg workspace 10 とすれば"workspace 10"のコマンドがi3に送られてworkspaceが切り替わる。

i3-nagbar

$mod+e で出てくるようなメッセージバーを表示させているプログラム。

i3status

i3wm右下にあるステータスバー。設定ファイルは~/.config/i3status/configなど
ユーザーマニュアル
デフォルトでは/etc/i3status.confにある設定ファイルを読み込んでいるはず。
設定をカスタマイズするならこれを元にして~/.config/i3status/configにコピーすると良い。
options

表示位置

デフォルトで status bar の位置は下だが、上にもできる。 i3 の config で以下の部分を追記する。

bar {
	position top
	status_command i3statu
	#status_command "py3status -c ~/.config/py3status/config"
	tray_output primary
}

ネットワークモジュール

order += "module"で各モジュールを追加していく。
各モジュールの設定はmodele {...}の形で行う。
formatと名前の付いた属性が大体表示する内容なので、この辺を変えれば日本語にローカライズもできる。
wireless

# Wi-Fiモジュール設定例
wireless _first_ {
	format_up = "無線: 接続済み(%quality at %essid) %ip"
	format_down = "無線: 接続なし"
}
# Ethernetモジュール設定例
ethernet _first_ {
	format_up = "有線: %ip (%speed)"
	format_down = "有線: 接続なし"
}

バッテリーモジュール

"battery all"の方を使えばバッテリーが複数ある場合も合算になる。 (合わせて"order += battery all"にしないといけない。)
デフォルトでは/sys/class/power_supply/BAT#/ueventから情報を取得しているが、 /sys/class/power_supply/CMB#/ueventにバッテリー情報がある場合には"No Battery"と表示されてしまう。
その場合にはpath属性にこのパスを指定してやれば良い。
battery

# バッテリーモジュール設定例
battery all {
	format = "%status %percentage %remaining"
	status_bat = "バッテリー"
	status_chr = "充電中"
	status_full = "充電済"
	status_unk = "不明"
	integer_battery_capacity = true
	hide_seconds = true
#	path = "/sys/class/power_supply/CMB1/uevent"
}

py3status

i3statusの拡張版
ドキュメンテーション
aptレポジトリにあるので手動でインストールする。(18.04)
sudo apt install py3status

i3で使うにはi3の設定ファイルで
status_command i3status
となっている箇所を次に置き換える。
status_command py3status -c /PATH/TO/CONFIG
設定ファイルはi3statusと互換性があるが、逆はないので~/.config/py3status/configなどにi3statusのconfigをコピーするのが良い。
ref

on_click属性

py3statusでは利用できるモジュールが増え、クリックイベントを拾うこともできるようになる。
例としてdiskモジュールをクリックするとnautilusを開くようにする。
on_click

disk "/" {
	format = "%avail"
	on_click 1 = "exec nautilus --no-desktop ~/"
#	on_click 1 = "exec nemo --no-desktop ~/"
}

static_stringモジュール

文字列を表示するだけのモジュール
on_clickと合わせればアプリケーショランチャーにもできる。

# 例
# orderに追加
order += "static_string test"
# format属性で表示内容を指定
static_string test {
	format = "Hello, py3status!"
}
# 例:ファイルランチャー
#order += "frame my_launcher"
frame my_launcher {
	format = '{output} {button}'
	format_separator = ' '
	static_string entry1 {
		format = "🦊Firefox"
		on_click 1 = "exec firefox"
	}
	static_string entry2 {
		format = "🐚Nemo"
		on_click 1 = "exec nemo --no-desktop ~/"
	}
}

トップ