gVim的.vimrc不尊重条件语句

时间:2017-01-13 00:22:06

标签: vim

我在我的Windows 10系统上安装了gVim 8.0.69以及Cygwin。我使用相同的.vimrc来保持它们同步。有些设置不适用于两者,所以我在.vimrc中使用了一些条件表达式来有选择地应用设置:

if !(has("gui_running"))
  if version >= 747
    " line 199 is the next line
    set listchars=eol:-|,tab:>_,trail:~,extends:>,precedes:<,space:_ 
  else 
    set listchars=eol:-|,tab:>_,trail:~,extends:>,precedes:<,
  endif
endif

gVim在启动时报告以下错误:

Error detected while processing C:\Users\<user name>\.vimrc:
line  199:
E488: Trailing characters: ,tab:>_,trail:~,extends:>,precedes:<,space:_

行号是指第一个set listchars命令。

在gVim窗口中执行:echo !(has("gui_running"))报告0:echo has("gui_running")返回1,因此我知道条件在程序启动后正确评估

为什么这条线甚至被执行?

2 个答案:

答案 0 :(得分:3)

问题不仅来自|字符,而且主要来自输入字符串设置eol的字符数。

:help listchars开始说:

                        *lcs-eol*
  eol:c Character to show at the end of each line.  When
        omitted, there is no extra character at the end 

这意味着eol 最多需要 1个单一字符,但您给了它两个:-|。< / p>

如果您仍想按eol列出|,则需要转义,以便它不会被解释为管道。

在这种情况下确切的set cmd:

set listchars=eol:\|,tab:>_,trail:~,extends:>,precedes:<,space:_ 

答案 1 :(得分:2)

我不确定,但vim仍然需要扫描命令才能找到相应的elseendif

那里有一个|; |是一个命令分隔符。你可以写

if ...
    set foo=bar|endif

所以vim必须查看管道后面的部分才能看到它是什么命令。

我认为您需要使用set listchars=eol:-\|,tab:>_,...转义管道。