如何在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
使用方法:
- 将脚本保存为
focus_detector.sh - 赋予执行权限:
chmod +x focus_detector.sh - 运行脚本后,切换窗口或点击其他应用,即可看到焦点事件提示。
三、类似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
相关产品推荐
相关产品推荐

