You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无需依赖窗口管理器,如何判断终端是否聚焦?终端模拟器是否暴露该信息?

好问题!终端模拟器本身确实可以暴露焦点状态,不过这依赖于终端的**焦点报告(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 [ I033 [ O的内容,就说明终端支持这个特性。

  • 另外,部分终端可能需要单独配置开启焦点事件:

    • Kitty:在kitty.conf里添加enable_focus_events yes
    • Alacritty、GNOME Terminal、Konsole:默认支持,只要tmux开启focus-events即可

内容的提问来源于stack exchange,提问作者Christopher Shroba

火山引擎 最新活动