![1. 使用外部程序动态创建和访问工作区](https://linux22.com/image/103398/1.%20%E4%BD%BF%E7%94%A8%E5%A4%96%E9%83%A8%E7%A8%8B%E5%BA%8F%E5%8A%A8%E6%80%81%E5%88%9B%E5%BB%BA%E5%92%8C%E8%AE%BF%E9%97%AE%E5%B7%A5%E4%BD%9C%E5%8C%BA.png)
最近,我开始使用i3wm
并爱上了它。然而,有一件事困扰着我:控制超过 10 个工作区。
在我的配置中,在工作区 1 到 9(以及 10)之间切换$mod+1
,但有时 10 个工作区还不够。$mod+9
$mod+0
目前,我通过 to 到达工作区 11 至 20 $mod+mod1+1
,$mod+mod1+0
即点击mod+alt+number
。当然,这没有任何问题,但是像这样切换工作空间是相当麻烦的,因为按键不容易被击中。此外,在工作区 11 到 20 之间移动应用程序需要mod+shift+alt+number
-> 丑陋。
在我的Vim
绑定中(我有很多插件),我开始使用双修饰符快捷方式,例如modkey + r
插件 1 和modkey + modkey + r
插件 2。这样我可以将每个键绑定两次,并且按两次 mod 键既简单又快速。
我可以做类似的事情吗i3wm
?
您如何利用 10 多个工作空间i3wm
?还有其他解决方案吗?
答案1
i3并不真正支持像这样的按键序列维姆。任何键绑定都由单个键组成,其前面是不同的(因此没有Shift+Shift
)修饰符的可选列表。并且所有修饰键都需要在按下主键的同时按下。
话虽这么说,有两种主要方法可以拥有大量工作区,而不必将它们绑定到长修饰符列表:
1. 使用外部程序动态创建和访问工作区
您不必为每个工作区定义快捷方式,您可以通过发送到来动态创建workspace NEW_WS
它们i3,例如程序i3-msg
:
i3-msg workspace NEW_WS
i3-msg move container to workspace NEW_WS
i3还附带i3-input
命令,该命令打开一个小输入字段,然后使用给定的输入作为参数运行命令
i3-input -F 'workspace %s' -P 'go to workspace: '
i3-input -F 'move container to workspace %s' -P 'move to workspace: '
将这两个命令绑定到快捷方式,您只需按快捷方式,然后输入所需工作区的名称(或编号),就可以访问任意数量的工作区。 (如果您只使用编号的工作区,您可能需要使用workspace number %s
而不只是workspace %s
)
2. 在按键绑定模式下将工作区静态绑定到简单的快捷方式
或者,对于更静态的方法,您可以在您的i3配置。您可以使用单独的模式来聚焦和移动到工作区:
set $mode_workspace "goto_ws"
mode $mode_workspace {
bindsym 1 workspace 1; mode "default"
bindsym 2 workspace 2; mode "default"
# […]
bindsym a workspace a; mode "default"
bindsym b workspace b; mode "default"
# […]
bindsym Escape mode "default"
}
bindsym $mod+w mode $mode_workspace
set $mode_move_to_workspace "moveto_ws"
mode $mode_move_to_workspace {
bindsym 1 move container to workspace 1; mode "default"
bindsym 2 move container to workspace 2; mode "default"
# […]
bindsym a move container to workspace a; mode "default"
bindsym b move container to workspace b; mode "default"
# […]
bindsym Escape mode "default"
}
bindsym $mod+shift+w mode $mode_move_to_workspace
或者您可以在单一模式下使用单独的绑定来聚焦和移动:
set $mode_ws "workspaces"
mode $mode_ws {
bindsym 1 workspace 1; mode "default"
bindsym Shift+1 move container to workspace 1; mode "default"
bindsym 2 workspace 2; mode "default"
bindsym Shift+2 move container to workspace 2; mode "default"
# […]
bindsym a workspace a; mode "default"
bindsym Shift+a move container to workspace a; mode "default"
bindsym b workspace b; mode "default"
bindsym Shift+b move container to workspace b; mode "default"
# […]
bindsym Escape mode "default"
}
bindsym $mod+shift+w mode $mode_move_to_workspace
在这两个示例中,workspace
ormove
命令都与 链接在一起mode "default"
,因此i3每个命令后自动返回到默认键绑定映射。
答案2
我的解决方案就是使用更多的键:
set $ws0 "0:`:www"
set $ws1 "1:1"
set $ws2 "2:2"
set $ws3 "3:3:fm"
set $ws4 "4:4"
set $ws5 "5:5"
set $ws6 "6:6:dev"
set $ws7 "7:7"
set $ws8 "8:8"
set $ws9 "9:9"
set $ws10 "10:0:music"
set $ws11 "11:-:jd"
set $ws12 "12:=:comm"
set $ws13 "13:B"
set $ws14 "14:H"
set $ws15 "15:E"
set $ws16 "16:I"
set $ws17 "17:D:upwork"
bindsym $mod+grave workspace $ws0
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
bindsym $mod+minus workspace $ws11
bindsym $mod+equal workspace $ws12
bindsym $mod+BackSpace workspace $ws13
bindsym $mod+Home workspace $ws14
bindsym $mod+End workspace $ws15
bindsym $mod+Insert workspace $ws16
bindsym $mod+Delete workspace $ws17
for_window [class="Upwork"] move container to workspace $ws17
for_window [class="Spotify"] move container to workspace $ws10
for_window [class="Brave-browser"] move container to workspace $ws0
for_window [class="TelegramDesktop"] move container to workspace $ws12
for_window [class="jetbrains-pycharm"] move container to workspace $ws6
for_window [class="Caja"] move container to workspace $ws3
for_window [class="JDownloader"] move container to workspace $ws11
答案3
我的解决方案基于卢卡斯的回答:
# win principal, alt secondary
# set $mod Mod4
# set $mod2 Mod1
#
# # alt principal, win secondary
set $mod Mod1
set $mod2 Mod4
# switch to workspace
bindsym $mod+1 workspace 1
bindsym $mod+2 workspace 2
bindsym $mod+3 workspace 3
bindsym $mod+4 workspace 4
bindsym $mod+5 workspace 5
bindsym $mod+6 workspace 6
bindsym $mod+7 workspace 7
bindsym $mod+8 workspace 8
bindsym $mod+9 workspace 9
bindsym $mod+0 workspace 10
# Workspaces 11-20, with mod2
bindsym $mod2+1 workspace 11
bindsym $mod2+2 workspace 12
bindsym $mod2+3 workspace 13
bindsym $mod2+4 workspace 14
bindsym $mod2+5 workspace 15
bindsym $mod2+6 workspace 16
bindsym $mod2+7 workspace 17
bindsym $mod2+8 workspace 18
bindsym $mod2+9 workspace 19
bindsym $mod2+0 workspace 20
# move focused container to workspace, keeping focus
bindsym $mod+Shift+1 move workspace 1; workspace 1
bindsym $mod+Shift+2 move workspace 2; workspace 2
bindsym $mod+Shift+3 move workspace 3; workspace 3
bindsym $mod+Shift+4 move workspace 4; workspace 4
bindsym $mod+Shift+5 move workspace 5; workspace 5
bindsym $mod+Shift+6 move workspace 6; workspace 6
bindsym $mod+Shift+7 move workspace 7; workspace 7
bindsym $mod+Shift+8 move workspace 8; workspace 8
bindsym $mod+Shift+9 move workspace 9; workspace 9
bindsym $mod+Shift+0 move workspace 10; workspace 10
bindsym $mod2+Shift+1 move workspace 11; workspace 11
bindsym $mod2+Shift+2 move workspace 12; workspace 12
bindsym $mod2+Shift+3 move workspace 13; workspace 13
bindsym $mod2+Shift+4 move workspace 14; workspace 14
bindsym $mod2+Shift+5 move workspace 15; workspace 15
bindsym $mod2+Shift+6 move workspace 16; workspace 16
bindsym $mod2+Shift+7 move workspace 17; workspace 17
bindsym $mod2+Shift+8 move workspace 18; workspace 18
bindsym $mod2+Shift+9 move workspace 19; workspace 19
bindsym $mod2+Shift+0 move workspace 20; workspace 20
答案4
我通过将“toggle”变量存储到/tmp
.我们不能使用环境变量进行切换,因为每个bindsym exec
进程都会生成一个新的 shell,并且无法在父进程中设置环境变量。在大多数发行版中,/tmp
它tmpfs
存储在 RAM 中,因此使用起来仍然相当快。
Mod+=增加“工作空间修饰符”,为每个工作空间编号添加 10。
Mod+-减少“工作空间修改器”,从每个工作空间编号中减去 10。
通常,按Mod+1会带您到工作区1。按Mod+后=,它将带您到工作区 11。
这是配置:
#Increase workspace modifier
bindsym $mod+equal exec echo $(( `cat /tmp/workspace_modifier` + 1 )) > /tmp/workspace_modifier
#Decrease workspace modifier
bindsym $mod+minus exec n=$(( `cat /tmp/workspace_modifier` - 1 )) && echo `[ $n -le 0 ] && echo '' || echo $n` > /tmp/workspace_modifier
#Switch to workspace
bindsym $mod+0 exec i3-msg workspace number `cat /tmp/workspace_modifier`0
bindsym $mod+1 exec i3-msg workspace number `cat /tmp/workspace_modifier`1
bindsym $mod+2 exec i3-msg workspace number `cat /tmp/workspace_modifier`2
bindsym $mod+3 exec i3-msg workspace number `cat /tmp/workspace_modifier`3
bindsym $mod+4 exec i3-msg workspace number `cat /tmp/workspace_modifier`4
bindsym $mod+5 exec i3-msg workspace number `cat /tmp/workspace_modifier`5
bindsym $mod+6 exec i3-msg workspace number `cat /tmp/workspace_modifier`6
bindsym $mod+7 exec i3-msg workspace number `cat /tmp/workspace_modifier`7
bindsym $mod+8 exec i3-msg workspace number `cat /tmp/workspace_modifier`8
bindsym $mod+9 exec i3-msg workspace number `cat /tmp/workspace_modifier`9
#Move focused container to workspace
bindsym $mod+Shift+0 exec i3-msg move container to workspace number `cat /tmp/workspace_modifier`0
bindsym $mod+Shift+1 exec i3-msg move container to workspace number `cat /tmp/workspace_modifier`1
bindsym $mod+Shift+2 exec i3-msg move container to workspace number `cat /tmp/workspace_modifier`2
bindsym $mod+Shift+3 exec i3-msg move container to workspace number `cat /tmp/workspace_modifier`3
bindsym $mod+Shift+4 exec i3-msg move container to workspace number `cat /tmp/workspace_modifier`4
bindsym $mod+Shift+5 exec i3-msg move container to workspace number `cat /tmp/workspace_modifier`5
bindsym $mod+Shift+6 exec i3-msg move container to workspace number `cat /tmp/workspace_modifier`6
bindsym $mod+Shift+7 exec i3-msg move container to workspace number `cat /tmp/workspace_modifier`7
bindsym $mod+Shift+8 exec i3-msg move container to workspace number `cat /tmp/workspace_modifier`8
bindsym $mod+Shift+9 exec i3-msg move container to workspace number `cat /tmp/workspace_modifier`9
请注意,在此配置中,Mod+0移动到工作区 0代替工作区 10。如果这对您很重要,您可能希望使用这些绑定:
bindsym $mod+0 exec n=`cat /tmp/workspace_modifier` w=`[ $n ] && echo $n || echo 0` && i3-msg workspace number `echo "$w*10 + 10" | bc`
bindsym $mod+Shift+0 exec n=`cat /tmp/workspace_modifier` w=`[ $n ] && echo $n || echo 0` && i3-msg move container to workspace number `echo "$w*10 + 10" | bc`
由于 i3 config 处理变量的方式,保留工作区名称变得非常复杂:它直接替换而不是将它们注入到 exec 命令的环境中,因此如果不在 exec 命令中重新声明它们,就不可能动态检索这些值。这很快就会变得混乱:
set $ws1 "1: one"
set $ws2 "2: two"
set $ws1 "11: eleven"
set $ws2 "12: twelve"
bindsym $mod+Shift+1 exec key=1 ws1=$ws1 ws2=$ws2 ws11=$ws11 ws12=$ws12 && i=`cat /tmp/workspace_modifier` && dynamic=ws${i}${key} && text=${!dynamic} && workspace=$(echo `[ "$text" ] && echo "$text" || echo ${i}${key}` ) && i3-msg move container to workspace number $workspace
只要在 exec 命令中您只声明使用该set
命令命名的工作区,这就应该有效。例如,如果您定义set $ws1 "1: text"
但未设置$ws11
,然后包含ws11=$ws11
在 exec 命令中,i3 config 将扩展ws11=$ws11
为ws11="1: one"1
因为它$ws1
与 中匹配$ws11
。否则它工作正常。
如果您想使用工作区名称加上 keep Mod+0设置为工作区 10,使用这些绑定符号:
bindsym $mod+0 exec key=0 ws1=$ws1 ws2=$ws2 ws3=$ws3 ws4=$ws4 ws5=$ws5 ws6=$ws6 ws7=$ws7 ws8=$ws8 ws9=$ws9 ws10=$ws10 && n=`cat /tmp/workspace_modifier` w=`[ $n ] && echo $n || echo 0` i=`echo "$w*10 + 10" | bc` && dynamic=ws${i} && text=${!dynamic} && workspace=$(echo `[ "$text" ] && echo "$text" || echo ${i}` ) && i3-msg workspace number $workspace
bindsym $mod+Shift+0 exec key=0 ws0=$ws0 ws1=$ws1 ws2=$ws2 ws3=$ws3 ws4=$ws4 ws5=$ws5 ws6=$ws6 ws7=$ws7 ws8=$ws8 ws9=$ws9 ws10=$ws10 && n=`cat /tmp/workspace_modifier` w=`[ $n ] && echo $n || echo 0` i=`echo "$w*10 + 10" | bc` && dynamic=ws${i} && text=${!dynamic} && workspace=$(echo `[ "$text" ] && echo "$text" || echo ${i}` ) && i3-msg move container to workspace number "$workspace"