如何让xterm -e启动的窗口自动获取并归还焦点?(跨平台)
解决Mac下xterm窗口自动获取焦点及关闭后归还焦点的问题
跨平台适配方案
修改你的zsh别名,加入Mac系统级焦点控制逻辑,同时兼容Linux和Windows环境:
alias AnsiView='if [[ "$OSTYPE" == "darwin"* ]]; then CURRENT_WIN=$(osascript -e "tell application \"System Events\" to get id of first application process whose frontmost is true"); xterm -e myAnsiView &; sleep 0.2; osascript -e "tell application \"System Events\" to set frontmost of application process id $CURRENT_WIN to false"; osascript -e "tell application \"xterm\" to activate"; wait; osascript -e "tell application \"System Events\" to set frontmost of application process id $CURRENT_WIN to true"; else xterm -e myAnsiView; fi'
逻辑拆解
- 记录原焦点窗口:通过
osascript获取当前前台进程ID,存入CURRENT_WIN变量 - 强制激活xterm:后台启动xterm后短暂等待窗口加载,先将原窗口设为非前台,再激活xterm确保焦点转移
- 关闭后归还焦点:等待xterm(及
myAnsiView)进程结束,再通过osascript将原进程恢复为前台状态
无效方法说明
nohup仅用于让进程脱离终端会话,和窗口焦点控制完全无关xterm -iconic是让窗口以最小化状态启动,反而会阻止自动获取焦点
关于工具的焦点检测
你用到的ANSI转义序列\e[?1004h只能检测xterm内部的焦点变化,Mac系统级的焦点管理会绕过这个检测机制,因此必须通过系统脚本实现全局焦点控制。
内容的提问来源于stack exchange,提问作者Richard Kirk
相关产品推荐
相关产品推荐

