🪟
i3wm: おすすめの workspace 移動設定
スクリーン内における、前後のワークスペースに移動
以前私は $mod+番号
で表示中のワークスペースを切り替えていたが、スクリーン内の前後のワークスペースに移動する方法があることを知り、移動効率が上がったため共有
bindsym $mod+Ctrl+h workspace next_on_output
bindsym $mod+Ctrl+l workspace prev_on_output
左右のスクリーンでワークスペース番号を分けて管理する
ゴール
モニターを 2 枚使用しているとき、 $mod+1
で左右のどちらにフォーカスされるか覚えていないときがよくある。しかし、これは操作する上で一定のストレスを感じる。
改善案として、$mod+1
を押したとき
- 現在フォーカスしている workspace が左画面のとき、左画面用ワークスペース1に移動
- 現在フォーカスしている workspace が右画面のとき、右画面用ワークスペース1に移動
のように設定しておくと、
- 1枚のモニターに対して使用できるワークスペース数は必ず9件用意できる
- 意識配分が楽になる
といったメリットがある。
設定
まずは左右モニタの接続名を確認しておく。
$ xrandr
set $ws1 1:left1
set $ws2 2:left2
set $ws3 3:left3
set $ws4 4:left4
set $ws5 5:left5
set $ws6 6:left6
set $ws7 7:left7
set $ws8 8:left8
set $ws9 9:left9
set $ws11 11:right1
set $ws12 12:right2
set $ws13 13:right3
set $ws14 14:right4
set $ws15 15:right5
set $ws16 16:right6
set $ws17 17:right7
set $ws18 18:right8
set $ws19 19:right9
workspace $ws1 output DP-5
workspace $ws2 output DP-5
workspace $ws3 output DP-5
workspace $ws4 output DP-5
workspace $ws5 output DP-5
workspace $ws6 output DP-5
workspace $ws7 output DP-5
workspace $ws8 output DP-5
workspace $ws9 output DP-5
workspace $ws11 output HDMI-0
workspace $ws12 output HDMI-0
workspace $ws13 output HDMI-0
workspace $ws14 output HDMI-0
workspace $ws15 output HDMI-0
workspace $ws16 output HDMI-0
workspace $ws17 output HDMI-0
workspace $ws18 output HDMI-0
workspace $ws19 output HDMI-0
# switch to workspace
bindsym $mod+1 exec --no-startup-id TARGET_NUMBER=1 ~/.i3/switch-workspace.sh
bindsym $mod+2 exec --no-startup-id TARGET_NUMBER=2 ~/.i3/switch-workspace.sh
bindsym $mod+3 exec --no-startup-id TARGET_NUMBER=3 ~/.i3/switch-workspace.sh
bindsym $mod+4 exec --no-startup-id TARGET_NUMBER=4 ~/.i3/switch-workspace.sh
bindsym $mod+5 exec --no-startup-id TARGET_NUMBER=5 ~/.i3/switch-workspace.sh
bindsym $mod+6 exec --no-startup-id TARGET_NUMBER=6 ~/.i3/switch-workspace.sh
bindsym $mod+7 exec --no-startup-id TARGET_NUMBER=7 ~/.i3/switch-workspace.sh
bindsym $mod+8 exec --no-startup-id TARGET_NUMBER=8 ~/.i3/switch-workspace.sh
bindsym $mod+9 exec --no-startup-id TARGET_NUMBER=9 ~/.i3/switch-workspace.sh
# # Move to workspace with focused container
bindsym $mod+Shift+1 exec --no-startup-id TARGET_NUMBER=1 MOVE_CONTAINER=true ~/.i3/switch-workspace.sh
bindsym $mod+Shift+2 exec --no-startup-id TARGET_NUMBER=2 MOVE_CONTAINER=true ~/.i3/switch-workspace.sh
bindsym $mod+Shift+3 exec --no-startup-id TARGET_NUMBER=3 MOVE_CONTAINER=true ~/.i3/switch-workspace.sh
bindsym $mod+Shift+4 exec --no-startup-id TARGET_NUMBER=4 MOVE_CONTAINER=true ~/.i3/switch-workspace.sh
bindsym $mod+Shift+5 exec --no-startup-id TARGET_NUMBER=5 MOVE_CONTAINER=true ~/.i3/switch-workspace.sh
bindsym $mod+Shift+6 exec --no-startup-id TARGET_NUMBER=6 MOVE_CONTAINER=true ~/.i3/switch-workspace.sh
bindsym $mod+Shift+7 exec --no-startup-id TARGET_NUMBER=7 MOVE_CONTAINER=true ~/.i3/switch-workspace.sh
bindsym $mod+Shift+8 exec --no-startup-id TARGET_NUMBER=8 MOVE_CONTAINER=true ~/.i3/switch-workspace.sh
bindsym $mod+Shift+9 exec --no-startup-id TARGET_NUMBER=9 MOVE_CONTAINER=true ~/.i3/switch-workspace.sh
のように i3config を用意しておき、
#!/bin/bash -eu
#
# Usage:
# $ TARGET_NUMBER=1 ./switch-workspace.sh
# $ TARGET_NUMBER=2 MOVE_CONTAINER=true ./switch-workspace.sh
declare -r LEFT_SCREEN="DP-5"
declare -r RIGHT_SCREEN="HDMI-0"
main () {
# 現在の出力(モニタ)を取得
local focused_output=$(i3-msg -t get_workspaces | jq -r '.[] | select(.focused==true).output')
local ws
# 出力に応じてワークスペースを切り替え
if [ "$focused_output" == "$LEFT_SCREEN" ]; then
ws="$TARGET_NUMBER:left$TARGET_NUMBER"
elif [ "$focused_output" == "$RIGHT_SCREEN" ]; then
ws="1$TARGET_NUMBER:right$TARGET_NUMBER"
else
return 1
fi
if [ -n "${MOVE_CONTAINER:-}" ]; then
i3-msg move container to workspace "$ws"
fi
i3-msg workspace "$ws"
}
main "$@"
この shellscript を用意し、chmod +x する
Discussion