如何在 i3 配置中执行一个函数?
how to execute a function in i3 config?
我想重命名工作区但默认保留工作区编号,在 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 配置文件中执行某种功能,将工作区编号与用户输入连接起来以达到我的目的?
我认为你做不到。但是,如果您创建一个脚本并在您的 i3-config 中使用 exec
调用它,您总是可以做任何您想做的事情。所以,例如:
~/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
中的某个位置。
您可以从 i3 配置执行一个函数,它有点麻烦,但效果很好。要记住的关键是任何带有 ,
或 ;
的命令都需要引用(即您可能编写的每个函数,因为它是语法的必需部分),如果您有额外的引号传递给 exec
的命令中的相同类型你需要根据 i3 documentation.
使用 \
转义它们
就我个人而言,我想要一个简单的关机菜单,而不必创建一个单独的脚本来维护和拖到我的 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;'
并在之后调用它。在函数内部,我使用进程替换和输入重定向将选项输入到菜单中,以将 selection 捕获到变量 res=$(rofi -dmenu < <(echo -en \"logout\nrestart\nshutdown\"))
并注意额外的 \
以转义内部双精度报价。
最后,我正在评估用户 select 通过 case
编辑的选项,并根据该选项选择一个操作,重启和关闭命令有 2 分钟的超时时间,这样我就可以中止如果不知何故我很难不小心碰到触发菜单和 select 一个项目所需的修饰符,而不是仅仅按 Esc 退出菜单。
在写完这篇文章并意识到注销和丢失我当前的所有 windows/layouts 是多么容易之后,我将添加一个 "no-op" 选项,它出现在列表的第一位并且是最后在 case
语句中评估可能会 echo
通过 cowsay
或 notify-send
.
一些有趣的事情
我想重命名工作区但默认保留工作区编号,在 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 配置文件中执行某种功能,将工作区编号与用户输入连接起来以达到我的目的?
我认为你做不到。但是,如果您创建一个脚本并在您的 i3-config 中使用 exec
调用它,您总是可以做任何您想做的事情。所以,例如:
~/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
中的某个位置。
您可以从 i3 配置执行一个函数,它有点麻烦,但效果很好。要记住的关键是任何带有 ,
或 ;
的命令都需要引用(即您可能编写的每个函数,因为它是语法的必需部分),如果您有额外的引号传递给 exec
的命令中的相同类型你需要根据 i3 documentation.
\
转义它们
就我个人而言,我想要一个简单的关机菜单,而不必创建一个单独的脚本来维护和拖到我的 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;'
并在之后调用它。在函数内部,我使用进程替换和输入重定向将选项输入到菜单中,以将 selection 捕获到变量 res=$(rofi -dmenu < <(echo -en \"logout\nrestart\nshutdown\"))
并注意额外的 \
以转义内部双精度报价。
最后,我正在评估用户 select 通过 case
编辑的选项,并根据该选项选择一个操作,重启和关闭命令有 2 分钟的超时时间,这样我就可以中止如果不知何故我很难不小心碰到触发菜单和 select 一个项目所需的修饰符,而不是仅仅按 Esc 退出菜单。
在写完这篇文章并意识到注销和丢失我当前的所有 windows/layouts 是多么容易之后,我将添加一个 "no-op" 选项,它出现在列表的第一位并且是最后在 case
语句中评估可能会 echo
通过 cowsay
或 notify-send
.