我在 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
答案2
我可以想到两种可能的解释。
vim
实际上是一个别名。注意which
不显示别名,您应该type
使用(除非您正在运行 csh 或 tcsh)。Vim 会在相对于其安装目录的路径中查找某个文件,该文件是通过查看
argv[0]
(从 shell 传递的可执行文件的名称)确定的,如果通过相对路径调用,则无法找到该路径。这在技术上是可行的,但我认为 Vim 并没有真正做到这一点。
答案3
我通过简单地运行 vim 然后退出得到一个非零退出代码。
在这里,这种情况不会发生,因为有一个类似的系统:Snow Leopard 和 Vim 的库存版本。
尝试这个命令:
$ sudo dtruss vim +q
这将为您提供 Vim 在初始化然后立即关闭时进行的所有系统调用的列表。 (dtruss
相当于strace
在 Linux 上,如果您以前使用过的话。)
您要查找的是靠近末尾的一行,该行显示错误代码,通常为 -1。查看系统调用的参数应该会引导您找到问题所在。一种可能性很大的可能性是文件丢失,该文件可能会在通话中显示open()
。
如果以这种方式运行时 Vim 干净地退出,则可能存在权限问题,而需要sudo
允许dtruss
运行的问题正在解决。在这种情况下,您可能可以通过以下方式修复它修复权限。
答案4
我遇到了这个返回码问题。我追溯到loadview
vimrc 中一个静默执行的命令,它提供了持久视图:
" 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。