如何让vi/vim输错命令后退出仍返回正常状态码0
vim 退出码异常问题说明
核心行为逻辑
vim 会通过启动时的可执行文件名(系统传入的argv[0]参数)自动判断运行模式:
- 以
vim、evim等原生衍生名称启动时,默认进入vim原生运行逻辑 - 以
vi、ex、view等传统POSIX兼容名称启动时,自动开启严格Vi兼容模式(compatible选项默认置为开启)
执行过错误命令后退出返回非零状态码,是POSIX Vi兼容模式的强制规则:规范要求vi运行过程中只要出现任何错误,退出时必须返回非零状态码;vim原生模式无该限制。
macOS环境中/usr/bin/vi为指向同个vim二进制的软链接,仅因启动名称为vi,即触发兼容模式的对应规则,和二进制版本无关。
对应解决方法
1. 手动重置退出码
临时场景下可直接执行命令强制指定退出码退出::cquit! 0
该命令无视运行过程中产生的错误状态,强制以指定退出码退出,参数0对应正常退出状态。
2. 永久配置方案
如需从根本上解决问题,可在~/.vimrc中按需加入以下配置:
- 方案一:全局关闭严格Vi兼容模式
新增配置行:
配置生效后,无论以何种名称启动vim,都会使用原生运行逻辑,不会因运行过程中的错误返回非零退出码。set nocompatible - 方案二:保留兼容模式特性,仅修正退出码规则
如需保留Vi兼容模式的其他操作特性,仅调整退出码逻辑,可新增自动命令配置:
该配置会在vim触发退出动作前,强制将退出状态码设为0,覆盖此前的错误标记。autocmd VimLeavePre * let v:exitid = 0
验证逻辑
可通过以下命令复现验证:
- 执行
vi -u NONE进入编辑器,输入错误命令后退出,返回码为1,符合兼容模式规则 - 执行
vi -u NONE -c "set nocompatible"进入编辑器,输入同样的错误命令后退出,返回码为0,和原生vim行为一致
临时设置export EDITOR="vim"的本质,是直接避开vi启动名称触发的兼容模式,和上述方案一的效果一致。
内容的提问来源于stack exchange,提问作者Mason Freed
相关产品推荐
相关产品推荐

