2

我想重命名一个工作区但默认保留工作区编号,在 i3 用户指南中,我找到了以下脚本来执行此操作。

bindsym $mod+r exec i3-input -F 'rename workspace to "%s"' -P 'New name: '

但问题是它默认不保留工作区号,所以我必须记住输入工作区号。

我找到了一种使用以下命令获取焦点工作区编号的方法,但我不知道如何在 i3 配置中将数字与输入名称连接在一起。

i3-msg -t get_workspaces | jq '.[] | select(.focused == true) | .num'

所以,我想知道是否在 i3 配置文件中,我可以执行某种函数来连接工作区编号和用户输入来达到我的目的?

4

2 回答 2

3

我不认为你可以。但是,如果您创建一个脚本并exec在 i3-config 中调用它,您总是可以做任何您想做的事情。因此,例如:

~/bin/i3-rename-workspace (或任何你方便的地方):

N=$(i3-msg -t get_workspaces | jq '.[] | select(.focused == true).num')
i3-input -F "rename workspace to \"$N: %s\"" -P 'New name: '

在您的 i3-config 中的某处:

bindsym $mod+r exec i3-rename-workspace

请记住提供脚本的完整路径,或者将其放在 i3 的$PATH.

于 2017-01-25T15:42:57.780 回答
1

你可以从 i3 配置中执行一个函数,它有点毛茸茸,但效果很好。要记住的关键事项是任何带有 a,;需要引用的命令(即,您可以编写的每个函数,因为它是语法的必需部分),如果您在传递给exec您的命令中有其他相同类型的引号,则需要\\根据i3 文档逃避它们。

就我个人而言,我想要一个简单的关闭菜单,而无需创建单独的脚本来维护和拖动 i3 配置之外,我使用了内联函数定义和调用。这与在别名中运行外部命令的推荐方式非常相似git(并且我认为它会起作用)。

bindsym $mod+Shift+q exec "bash -c 'f () { res=$(rofi -dmenu < <(echo -en \\"logout\nrestart\nshutdown\\")); case $res in logout) i3-msg exit;; restart) sudo shutdown -r +2;; shutdown) sudo shutdown -P +2;; esac; }; f;'"

这有点难以解压,但我定义了临时函数f () {...}; f;'并在之后调用它。在函数内部,我使用进程替换和输入重定向将选项输入到菜单中,以将选择捕获到变量res=$(rofi -dmenu < <(echo -en \\"logout\nrestart\nshutdown\\"))并注意额外的内容\\以转义内部双引号。

最后,我正在评估用户选择的选项case并根据该选项选择一个操作,重新启动和关闭命令有 2 分钟的超时时间,因此如果我以某种方式意外击中触发菜单所需的修饰符,我可以中止并选择一个项目,而不仅仅是按下Esc退出菜单。

在写完这篇文章并意识到注销和释放我当前的所有窗口/布局是多么容易之后,我将添加一个“no-op”选项,它首先出现在列表中,并在case语句中最后评估,可能将通过orecho做一些有趣的事情。cowsaynotify-send

于 2017-07-11T22:37:55.097 回答