En OSX, vi parece devolver 1 inesperadamente a pesar de no haber error

Entonces, en stock Mac OSX Yosemite, si ejecuto vi /tmp/foo y luego :wq algo de text, y finalmente hago :Wq (un error común que hago) y luego :wq . Todo parecerá estar bien, pero por alguna razón el código de salida será 1. Si repito lo mismo, pero no lo hago :Wq luego devuelve 0.

Esto es enloquecedor para git commit, donde escribiré un post de confirmación, cometeré este error y de repente perderé mi post de confirmación porque las cosas vi no escribieron el file

¿Cómo puedo arreglar este comportamiento para que no vuelva a ocurrir y siempre devuelva 0 a less que haya un error real al escribir el file?

Esto se hace intencionalmente en vim:

  • el command ":wq" llama, ex_exit ,
  • que llama getout con un código de salida nominal 0 ,
  • en getout , comtesting si hay un error en ex-modo, comentando
     / * Cuando se ejecuta en modo Ex, un error hace que salgamos con una salida distinta de cero
      * código.  POSIX requiere esto, aunque no es 100% claro desde el
      * estándar.  * /
     if (exmode_active)
         exitval + = ex_exitval;
  • la variable ex_exitval es establecida por el post de error en emsg :
     called_emsg = TRUE;
     if (emsg_silent == 0)
         ex_exitval = 1;
  • y ex_exitval nunca se borra.

Entonces, el post de error "any" en ex-mode (the : commands) producirá este resultado. Una comprobación rápida muestra que el ZZ -modo vi también se ve afectado por los posts de error de modo ex.