🪟

i3wm: おすすめの workspace 移動設定

2024/06/14に公開

スクリーン内における、前後のワークスペースに移動

以前私は $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