如何强制 vi/vim 以状态 0 干净退出

Mas*_*eed 2 vim

使用 编辑时vim,正常退出代码为 0。例如:

vi; echo $?
Run Code Online (Sandbox Code Playgroud)

0如果你立即这样做就会回来:q但是,如果您输入错误的命令,它将返回1(或其他错误代码) 。例如,在 vim 中输入会出现错误。在那之后,无论我做什么,都会以状态 1 退出。:aaavimE492: Not an editor command: aaavim

这是编辑提交消息时的一个问题git,因为如果您在输入时犯了错误(在 中很容易做到vim),后续的提交消息将被丢弃。(是的,我知道有办法找回它 - 我不希望每次我知道自己犯了错误时都会遇到麻烦。)

问题:是否有vim命令将退出代码“重置”为 0?

这里有一个类似的问题:can i force vim to exit with 0 status。然而,这是由于使用vi而不是vim,如果您搜索不存在的字符串,它(显然)会以非零值退出。这个问题是专门关于vim.

编辑:谢谢您的回答!一些额外的细节:

  • 这是在 MacOS 11.2.1 上。
  • 我没有~/.vimrc,所以我只是回到 Mac 提供的/usr/share/vim/vimrc,这看起来很基本。
  • 调用vi -u NONE仍然会导致上述行为。
  • 最有趣的是)调用vim可以解决问题。是的,我知道我上面提到过另一个答案是使用vi而不是vim,但我被这个迷惑了:
$ which vi
/usr/bin/vi
$ which vim
/usr/bin/vim
$ ls -l /usr/bin/vi
lrwxr-xr-x  1 root  wheel        3 Jan  1  2020 /usr/bin/vi -> vim
Run Code Online (Sandbox Code Playgroud)

当我运行 或vi --versionvim --version,我得到完全相同的输出。是否vim根据调用的可执行文件名称改变其行为?如果是这样,我是否可以粘贴一些东西.vimrc来覆盖该开关是什么?我很想知道。与此同时,我可以用 来解决这个问题export EDITOR="vim"

bk2*_*204 7

默认情况下,如果发生“正常”错误(例如无效命令或另一个正常用户输入错误),Vim(以及至少 vi 的其他一些实现,例如 nvi)将返回 0。在这种情况下, ed 的行为退出非零值,正如您所发现的,这种行为通常是不可取的,因为人类是不完美的,会犯很多错误,这就是 Vim 不这样做的原因。

如果您使用 ,Vim 应该以非零值退出:cq,这是故意的,并且如果满足某些错误条件(例如,您运行vim -y但无法启动显示)。

您的配置设置或插件可能会导致此行为。您可以尝试运行来vim -u NONE -U NONE验证这一点,然后通过注释掉.vimrc. 也有可能您的 Vim 发行商认为这是一个理想的功能,可以为您添加和修补它,但您没有提到您的操作系统或 Vim 软件包的来源,所以很难说。

要始终强制零退出,您可以尝试:cq 0,但这并不比标准更有效:q,因为它们都使用完全相同的值getout(0) 调用完全相同的函数 ()。


qff*_*qff 6

我在 macOS 11.6 上也看到了这种行为,并且仅当作为vi\xe2\x80\x93 而不是调用时才会发生vim

\n

为什么会出现这种情况?

\n

如果我们看一下vim --version

\n
> vim --version                                                                                                                                                 \nVIM - Vi IMproved 8.2 (2019 Dec 12, compiled Aug 30 2021 06:51:40)\nmacOS version\nIncluded patches: 1-2029\nCompiled by root@apple.com\n
Run Code Online (Sandbox Code Playgroud)\n

这里的macOS 版本让我们知道可能会出现问题。

\n

main.c查看Apple的开源存储库(https://opensource.apple.com/source/vim/vim-91/src/main.c.auto.html )中的vim ,我们在int main()功能:

\n
> vim --version                                                                                                                                                 \nVIM - Vi IMproved 8.2 (2019 Dec 12, compiled Aug 30 2021 06:51:40)\nmacOS version\nIncluded patches: 1-2029\nCompiled by root@apple.com\n
Run Code Online (Sandbox Code Playgroud)\n

然后在void getout(int exitval)

\n
Unix2003_compat = 0;\nif (strcmp(base,"vi")==0) {\n    Unix2003_compat = COMPAT_MODE("bin/vi", "Unix2003");\n} else if (strcmp(base,"ex")==0) {\n    Unix2003_compat = COMPAT_MODE("bin/ex", "Unix2003");\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这里的部分Unix2003_compat不存在于官方 Vim 源代码中。

\n

因此,在 macOS 版本的 vim 上,如果调用为viex,您将得到此错误保留行为。

\n

注意: Apple URL 令人困惑 \xe2\x80\x93确实对应于 vim 8.2,可以通过在同一存储库中vim-91查看来检查。version.h

\n

解决方案

\n

调用 vim asvim而不是 as vi。如果将环境变量git设置为// .EDITORvim.bashrc.zshrcconfig.fish

\n

或者,通过 Homebrew 之类的工具安装官方 vim。

\n