- Published on
Alacritty 单例窗口切换(类似 Quake 终端)
- Authors

- Name
- JiGu
- @crypto20x
目标
实现类似 Quake 终端的效果:按 Ctrl+Alt+T 切换 Alacritty 的显示和最小化。窗口始终存在(单例),不会重复启动新实例。
依赖
sudo apt install xdotool x11-utils
xdotool:查找窗口、激活、最小化xprop:检测窗口的真实状态(是否最小化)
为什么不能只用 xdotool
最初的做法是用 xdotool search --class alacritty 判断窗口是否存在,不存在就启动,存在就激活。
问题在于:窗口最小化后,xdotool search --onlyvisible 在某些窗口管理器下仍然能检测到它,导致逻辑判断出错——以为窗口可见,实际已经最小化了。
解决方案是用 xprop 读取窗口的 _NET_WM_STATE 属性,检查是否包含 HIDDEN 状态,这才是判断窗口是否最小化的可靠方式。
切换脚本
创建 ~/.local/bin/toggle-alacritty.sh:
#!/bin/bash
WINDOW_ID=$(xdotool search --class alacritty | head -1)
if [ -z "$WINDOW_ID" ]; then
# 窗口不存在,启动 Alacritty
/home/clouder/.cargo/bin/alacritty &
sleep 0.5
WINDOW_ID=$(xdotool search --class alacritty | head -1)
xdotool windowactivate --sync "$WINDOW_ID"
else
# 窗口存在,检查是否最小化
STATE=$(xprop -id "$WINDOW_ID" _NET_WM_STATE 2>/dev/null | grep -o "HIDDEN")
if [ "$STATE" = "HIDDEN" ]; then
# 最小化状态 → 恢复并激活
xdotool windowmap "$WINDOW_ID"
sleep 0.1
xdotool windowraise "$WINDOW_ID"
xdotool windowactivate --sync "$WINDOW_ID"
else
# 可见状态 → 最小化
xdotool windowminimize "$WINDOW_ID"
fi
fi
赋予执行权限:
chmod +x ~/.local/bin/toggle-alacritty.sh
绑定快捷键
根据桌面环境不同,绑定方式不同。
GNOME
# 添加自定义快捷键
gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings \
"['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/']"
gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ name 'Toggle Alacritty'
gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ command '/home/clouder/.local/bin/toggle-alacritty.sh'
gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ binding '<Ctrl><Alt>t'
i3 / sway
在配置文件中添加:
bindsym Ctrl+Alt+t exec ~/.local/bin/toggle-alacritty.sh
其他 DE
在系统设置的键盘快捷键里,添加一个自定义快捷键,命令指向脚本路径即可。
脚本逻辑说明
| 场景 | 行为 |
|---|---|
| Alacritty 未运行 | 启动新实例并激活 |
| Alacritty 已最小化 | windowmap 恢复 → windowraise 提升 → windowactivate 激活 |
| Alacritty 可见 | windowminimize 最小化 |
关键点:xprop -id $WINDOW_ID _NET_WM_STATE 输出的 HIDDEN 表示窗口被最小化,这比 xdotool 的可见性判断更可靠。
小结
这个方案让 Alacritty 变成了一个随时可以呼出/收起的单例终端,配合之前配置的 Alacritty + Zellij 组合使用体验很好——终端会话始终保留在 Zellij 中,切换窗口不会丢失任何工作状态。