You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Cygwin的mintty中检测焦点丢失?是否支持焦点事件?

在Cygwin的mintty终端中检测焦点丢失与获取事件

一、mintty对焦点事件的支持

mintty终端原生支持焦点丢失(FocusLost)和焦点获取(FocusGained)事件的通知,它会通过OSC(Operating System Command)控制序列向终端发送事件信号:

  • 焦点丢失时,发送序列:\e]103;0\a(其中\e是ESC字符,\a是BEL字符)
  • 焦点获取时,发送序列:\e]103;1\a

要启用这个功能,需先配置mintty:编辑用户目录下的~/.minttyrc文件,添加一行FocusReport=yes,保存后重启mintty即可生效。

二、在Shell中检测焦点事件

可以通过Shell脚本监听并解析mintty发送的控制序列,实现焦点事件的检测。以下是bash示例:

#!/bin/bash

# 将终端设置为raw模式,捕获原始输入字符
stty raw -echo

# 退出脚本时恢复终端默认设置
trap 'stty sane' EXIT

# 循环监听输入
while true; do
    read -n 1 char
    # 检测ESC起始的控制序列
    if [[ "$char" == $'\e' ]]; then
        read -n 1 next_char
        if [[ "$next_char" == ']' ]]; then
            # 读取到OSC序列,直到BEL字符结束
            read -d $'\a' osc_content
            # 解析焦点事件
            case "$osc_content" in
                "103;0")
                    echo "焦点已丢失"
                    # 这里可添加焦点丢失时要执行的命令
                    ;;
                "103;1")
                    echo "焦点已获取"
                    # 这里可添加焦点获取时要执行的命令
                    ;;
            esac
        fi
    fi
done

使用方法:

  1. 将脚本保存为focus_detector.sh
  2. 赋予执行权限:chmod +x focus_detector.sh
  3. 运行脚本后,切换窗口或点击其他应用,即可看到焦点事件提示。

三、类似gvim autocmd的自动执行实现

如果需要像gvim的autocmd FocusLost * call ...那样,在焦点事件触发时自动执行指定操作,只需修改上述脚本中对应分支的内容,替换成目标命令即可。

例如,焦点丢失时自动保存bash历史记录,焦点获取时重新加载:

# 替换脚本中的case分支
case "$osc_content" in
    "103;0")
        echo "自动保存历史记录..."
        history -w ~/.bash_focus_history
        ;;
    "103;1")
        echo "重新加载历史记录..."
        history -r ~/.bash_focus_history
        ;;
esac

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 02:52:04