Published on

Alacritty 单例窗口切换(类似 Quake 终端)

Authors

目标

实现类似 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 中,切换窗口不会丢失任何工作状态。