1. 使用外部程序动态创建和访问工作区

1. 使用外部程序动态创建和访问工作区

最近,我开始使用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

在这两个示例中,workspaceormove命令都与 链接在一起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,并且无法在父进程中设置环境变量。在大多数发行版中,/tmptmpfs存储在 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=$ws11ws11="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"

相关内容