跳转到内容

平台支持

Chord 主要在 macOS 上开发和测试。其他平台不同程度可用:大部分功能与平台无关,少数依赖 OS 特定能力,在其他平台会降级或 no-op。本页给出每个功能的真实支持情况、降级行为及各平台的额外安装要求。

功能 macOS Linux Windows WSL
核心 TUI(模式切换、消息、会话) ✅ ✅ ⚠️(尽力而为) ✅
chord headless JSON 控制面 ✅ ✅ ✅ ✅
Worktree(chord --worktree、chord worktree …) ✅ ✅ ✅ ✅
prevent_sleep(阻止系统休眠) ✅ ❌(no-op) ❌(no-op) ❌(no-op)
ime_switch_target(模式切换时自动切输入法) ✅1 ⚠️2 ✅3 ⚠️4
desktop_notification(终端通知) ⚠️5 ⚠️5 ⚠️5 ⚠️5
剪贴板图片/PDF 附件(Ctrl+V / Alt+V) ✅ ⚠️6 ⚠️6 ⚠️6
终端图片渲染(Kitty / iTerm2) ⚠️7 ⚠️7 ⚠️7 ⚠️7
LSP — gopls / typescript / rust-analyzer ✅8 ✅8 ✅8 ✅8
LSP — Pyright + 项目 venv 自动探测 ✅9 ✅9 ✅10 ✅9(仅 WSL Linux venv,详见下文)
MCP servers(stdio / HTTP) ✅ ✅ ✅ ✅
电源感知 idle 处理 ✅ ❌(no-op) ❌(no-op) ❌(no-op)

图例:✅ 支持 · ⚠️ 有注意事项 · ❌ 不支持 / no-op。

macOS 下用 caffeinate(1) 实现。Linux / Windows / WSL 上是 no-op。其他平台需常驻不休眠的话,直接用 OS 自带的电源设置。

首次运行向导只会在 macOS 上询问 prevent_sleep,并且必须由用户显式确认开启。它主要适用于长时间运行 agent、又不希望系统因空闲进入睡眠的场景。

从 Insert 切到 Normal 时,Chord 可调用 im-select(或 im-select.exe)切到指定 IM(通常是英文键盘布局),切回 Insert 时恢复原来的 IM。

在支持的平台上,首次运行向导也可能询问这个值。只有你平时确实使用中文 / 日文 / 韩文等输入法,并希望 Normal 模式快捷键更稳定,才建议配置。

~/.config/chord/config.yaml
ime_switch_target: com.apple.keylayout.ABC # macOS 示例
# ime_switch_target: 1033 # Windows 示例(locale id)

im-select 需单独安装。变量值就是字符串,Chord 原样传给 im-select,具体格式由该平台工具决定。

启用后,Chord 只在 agent 真正运行过然后停下(回合完成、被取消、loop 结束,或所有 SubAgent 都完成)以及权限、Question、Handoff、loop 决策、notify 协议纠正等待用户输入时发出终端通知转义序列;会话 / model pool / MCP 切换、空闲型斜杠命令这类用户主动操作导致回到 idle 时保持静默。Chord 不负责通知守护进程;具体显示依赖终端。

当前实现会按终端自动选择协议;不支持的终端通常会忽略该序列。

实践中:

  • Ghostty / WezTerm / Windows Terminal:Chord 会尝试使用 OSC 777
  • iTerm2:Chord 使用 OSC 9
  • 其他终端:Chord 保守回退到 OSC 9

tmux 中可能需要 set -g allow-passthrough on,通知序列才可能透传到宿主终端。

多数终端(包括 Ghostty 和 iTerm2)在自己处于前台时会抑制通知横幅和声音:正盯着终端看时,OSC 通知通常是无声的。因此 Chord 的每条通知都会附带一声终端铃声(BEL),终端把铃声当作注意力信号而不是通知,行为和横幅不同。想聚焦时完全静音,可设 desktop_notification_foreground: false。

很多终端默认不响铃,开启方式也各不相同:

  • Ghostty(macOS 需 ≥ 1.3,GTK 需 ≥ 1.2):在 Ghostty 配置里加 bell-features = system,audio(system 播系统警示音,audio 可用 bell-audio-path、bell-audio-volume 播自定义音频);attention(Dock 跳动)和 title(标题加 🔔)默认开启。
  • iTerm2:Settings → Profiles → Terminal → Notification Center alerts,按 profile 配置;「Silence bell」必须关闭,铃声才会到达通知中心。
  • kitty:kitty.conf 里的 enable_audio_bell / visual_bell_duration。
  • tmux:铃声按窗口经 monitor-bell / bell-action 路由;set -g bell-action any 可以在其他窗口收到提醒。
  • Windows Terminal:默认播系统音,可在 Terminal 设置 → Advanced → Bell notification style 里调整或静音。

没列到的终端可能完全忽略 BEL,或只闪烁窗口;具体看对应终端的 bell/attention 配置文档。

Ctrl+V 或 Alt+V 会从系统剪贴板读取图片或 PDF 并作为附件添加。读取及图片转换都在后台异步执行,因此 TUI 不会被阻塞;读取完成前会暂时阻止发送。普通终端 paste 事件(包括 macOS 常见的 Cmd+V)只粘贴文本,绝不会探测剪贴板附件。

Chord 通过各平台自己的后端读取剪贴板:Linux 和 Windows 用原生库,macOS 用系统 osascript。剪贴板图片按 PNG、macOS 的 TIFF、JPEG、WebP、BMP、GIF 的顺序读取;PNG 与 JPEG 以外的格式会归一化为两者之一;长边超过 2000px 的图片会缩小,PNG 和 JPEG 也不例外(动画 WebP 和 GIF 取首帧)。若同时提供 PDF 和图片表示,优先附加 PDF;如果没有支持的附件,会显示提示且不会回退为文本。

每条输入框消息最多支持 5 张 inline 图片附件。手动输入 [image1] 这类占位符文本本身不会附加图片;只有 Chord 内部插入的 inline 占位符才会绑定真实附件。

常见情况:

  • macOS + iTerm2 / WezTerm / Ghostty:Ctrl+V 附加剪贴板附件,Cmd+V 粘贴文本。
  • macOS + cmux:剪贴板附件请使用 Ctrl+V。Cmd+V 可能被 cmux 截获并转换成临时文件路径文本。
  • Linux Wayland / X11:compositor 提供 data-control,或 X11/XWayland display 可用时,Ctrl+V 读取本机剪贴板。
  • Windows Terminal / 由其承载的 WSL:请使用 Alt+V;Windows Terminal 默认把 Ctrl+V 用于普通文本粘贴。WSLg 提供的 BMP 剪贴板图片会在附加前归一化。
  • tmux / SSH 内部:Chord 读取运行所在机器的剪贴板,不会自动读取终端客户端剪贴板。

macOS 上的探测在短生命周期的 osascript 进程里完成,剪贴板框架不会载入 Chord 进程本身,读取结束内存即回收。不需要额外安装任何东西:读取逻辑内置于 chord。

剪贴板附件不可用时,你仍可给 insert_attach_file 绑定快捷键,再通过输入框里的路径附加图片/PDF。

Chord 当前自动检测并启用:

  • Kitty graphics(kitty、Ghostty)
  • iTerm2 inline images(iTerm2、WezTerm)

如果终端不支持这些协议,图片附件仍会发给模型,只是 TUI 内不预览。

说明:

  • Sixel 目前未实现为 Chord 后端
  • tmux / zellij 内默认保守禁用图片预览,避免常见 passthrough / 占位符兼容问题
  • 高级用户可用环境变量覆盖自动检测:CHORD_IMAGE_BACKEND=kitty|iterm2|none,以及 CHORD_IMAGE_INLINE=0|1、CHORD_IMAGE_FULLSCREEN=0|1

未在配置中手动指定 Python 解释器时,Chord 从 LSP root 向上按以下顺序查找最近的项目 venv,且不会越过 Chord 项目根:

  • 类 Unix(macOS、Linux、WSL):.venv/bin/python → venv/bin/python → env/bin/python
  • Windows:.venv\Scripts\python.exe → venv\Scripts\python.exe → env\Scripts\python.exe

WSL 自动探测不会选 Scripts\python.exe 里的 Windows venv。WSL 内开发请在 WSL 里建 Linux venv,或在 lsp.pyright.options 中显式设置 python.pythonPath。

详见 扩展与定制:LSP。

很多「macOS 上能用、Linux 不行」的反馈实际是终端模拟器差异,而非 OS 差异。推荐以下终端以获得最佳体验:

  • iTerm2(macOS):图片预览、终端通知、剪贴板图片粘贴
  • Ghostty(跨平台):图片预览、终端通知(会尝试 OSC 777)
  • WezTerm(跨平台):图片预览、终端通知(会尝试 OSC 777)、剪贴板图片粘贴
  • kitty(Linux/macOS):图片预览、终端通知
  • Windows Terminal:作为通用 TUI 没问题;图片协议和通知依赖版本/宿主链路
  • macOS 自带终端(Terminal.app):基础 TUI 使用没问题,但它 不一定能可靠区分修饰后的 Enter(例如 Shift+Enter)。在输入框里需要换行时请用 Ctrl+J,或改用 iTerm2 / Ghostty / WezTerm 获得完整按键行为。

按键区分提示:在 tmux / zellij 这类终端复用器里,Shift+Enter 这类「带修饰键的 Enter」可能会丢失或被改写(取决于外层终端与复用器的 extended keys 配置)。不确定时请直接用 Ctrl+J 换行(所有终端都可用)。

tmux、screen 在 Chord 与终端之间又多一层;部分功能(终端通知、某些图片流程)需要显式配置 pass-through,而且 Chord 当前默认会在 tmux / zellij 内禁用图片预览。

Chord 能在 Windows 上跑,但 Windows 不是主要平台。具体:

  • TUI 在现代终端(Windows Terminal、WezTerm)下工作正常。
  • prevent_sleep 是 no-op:请用 Windows 电源设置。
  • ime_switch_target 需要 im-select.exe。
  • 工具调用中的文件路径走 Windows 风格,反斜杠原样保留。
  • shell(前台命令与后台 job)在 Windows 上也仍是非交互的,但超时 / 取消清理依赖直接终止进程,而不是 Unix 风格的 session / 进程组控制;因此对后代进程的清理可能不如 Unix 完整。
  • 遇到 Windows 特有 bug 的话,更可能是「还没人踩到」而非「故意不支持」。请用 Ctrl+G 导出诊断包再上报。

WSL 大致表现得像 Linux:

  • Chord 作为 Linux 二进制在 WSL 内运行;sessions、配置用 Linux 路径(~/.config/chord/ 等)。
  • prevent_sleep 是 no-op;请用宿主 Windows 的电源设置。
  • ime_switch_target 通常通过 Windows interop 调 im-select.exe。
  • Pyright venv 自动探测在 WSL 内使用 Linux venv(.venv/bin/python 等);Windows 风格 Scripts\python.exe venv 不会被选。
  • 终端能力取决于宿主 Windows 上跑的终端(Windows Terminal、WezTerm、Ghostty 等)。

报 bug 怀疑与平台相关时请附上:

  • OS 与版本
  • 终端模拟器与版本
  • 是否在 tmux / screen / WSL 内
  • 一份诊断包(Ctrl+G)

日志位置和包结构见 常见问题排查:何时检查日志。

  1. 需要 PATH 中存在 im-select 二进制(Windows 用 im-select.exe)。Chord 只做集成,不附带二进制。 ↩

  2. im-select 始于 macOS;Linux 上可用兼容 build 或自己写一个同 CLI 的 wrapper 脚本。 ↩

  3. 用 im-select.exe(如 https://github.com/daipeihust/im-select#-windows)。 ↩

  4. WSL 内通常希望切换 Windows 端的 IM;一般通过 interop 调 im-select.exe,可能需要配 PATH 或 wrapper。 ↩

  5. 通知能力取决于终端而非 OS。Chord 会按终端自动选择通知转义序列(OSC 9 或 OSC 777);不支持的终端通常会忽略该序列。详见下文 终端兼容。 ↩ ↩2 ↩3 ↩4

  6. Ctrl+V / Alt+V 通过原生后端读取系统剪贴板。是否可用仍取决于本机 display/clipboard 环境;远程 SSH 会话通常读取远端主机剪贴板,而不是终端客户端剪贴板。Windows Terminal 会占用 Ctrl+V,因此 Windows 及其承载的 WSL 会话请使用 Alt+V。 ↩ ↩2 ↩3

  7. 图片渲染当前自动检测 Kitty graphics 与 iTerm2 inline images(Ghostty 走 Kitty,WezTerm 走 iTerm2)。三者都不支持时,图片附件仍可发给模型,但 TUI 内无预览。tmux / zellij 内默认保守禁用。 ↩ ↩2 ↩3 ↩4

  8. 需要本地装好对应 language server(如 gopls、typescript-language-server、rust-analyzer)。Chord 不打包它们。 ↩ ↩2 ↩3 ↩4

  9. 类 Unix 下 Chord 从 LSP root 向上查找最近的 .venv/bin/python、venv/bin/python、env/bin/python。 ↩ ↩2 ↩3

  10. Windows 下 Chord 探测 .venv\Scripts\python.exe、venv\Scripts\python.exe、env\Scripts\python.exe。 ↩