在 OSX 上,尽管没有错误,vi 似乎还是意外返回 1

在 OSX 上,尽管没有错误,vi 似乎还是意外返回 1

因此,在普通的 Mac OSX Yosemite 上,如果我运行vi /tmp/foo然后输入一些文本,最后执行:Wq(我常犯的一个拼写错误),然后:wq.一切看起来都很好,但由于某种原因退出代码将为 1。如果我重复同样的事情,但不这样做,:Wq那么它会返回 0。

这对于 git commit 来说是令人抓狂的,我将在其中输入提交消息,犯这个错误并突然丢失我的提交消息,因为 git things vi 没有写入文件

我怎样才能修复这种行为,使其不再发生并始终返回 0,除非写入文件时出现真正的错误?

答案1

这是在 vim 中故意完成的:

  • ":wq"命令调用,ex_exit,
  • 哪个调用getout带有名义退出代码0,
  • getout,它检查 ex-mode 中的错误,注释
    /* 当在 Ex 模式下运行时,错误导致我们以非零退出退出
     * 代码。 POSIX 要求这样做,尽管从
     * 标准。 */
    如果(exmode_active)
        退出值 += ex_exitval;
  • ex_exitval变量由错误消息设置emsg:
    被叫_emsg = TRUE;
    如果(emsg_silent == 0)
        ex_exitval = 1;
  • 并且ex_exitval绝不已清除。

因此,ex 模式下的“任何”错误消息(:命令)将产生此结果。快速检查表明 vi 模式ZZ也受到 ex 模式错误消息的影响。

相关内容