Mac终端中连字符被自动替换为长破折号,需关闭系统“智能引号与破折号”总开关、清除文本替换规则,并执行defaults命令刷新文本服务。

你在Mac终端里输入--help或git log --oneline时,发现连字符被悄悄替换成长破折号—,导致命令执行失败、复制粘贴出错、脚本运行中断——这不是字体渲染问题,而是系统级文本自动替换在终端中意外生效。
关闭系统级“智能破折号”总开关
这一步禁用 macOS 全局排版引擎对--的自动转换逻辑,影响 Terminal、iTerm2、VS Code 终端面板等所有基于 Cocoa 文本视图的终端环境。
1、点击屏幕左上角苹果菜单 → “系统设置”。
2、左侧边栏点“键盘” → 右侧切换到“文本”标签页(注意:不是“文本输入”,是独立的“文本”页签)。
3、向下滚动找到“智能引号与破折号”区域 → 关闭【使用智能引号和破折号】总开关。
4、确认下方三项子选项——【智能引号】、【智能破折号】、【智能省略号】——全部处于关闭状态。只要其中任一开启,--仍可能被转为—,尤其在 iTerm2 或 VS Code 内置终端中高频触发。
清除残留的文本替换规则
系统“文本替换”功能可能埋藏了隐蔽的破折号映射项,比如输入--→ 输出—,这类规则优先级高于系统总开关,会在终端输入框中静默生效。
进入“系统设置” → “键盘” → “文本替换”。
滚动列表,查找目标含连字符的条目(例如:输入--→ 输出—;输入---→ 输出—;输入-- → 输出— )。
逐行鼠标悬停 → 点击右侧减号(−)按钮移除。特别注意删除以英文连字符开头、输出为长破折号或全角符号的规则。未删除的此类规则会在任何终端输入框中生效,包括 tmux 会话内、zsh 补全提示后、甚至 ssh 连接远程主机时的本地输入框。
验证并强制刷新终端文本服务
关闭图形界面开关后,Terminal.app 可能仍缓存旧策略,需手动刷新底层文本服务。
打开终端,依次执行:
defaults write -g NSAutomaticTextReplacementEnabled -bool false → 回车
killall -u $USER CoreServicesUIAgent → 回车
关闭所有终端窗口 → 重新打开 Terminal.app。
输入echo --version,然后按空格键:若显示--version而非—version,说明已生效;若仍被替换,说明某处文本替换规则未清干净,需返回上一步复查。

















