【问题标题】:i3 layout loading script with no effect [closed]i3布局加载脚本无效[关闭]
【发布时间】:2016-08-17 17:25:46
【问题描述】:

我按照文档保存了工作区的布局:

i3-save-tree --workspace 1 > ~/.i3/layouts/ws1.json

因为我的工作区名称是一个带引号的字符串变量,所以我必须编写一个脚本 (~/.i3/scripts/load_layout.sh) 才能正确调用 i3-msg:

i3-msg "workspace $1"
i3-msg "append_layout /home/villasv/.i3/layouts/ws$2.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'" 也可以,几乎可以满足需要。我猜这个问题发生在脚本或脚本调用中,但我不知道是什么。

使用工作区变量名称进行这项工作我缺少什么?

【问题讨论】:

    标签: i3


    【解决方案1】:

    这不起作用有两个原因:

    1. 您用单引号 (') 引用了整个命令。单引号在 i3 配置中并不特殊。这意味着它们不会被“解析”,因此 'sh ~/.i3/scripts/load_layout.sh $ws1 1' 作为一个整体被视为命令的名称、空格和所有内容,而不是带有多个参数的命令 sh。
    2. 您的工作区名称包含一个空格。因此,即使 1. 不是问题,它也会失败,因为脚本的第一个参数 - $ws1 - 没有单独引用。这将导致脚本获得三个 - 1 和 1 - 而不是两个参数 - 1  和 1。

    试试这个 exec 命令:

    exec --no-startup-id sh ~/.i3/scripts/load_layout.sh '$ws1' 1
    

    如前所述,$ws1 周围的单引号不会被 i3 配置解析器删除,因此在传递参数时它们会出现。此外,由于 i3 正在替换 $ws1,因此不适用 shell 变量不在单引号内扩展的常规规则。

    【讨论】:

    • 你是对的,我的工作空间名称包含一个空格,但它被也引用了,所以$ws1的替换也被引用了。这不是解决问题 2 吗?
    • 不,不幸的是它没有帮助,因为双引号被 i3's 配置解析器剥离了。这就是为什么在 i3 的 配置中正确引用 shell 命令非常困难的原因之一。尤其是在需要多级引号和/或变量时。
    【解决方案2】:

    好吧,我无法找出问题所在,但我找到了一个简单的解决方法,我通过反复试验发现。

    只需定义不带引号的工作区名称就可以正常工作,并且不会破坏文档中提供的单行符。

    所以我的解决方案是改变 set $ws1 "1 " -> set $ws1 1 

    【讨论】:

      猜你喜欢
      • 2012-04-08
      • 2017-06-08
      • 1970-01-01
      • 2015-02-10
      • 2021-07-20
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多