如果打开后立即退出,为什么 vim 会返回非零退出代码?

如果打开后立即退出,为什么 vim 会返回非零退出代码?

我在 Snow Leopard 上遇到了一个奇怪的问题:我通过简单地运行然后退出vim得到一个非零退出代码。vim

$ vim
# exit immediately using :q
$ echo $?
1

但是,如果我使用 的完整路径vim,我不会看到这种行为

$ /usr/bin/vim
# exit immediately using :q
$ echo $?
0

起初我以为vim来自我道路上较早的某个地方,但是:

$ which vim
/usr/bin/vim

所以我很茫然。可能是什么原因造成的?

更新:这个问题已经神奇地自行解决了,这让我非常怀疑。我目前最好的理论是,我的.vimrc插件有问题,我在以其他方式调整设置时意外修复了该问题。如果我能准确地追踪到我做了什么来修复它,我肯定会更新该信息。感谢您的回答。

答案1

你的vimrc中有吗filetype off?尝试将其替换为:

filetype on
filetype off

我在 OS X 上使用 Tim Pope 的 Pathogen 时遇到了这个问题。本文帮助我解决了这个问题。如果您使用病原体...

call pathogen#runtime_append_all_bundles()

...改为这样做:

filetype on
filetype off
call pathogen#runtime_append_all_bundles()
call pathogen#helptags()
filetype plugin indent on

http://andrewho.co.uk/weblog/vim-pathogen-with-mutt-and-git

答案2

我可以想到两种可能的解释。

  1. vim实际上是一个别名。注意which不显示别名,您应该type使用(除非您正在运行 csh 或 tcsh)。

  2. Vim 会在相对于其安装目录的路径中查找某个文件,该文件是通过查看argv[0](从 shell 传递的可执行文件的名称)确定的,如果通过相对路径调用,则无法找到该路径。这在技术上是可行的,但我认为 Vim 并没有真正做到这一点。

答案3

我通过简单地运行 vim 然后退出得到一个非零退出代码。

在这里,这种情况不会发生,因为有一个类似的系统:Snow Leopard 和 Vim 的库存版本。

尝试这个命令:

$ sudo dtruss vim +q

这将为您提供 Vim 在初始化然后立即关闭时进行的所有系统调用的列表。 (dtruss相当于strace在 Linux 上,如果您以前使用过的话。)

您要查找的是靠近末尾的一行,该行显示错误代码,通常为 -1。查看系统调用的参数应该会引导您找到问题所在。一种可能性很大的可能性是文件丢失,该文件可能会在通话中显示open()

如果以这种方式运行时 Vim 干净地退出,则可能存在权限问题,而需要sudo允许dtruss运行的问题正在解决。在这种情况下,您可能可以通过以下方式修复它修复权限

答案4

我遇到了这个返回码问题。我追溯到loadviewvimrc 中一个静默执行的命令,它提供了持久视图:

" Persistent views
if has("mksession")
    set viewdir=$HOME/.vimviews
    if has("unix")
        silent execute '!mkdir -p $HOME/.vimviews'
    endif
    au BufWinLeave * silent! mkview "make vim save view (state) (folds, cursor, etc)
    au BufWinEnter * silent! loadview "make vim load view (state) (folds, cursor, etc)
endif

当进入没有文件名的缓冲区时,silent! loadview将执行,隐藏错误

E32:无文件名

这也导致返回码被设置为 1。

相关内容