如何在.vimrc文件中检测vi(而不是vim)?

20

我在所有工作的机器上都携带一个vimrc文件,它自然包含一些在旧版本vi中不存在的选项。

如果我在一个没有将vi别名设置为vim和/或没有安装vim的机器上意外启动了vi会话,vi将读取vimrc并抛出一堆烦人的错误,提示我某些选项不受支持。

我知道我可以始终键入"vim"而非"vi",并设置EDITOR变量为vim(针对visudo等),但我是否可以在vimrc的顶部添加一行,以便在vi读取文件时提前退出脚本?

4个回答

40
如果vi实际上不是vim的链接,那么它不应该读取.vimrc,而应该读取.exrc。它读取.vimrc的事实表明它实际上是vim的早期版本。如果是这种情况,您可以使用vim的“if”结构来括起较新的功能,像这样:
:if version >= 500
:  version-5-specific-commands
:endif

类型:

:help if

当在vim中时,获取更多信息。


输入 :version 命令可以查看 Vim 的版本信息。 - George V. Reilly
1
@anon,谢谢,这个方法确实有效,但是当我执行 vi --version 命令时,它显示的是 VIM - Vi IMproved 7.2 (2008 Aug 9, compiled Feb 17 2012 10:24:10),所以这是一个关闭了某些功能的 VIM 编译的 vi。从描述中我可以看到这是“没有 GUI 的小版本”。但是为什么这个方法有效呢?我有什么遗漏吗? - garg10may

14
如果您想更具体地检查,请单独检查功能。
我将其放在我的.vimrc文件中:
if has("eval")
    " Syntax stuff
    let java_highlight_all=1
endif


if has("autocmd")
    " Buffers
    autocmd BufEnter * cd %:p:h
endif

7

非Vim无法读取.vimrc文件,它会寻找.exrc文件。您可以使用“if version >= 500”来检测旧版本的Vim。


为什么版本号>=500适用于vim而不是vi,在我的机器上,vim的版本号是7.4,vi也显示为7.4。这个检查是如何区分这两者的呢?顺便说一句,它确实有效。 - Prabhat Kumar Singh
@PrabhatKumarSingh 可能你的“vi”实际上是指向vim的符号链接。但是如果可执行文件名为vi,vim足够聪明,会恢复到vi兼容模式。 - Paul Tomblin
@paul-tombolin,但是这个版本检查是如何工作的,我怎样才能手动查看vi和vim之间的区别呢?因为正如我上面所说的vim --version VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jan 29 2020 08:09:16)即7.4,那么这里的500是什么意思? - Prabhat Kumar Singh

4

“vi”会读取vimrc文件,因为它肯定是使用名称“vi”编译的Vim。而且很可能编译时设置了“非常Vi兼容”的选项,所以你可以尝试检查“compatible”功能来检测“vi”:

if !has("compatible")
   let g:loaded_matchparen=1
   syntax off
endif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接