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


15

vim在Snow Leopard上,我遇到了一个奇怪的问题:通过简单地运行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或我的插件有问题,在以其他方式调整设置时意外修复了该问题。如果我可以准确地找到解决问题的方法,那么我肯定会更新该信息。感谢您的回答。


我通过添加来将-u NONE其修复在Makefile中,这告诉vim根本不加载任何配置文件。在某些情况下可能会有所帮助。
Boldewyn

Answers:


14

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

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


这是个好的观点。我已经解决了这个特定问题,但是正是这导致我怀疑我不小心修复了我其他地方的错误.vimrc
汉克·盖伊

这为我解决了一个相同的问题,除了Vundle而不是Pathogen。
乔纳·布劳恩

就像添加另一个+1一样,这是一个旧的修复程序,但是它对我来说在OSX系统上使用Vundle修复了此问题。只是filetype on超越现有的filetype off
Mikey TK 2015年

8

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

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

  2. Vim会在相对于其安装目录的路径中查找某个文件,该文件由其确定argv[0](通过外壳程序传递的可执行文件的名称)来确定,如果通过相对路径调用该文件,则某种程度上找不到该路径。从技术上讲,这是可能的,但我不认为Vim确实会这样做。


7

我从简单地运行vim然后退出就得到了一个非零的退出代码。

使用类似的系统在这里不会发生这种情况:Snow Leopard和Vim的普通版本。

试试这个命令:

$ sudo dtruss vim +q

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

您要查找的是靠近结尾的一行,该行显示错误代码,通常为-1。查看系统调用的参数将导致您遇到问题。一种高度可能的可能性是文件丢失,该文件可能会出现在open()通话中。

如果以这种方式运行时Vim干净退出,则可能是权限问题,sudo允许dtruss运行该权限问题。在这种情况下,您可以通过修复权限来修复它。


抱歉-我现在在我的工作计算机上,它没有这种行为。不过,我一定会在再次进入家用计算机后将其签出。
汉克·盖伊

如果您无法解决,请将dtruss输出附加到您的问题。(或者至少是最后25行左右。)您无法理解的内容可能会导致另一个人获得正确的答案。
沃伦·杨

@nlucaroni:很高兴听到它。但是,对于后代来说,我的回答中的两个想法中的哪个固定了?也就是说,您是否遇到一个sudo“已修复” 的权限问题,让您知道需要运行“修复权限”?还是它dtruss向您显示了syscall错误,如果是,哪个错误以及为什么失败?
沃伦·杨

打开不存在的文件时出现syscall错误。我的同事刚刚在别人的zipp .vim目录中找到.vimrc,并且东西中有完整的路径,而未使用的插件中缺少文件。
nlucaroni

2

我遇到了此返回码问题。我将其追溯到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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.