在发布我的问题时,我继续对此进行调查,并在提交之前发现了解决方案。这对未来的访问者可能很有价值。
答案是:set history 必须放在您的.vimrc 文件中的:set nocompatible 之后。尽管在该选项之前接受了一些其他作为 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 年开始使用的版本非常匹配,cmdline.c 中的 dosource 函数不接受任何标志参数并且不在处理.vimrc 时不要做任何特别的事情。您必须在.vimrc 中显式设置:nocompatible。
在较新的源代码中,函数do_source 通过一个标志知道它正在处理一个.vimrc 文件,如果该文件存在,它会调用options.c 中的一个名为vimrc_found 的函数来重置兼容性标志。
Vim 引入了这种行为,但没有为用户提供任何有用的诊断信息,这些用户在其 .vimrc 文件中继续拥有现在无用且可能有害的 :set nocompatible,并将 "onion in the varnish" 从一个系统带到下一个系统。
另外需要注意的是,resetting 兼容性选项在 Vim 3 中没有额外的副作用。只有 setting 选项(告诉 Vim 兼容)。您可以在doset 函数的param.c 源文件中看到这一点。有一个检查,如果刚刚调整的选项是兼容性选项,并且该选项现在是布尔真,然后调整无数其他设置,以便更像 Vi。关闭选项时没有设置历史为20这样的行为。
也就是说,既然:set nocompatible曾经除了清除compatible之外没有任何副作用,前面有其他设置也没关系。 Vim 维护者在:set nocompatible 中添加了副作用,而不关心老用户可能在他们的.vimrc 文件中仍然有这个命令,而不是在顶部。
TL;博士;我不是白痴。