i3 布局加载脚本无效
i3 layout loading script with no effect
我按照文档保存了工作区的布局:
i3-save-tree --workspace 1 > ~/.i3/layouts/ws1.json
因为我的工作区名称是一个带引号的字符串变量,所以我必须编写一个脚本 (~/.i3/scripts/load_layout.sh
) 才能正确调用 i3-msg
:
i3-msg "workspace "
i3-msg "append_layout /home/villasv/.i3/layouts/ws.json"
然后我的 ~/.i3/config
文件有以下工作区设置:
set $ws1 "1 "
bindsym $mod+1 workspace $ws1
bindsym $mod+Shift+1 move container to workspace $ws1
exec --no-startup-id 'sh ~/.i3/scripts/load_layout.sh $ws1 1'
exec firefox
但是在注销和登录后布局不会发生变化。我什至尝试使用 exec_always
并重新启动 i3
,但仍然没有效果。
运行 sh ~/.i3/scripts/load_layout.sh "dummy" 1
使用布局成功创建工作区。
此外,使用 exec --no-startup-id "i3-msg 'workspace 1; append_layout ~/.i3/layouts/ws1.json'"
也能正常工作,几乎符合要求。我猜问题出在脚本或脚本调用中,但我不知道是什么。
我缺少什么来使用工作区变量名称?
嗯,我找不到问题所在,但我通过反复试验找到了一个简单的解决方法。
只需定义不带引号的工作区名称即可,不会破坏文档中提供的单行代码。
所以我的解决方案是改变
set $ws1 "1 "
-> set $ws1 1
这不起作用的原因有两个:
- 您用单引号 (
'
) 引用了整个命令。单引号在 i3 配置中并不特殊。这意味着它们不是 "parsed away",因此 'sh ~/.i3/scripts/load_layout.sh $ws1 1'
作为一个整体被用作命令的名称,spaces 和所有,而不是带有多个参数的命令 sh
.
- 您的工作space名称包含一个space。因此,即使 1. 不是问题,它也会失败,因为脚本的第一个参数 -
$ws1
- 没有单独引用。这将导致脚本获得三个 - 1
和 1
- 而不是两个参数 - 1
和 1
.
试试这个 exec 命令:
exec --no-startup-id sh ~/.i3/scripts/load_layout.sh '$ws1' 1
如前所述,$ws1
周围的单引号不会被 i3 配置解析器删除,因此在传递参数时它们会出现。此外,由于 i3 正在替换 $ws1
,因此 shell 变量未在单引号内扩展的通常规则不适用。
我按照文档保存了工作区的布局:
i3-save-tree --workspace 1 > ~/.i3/layouts/ws1.json
因为我的工作区名称是一个带引号的字符串变量,所以我必须编写一个脚本 (~/.i3/scripts/load_layout.sh
) 才能正确调用 i3-msg
:
i3-msg "workspace "
i3-msg "append_layout /home/villasv/.i3/layouts/ws.json"
然后我的 ~/.i3/config
文件有以下工作区设置:
set $ws1 "1 "
bindsym $mod+1 workspace $ws1
bindsym $mod+Shift+1 move container to workspace $ws1
exec --no-startup-id 'sh ~/.i3/scripts/load_layout.sh $ws1 1'
exec firefox
但是在注销和登录后布局不会发生变化。我什至尝试使用 exec_always
并重新启动 i3
,但仍然没有效果。
运行 sh ~/.i3/scripts/load_layout.sh "dummy" 1
使用布局成功创建工作区。
此外,使用 exec --no-startup-id "i3-msg 'workspace 1; append_layout ~/.i3/layouts/ws1.json'"
也能正常工作,几乎符合要求。我猜问题出在脚本或脚本调用中,但我不知道是什么。
我缺少什么来使用工作区变量名称?
嗯,我找不到问题所在,但我通过反复试验找到了一个简单的解决方法。
只需定义不带引号的工作区名称即可,不会破坏文档中提供的单行代码。
所以我的解决方案是改变
set $ws1 "1 "
-> set $ws1 1
这不起作用的原因有两个:
- 您用单引号 (
'
) 引用了整个命令。单引号在 i3 配置中并不特殊。这意味着它们不是 "parsed away",因此'sh ~/.i3/scripts/load_layout.sh $ws1 1'
作为一个整体被用作命令的名称,spaces 和所有,而不是带有多个参数的命令sh
. - 您的工作space名称包含一个space。因此,即使 1. 不是问题,它也会失败,因为脚本的第一个参数 -
$ws1
- 没有单独引用。这将导致脚本获得三个 -1
和1
- 而不是两个参数 -1
和1
.
试试这个 exec 命令:
exec --no-startup-id sh ~/.i3/scripts/load_layout.sh '$ws1' 1
如前所述,$ws1
周围的单引号不会被 i3 配置解析器删除,因此在传递参数时它们会出现。此外,由于 i3 正在替换 $ws1
,因此 shell 变量未在单引号内扩展的通常规则不适用。