修复 Ghostty 下 Tmux 的可点击超链接问题

解决在 Ghostty 终端中使用 tmux 时可点击超链接无法正常工作的问题。

在 Ghostty 终端中使用 tmux 时,可能会遇到可点击超链接无法正常工作的问题。我自己就遇到了。一开始在 GitHub Issues 里搜了一圈,试了各种建议的方案,都没用。于是我换了 Kitty ✋😭✋

最近又回头研究了一下,找到了可行的解决方案。

解决方案

TL;DR

  • 方案一:在 Ghostty 配置中禁用 mouse-shift-capture
  • 方案二:在 tmux 配置中禁用鼠标支持,即在 ~/.tmux.conf 中设置 set -g mouse off
Ghostty\TmuxIntegration: 关闭Integration: 开启
Shift Capture: False⌘ + Click⇧ + ⌘ + Click
Shift Capture: True⌘ + Click无法工作

方案一

Ghostty 有一个叫 mouse-shift-capture 的功能 [1],默认是关闭的。不知何时我在配置文件(~/.config/ghostty/config)中开启了这个功能,这就是为什么 ⇧ + ⌘ + Click 在我的笔记本上不生效的原因。

在 Ghostty 配置中注释掉或删除 mouse-shift-capture = true,就可以重新用 ⇧ + ⌘ + Click 在 tmux 中打开链接了。

原理解释

这个选项决定了谁来处理点击事件:终端(Ghostty)还是程序(Tmux)

  • 设为 true(失效):
    • Ghostty 将 ⇧ + ⌘ + Click 直接发送给 Tmux。
    • 结果:Tmux 收到了信号,但不知道怎么打开浏览器。
  • 设为 false(正常):
    • Ghostty 检测到 Shift 键,决定自己处理该事件,忽略 Tmux。
    • 结果:Ghostty 识别 ⌘ + Click 并帮你打开链接。

方案二

另一种方式是在 tmux 中禁用鼠标支持,即在 ~/.tmux.conf 中注释掉或删除 set -g mouse on

这样修改后,可以用 ⌘ + Click(无需 Shift)打开链接。但代价是你会失去 tmux 中的以下鼠标功能:

  • 在面板历史记录中鼠标滚动
  • 鼠标文本选择和复制
  • 鼠标标签/面板选择(点击聚焦标签/面板)
  • 鼠标面板调整大小(拖拽面板边框)

原理解释

我没有去翻 tmux 文档确认,但我的理解是:

  • 设为 on(拦截):
    • Tmux 告诉 Ghostty 由它来处理鼠标事件。
    • 结果:Ghostty 将普通点击转发给 Tmux。⌘ + Click 由 Tmux 处理,但 Tmux 不知道怎么打开浏览器,所以不生效。
  • 设为 off(正常):
    • Tmux 忽略鼠标,由 Ghostty 完全接管所有鼠标事件,不需要 绕过键。因此 ⌘ + Click 正常工作。

结语

我用 tmux 主要为了节省时间,比如:

  • tmux-floating-pane 快速执行操作而不用离开当前上下文,详情见 tmux_floating_pane
  • 用 tmux 的复制模式快速复制文本而不用切换到鼠标。

讽刺的是,我花在调试工具上的时间,可能比省下来的还多。tmux 值得这个成本吗?也许就像 Kitty 的开发者说的,“终端复用器是个坏主意” 😭

也许有一天我会放弃 tmux,但目前我真的需要浮动面板功能。[2]


  1. 决定运行中的程序是否能检测到鼠标点击时同时按下了 Shift 键。通常 Shift 键用于扩展鼠标选择范围。Option Reference - Configuration ↩︎

  2. 也许 Ghostty 未来会实现浮动面板功能 Float pane / popup support · ghostty-org/ghostty · Discussion #3197 ↩︎

CompactRelaxed
Normal1.70