背景
在 Ghostty 里看到类似下面这种代码位置时,希望可以通过 Cmd+点击直接跳到 Android Studio 对应文件和行号。
/Users/markz/code/baidu/fc-native-android/nadclient_2/repos/business/lib_nadcore_sdk/lib-business/src/main/webpanel/java/com/baidu/nadcore/webpanel/PanelScrollView.java:82已经验证 macOS 能正确处理 Android Studio 注册的 idea:// 协议:
open 'idea://open?file=/Users/markz/code/baidu/fc-native-android/nadclient_2/repos/business/lib_nadcore_sdk/lib-business/src/main/webpanel/java/com/baidu/nadcore/webpanel/PanelScrollView.java&line=82&column=1'方案是什么?
使用 ripgrep 的 OSC 8 hyperlink 输出能力,让 rg 搜索结果里的文件路径自带隐藏链接。
它不是把终端已有文本做替换,而是 rg 在输出时主动生成类似下面的终端控制序列:
显示文本: /path/to/File.java
隐藏链接: idea://open?file=/path/to/File.java&line=82&column=1可以理解成终端版的超链接:
<a href="idea://open?file=/path/to/File.java&line=82&column=1">/path/to/File.java</a>Ghostty 负责识别 OSC 8 超链接并交给 macOS 打开,macOS 再把 idea:// 分发给 Android Studio。
当前配置
~/.ripgreprc 中写入:
--hyperlink-format=idea://open?file={path}&line={line}&column={column}~/.zshrc 中写入:
export RIPGREP_CONFIG_PATH="/Users/markz/.ripgreprc"其中:
{path} rg 搜到的文件绝对路径
{line} 匹配所在行号
{column} 匹配所在列号怎么使用?
打开新的 Ghostty 终端,或者在当前终端执行:
source ~/.zshrc然后正常使用 rg:
cd /Users/markz/code/baidu/fc-native-android/nadclient_2
rg "PanelScrollView"在 Ghostty 里按住 Cmd,把鼠标移动到输出里的文件路径上,出现链接提示后点击即可跳转 Android Studio。
如果直接搜单个文件,
rg默认可能不打印文件名,因此不会出现可点击路径。需要加-H:
rg -H "class PanelScrollView" /Users/markz/code/baidu/fc-native-android/nadclient_2/repos/business/lib_nadcore_sdk/lib-business/src/main/webpanel/java/com/baidu/nadcore/webpanel/PanelScrollView.java怎么验证配置生效?
查看 rg 是否加载了配置:
rg --debug "class PanelScrollView" /Users/markz/code/baidu/fc-native-android/nadclient_2/repos/business/lib_nadcore_sdk/lib-business/src/main/webpanel/java/com/baidu/nadcore/webpanel/PanelScrollView.java如果看到类似内容,说明配置已经生效:
arguments loaded from config file: ["--hyperlink-format=idea://open?file={path}&line={line}&column={column}"]
hyperlink format: "idea://open?file={path}&line={line}&column={column}"也可以强制打印文件名并检查 OSC 8 控制序列:
rg --color=always -n -H "class PanelScrollView" /Users/markz/code/baidu/fc-native-android/nadclient_2/repos/business/lib_nadcore_sdk/lib-business/src/main/webpanel/java/com/baidu/nadcore/webpanel/PanelScrollView.java | perl -pe 's/\e/<ESC>/g'如果输出里出现下面这种片段,说明链接已经被 rg 写进终端输出:
<ESC>]8;;idea://open?file=/Users/markz/.../PanelScrollView.java&line=51&column=8<ESC>\这个方案的边界
这个方案只对 支持 OSC 8 hyperlink 输出的工具有效,例如 rg。
它不会让所有普通文本自动变成可点击 IDE 链接,比如:
echo "/Users/markz/code/xxx/File.java:82"这种文本仍然只是普通文本。
⚠️ Ghostty 文档里有
link这种按正则匹配终端文本的配置说明,但目前还标着不能完整配置,因此不适合作为稳定方案。
其他可选路线
Android Studio 内置 Terminal
Android Studio / IDEA 自带 Terminal 对项目内文件路径识别更原生,路径可以直接跳 IDE,但终端体验就不再是 Ghostty。
iTerm2 Semantic History
iTerm2 支持 Semantic History,可以定义 Cmd+点击文件路径后的动作,适合做全局 path:line 识别。
WezTerm hyperlink_rules
WezTerm 支持通过 Lua 配置 hyperlink_rules,可以把普通文本里的文件路径正则匹配成链接。
参考链接
相关笔记
- Android Studio
- Ghostty
- ripgrep
- PlantUML常用参数速查表