快速隐藏和呼出终端

下拉式终端(drop-down terminal emulator)有好几个,常见的有 Yakuake、Guake、Tilda 等,有一个很明显的好处,在用时可以热键(多数默认是按 F12)呼出窗口,不需要时可将窗口隐藏。

如果是初次接触,估计内心还会有点震惊,仿佛终端界的一股清流。其实这里的核心就是招之能来,来之能战,战完归营,我党就是这么指挥军队的,平时喝酒划水吃饭问题不大,大场面来的时候,要光速铁锤出击。

查找网上的资料,这种快速呼出界面的灵感来自 QUAKE 游戏,打游戏时按热键弹出配置界面,所以很多时候又名为 quake-style、quake-mode、quake-like,quake 没玩过,cs 等游戏应该玩过,我想差不多就是那个意思。

题外话说了很多,如今使用 alacrity 终端,想要在 labwc 窗口环境下,或者说在 Wayland 合成器(compositor),该如何实现类似功能呢?

下面就是我的折腾之路:

1. 快捷隐藏

大部门窗口管理器都是可以隐藏/最小化窗口的,比如 Gnome 的 Super+H,因为以前使用 Gnome 环境偏多,我在 labwc 窗口管理器下也是同样的设置(按键盘上面的 Win 键 + h)。

1<keybind key="W-h">
2    <action name="Iconify" />
3</keybind>

labwc -r 重新读取配置后,便可以随时隐藏活动窗口,自然终端软件也不例外。

2. 快速呼出

快速呼出,功效上相当于下拉出来,反正就是弹出界面给人用。可能下拉的方式更加亮眼,逼格略高一丢丢。作为一个实用主义者,并不是很在乎。

快速呼出对窗口管理器来说,就是重新前台聚焦。在 wayland 环境下,找到了一个命令行工具 wlrctl,它实现了 wlr-foreign-toplevel-management 协议,还挺有意思是的。

  • 能调用软键盘打字
1➜  ~ wlrctl keyboard type 'Hello, world!'
2➜  ~ Hello, world!
  • 控制光标移动

例如连续控制光标向右 50、向上 70 像素移动

1➜  ~ wlrctl pointer move 50 -70
2➜  ~ wlrctl pointer move 50 -70
3➜  ~ wlrctl pointer move 50 -70
4➜  ~
  • 聚焦软件

这个才是我们本次重点关心的,且看 labwc 配置:

1<keybind key="W-Return">
2<action>
3    <name>Execute</name>
4    <command>sh -c 'wlrctl window focus Alacritty || alacritty'</command>
5</action>
6</keybind>

关键点是这个 wlrctl window focus Alacritty || alacritty,意思是 Alcaritty 在运行的话,直接 focus 切换到前台(聚焦),如果没有在运行,直接启动。

这样不论 Alacritty 是否在运行,都可以通过 Win + Return 快捷键呼出终端。

有读者可能会有疑问,为什么 Alacritty 一会首字母是大写,一会又是小写。

这个要看 wlrctl 的 manual:

focus [matches...]

Instruct the compositor to focus matching windows.

A match is a colon separated attribute/value pair. e.g. To match a firefox window, a suitable match value is app_id:firefox. You may give any number of match specifiers, and a window must match all of them to be considered. If the app_id or title keys are specified more than once, a window may match any of the given values. Otherwise later key value pairs override previous ones. A match without a key is assumed to be an app_id, so just firefox works in the example above.

Currently supported attributes are: app_id, title, and state.

因为终端在运行的时候 app_id 被识别为 Alacritty

 1➜  ~ ps -ef |grep -i alacritty
 2mephisto   35359       1  0 11:32 ?        00:00:00 sh -c wlrctl window focus Alacritty || alacritty
 3mephisto   35361   35359  0 11:32 ?        00:00:50 alacritty
 4mephisto   58501   23717  0 15:20 pts/7    00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox -i alacritty
 5➜  ~ wlrctl window focus Alacritty
 6➜  ~ echo $?
 70
 8➜  ~ wlrctl window focus alacritty
 9➜  ~ echo $?
101
11➜  ~

首字母大写的时候才能匹配到,返回 0,如果真实终端程序未运行,|| 前面返回假,直接运行 alacritty 启动终端。

这样一番操作后,即可以快速隐藏/呼出终端(分别对应win + h/win + return),如下面动图所示:

quake-like alacritty

录屏制作 gif 的工具不给力,图片有点模糊,原谅下,但能看清在不断切换。

可能有读者习惯于用一个按键 F12 来隐藏/呼出,那得自己想办法用一个中间变量把状态保存起来,每次按键触发一次反转,布尔值切换。

个人认为没必要,win + h可隐藏任意窗口,约定俗成,差不多肌肉记忆了。

win + return 呼出是窗口管理器 labwc 的默认行为。

要用时呼出,不用时隐藏,收缩到状态栏,更改下匹配软件,理论上可以自由切换任意软件,终端属于高频软件,这样配置我很满意 😄。

最后修改于: Wednesday, January 3, 2024
欢迎关注微信公众号,留言交流。

相关文章:

翻译: