在使用Vim 7.3的Ubuntu 12系统上,发生了一件奇怪的事情。我的:set history=500
文件中有~/.vimrc
。我在该文件中有许多设置都可以工作。历史记录功能有效:~/.viminfo
具有良好的权限,并且其中保留了一些内容:命令和搜索历史记录,光标在文件中的位置,寄存器的内容等。但是,在启动Vim之后,如果我:set all
,我会看到history=20
,尽管~/.vimrc
中有设置。
如果我以交互方式执行:set history=500
,那么它会坚持下去。
我对系统中所有与Vim相关的文件进行了递归搜索,寻找一个流氓set history
命令,但什么也没找到。
答案 0 :(得分:3)
在发布我的问题时,我继续对此进行调查,并在提交之前发现了解决方案。这对未来的访客来说很有价值。
答案是:set history
必须放在:set nocompatible
文件中.vimrc
之后。尽管在该选项之前接受了一些其他Vim扩展设置,例如:set backupdir
。
问题不在于兼容模式下:set history
被拒绝。
相反,:set nocompatible
具有将历史记录重置为默认值20的副作用:它是我正在寻找的“流氓命令”。
你可以试试这个:
:set nocompatible
:set history=500
:set nocompatible
:set history=500
命令生效,但第二个:set nocompatible
将history
更改为20!
注意:虽然今天处理.vimrc
文件意味着nocompatible
是正确的,正如评论所指出的那样,历史上并非如此。
您可以在Vim 3.0 sources中看到与我在1994年开始使用的版本非常接近的版本,dosource
中的cmdline.c
函数没有获取任何标志参数,并且在处理.vimrc
时不执行任何特殊操作。您必须在:nocompatible
中明确设置.vimrc
。
在较新的资源中,函数do_source
通过标志知道它正在处理.vimrc
文件,如果文件存在,它会在{{1}中调用一个名为vimrc_found
的函数这会重置兼容性标志。
Vim介绍了此行为,但没有为那些继续在options.c
文件中存在无用且可能有害的:set nocompatible
的用户提供任何有用的诊断信息,将"onion in the varnish"从一个系统带到下。
另外需要注意的是,重置兼容性选项在Vim 3中没有其他副作用。只有设置选项(告诉Vim兼容)。您可以在.vimrc
函数的param.c
源文件中看到这一点。有一个检查,如果刚刚调整的选项是兼容性选项,并且该选项现在是布尔值true,那么调整无数其他设置以便更像Vi。关闭选项时,没有将历史记录设置为20的行为。
换句话说,由于doset
除了清除:set nocompatible
之外没有任何其他副作用,并不重要,因为它之前有其他设置。 Vim维护者为compatible
添加了副作用,但没有关心旧用户可能仍然在他们的:set nocompatible
文件中使用此命令,而不是在顶部。
TL; DR;我不是白痴。