zsh不控制光标形状或闪烁,真正决定光标行为的是终端模拟器(如iTerm2、Terminal.app)设置及macOS系统光标策略;需在终端首选项中关闭闪烁并设为Block或Bar样式,同时可执行defaults命令禁用全局光标闪烁。
这不是 zsh 本身的问题,而是终端应用(如 terminal.app 或 iterm2)和系统级光标渲染机制共同作用的结果。zsh 不控制光标形状或闪烁行为,它只负责命令行输入逻辑;真正决定光标是否闪烁、是竖线还是方块、是否实心的,是终端模拟器的设置 + macos 系统光标策略 + 个别应用的覆盖逻辑。
检查并关闭终端自身的光标闪烁设置
iTerm2 和 Terminal.app 都提供独立的光标样式控制,优先级高于系统设置:
- iTerm2:打开 Preferences → Profiles → Text,找到 Cursor 区域,将 Blinking cursor 取消勾选;同时把 Cursor type 设为 Block(实心方块)或 Vertical bar(竖线),确认“Blinking”已关。
- Terminal.app:进入 Settings → Profiles → Text,点击 Cursor 下拉菜单,选择 Block 或 Bar,然后确保 Blink cursor 处于关闭状态(macOS Sonoma 及更新版本中该开关明确可见)。
禁用 macOS 全局光标闪烁(对所有原生文本框生效)
即使终端关了闪烁,某些情况下系统级设置仍会干扰。运行以下命令彻底关闭:
defaults write -g NSTextInsertionPointBlinkPeriodOff -float 0
defaults write -g NSTextInsertionPointBlinkPeriodOn -float 999999999999
执行后重启终端应用(不是重启 Mac),或运行 killall Finder 让部分 UI 设置生效。
排查插件或主题导致的意外覆盖
极少数 zsh 主题(如部分自定义 agnoster 分支)或 oh-my-zsh 插件(如 zsh-autosuggestions 的旧版)会在渲染提示符时误触终端光标模式。可临时验证:
- 在终端中运行 DISABLE_AUTO_UPDATE=true ZSH_DISABLE_COMPFIX=true sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" 重装干净 oh-my-zsh;
- 编辑 ~/.zshrc,注释掉所有
ZSH_THEME=和plugins=(...)行,仅保留 ZSH_THEME="robbyrussell"; - 运行 source ~/.zshrc,观察光标是否恢复正常——若恢复,说明原主题或某插件触发了终端 escape 序列冲突。
补充:iTerm2 中“实心方块”光标不闪烁但看起来像在抖动?
这通常是字体渲染与光标尺寸不匹配所致。尝试:
- 在 iTerm2 → Profiles → Text 中,关闭 Use system font,改用等宽字体如 JetBrains Mono Nerd Font 或 Fira Code;
- 勾选 Draw bold text in bold font 和 Antialias text;
- 将 Cursor boost 调至 100%,避免因 subpixel 渲染导致边缘模糊引发视觉抖动。


















