快速隱藏和呼出終端

下拉式終端(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

相關文章:

翻譯: