无需依赖窗口管理器,如何判断终端是否聚焦?终端模拟器是否暴露该信息?
好问题!终端模拟器本身确实可以暴露焦点状态,不过这依赖于终端的**焦点报告(focus reporting)**特性——不是所有终端都默认开启,但大多数现代终端都支持这个xterm兼容的功能。
下面是具体的实现思路和步骤:
首先,焦点报告的核心逻辑是:终端在获得/失去焦点时会发送特定的转义序列:
- 获得焦点时发送
\x1b[I(即 ESC [ I) - 失去焦点时发送
\x1b[O(即 ESC [ O)
- 获得焦点时发送
要让tmux能接收这些事件,你需要先在tmux配置里启用焦点事件支持。编辑
~/.tmux.conf添加:set -g focus-events on这个配置会让tmux主动请求终端发送焦点变化的事件。
接下来就可以利用tmux的内置变量
#{client_has_focus}来动态修改样式了,这个变量会返回1(当前客户端有焦点)或0(失焦)。比如你可以这样设置状态栏或窗口的样式:# 有焦点时状态栏用绿色背景,失焦时用红色 set -g status-style "#{?client_has_focus,bg=green,bg=red}" # 失焦时窗口内容变灰,聚焦时恢复正常显示 set -g window-style "#{?client_has_focus,,fg=colour240,bg=colour235}" set -g window-active-style "fg=colour250,bg=colour234"如果你的终端默认没开启焦点报告(比如部分小众终端),可以用
tput命令手动控制:tput smf # 开启焦点报告 tput rmf # 关闭焦点报告验证终端是否支持的话,可以运行
tput smf; cat | od -c,然后切换终端焦点,如果看到输出里有033 [ I或033 [ O的内容,就说明终端支持这个特性。另外,部分终端可能需要单独配置开启焦点事件:
- Kitty:在
kitty.conf里添加enable_focus_events yes - Alacritty、GNOME Terminal、Konsole:默认支持,只要tmux开启
focus-events即可
- Kitty:在
内容的提问来源于stack exchange,提问作者Christopher Shroba




