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 

这不起作用的原因有两个:

  1. 您用单引号 (') 引用了整个命令。单引号在 i3 配置中并不特殊。这意味着它们不是 "parsed away",因此 'sh ~/.i3/scripts/load_layout.sh $ws1 1' 作为一个整体被用作命令的名称,spaces 和所有,而不是带有多个参数的命令 sh .
  2. 您的工作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 变量未在单引号内扩展的通常规则不适用。