Vimscript运算符待定映射产生"尾随字符"错误

时间:2018-04-27 15:55:49

标签: vim

我试图重现史蒂夫·洛什的第15章中的例子"学习Vimscript the Hard Way" (http://learnvimscriptthehardway.stevelosh.com/chapters/15.html),在名为"更改开始。"

的部分中

首先,我使用以下命令启动vim:

vim -u NONE foo

确保没有加载插件。 接下来我输入

print foo(bar)

在缓冲区中然后输入

:onoremap in( :<c-u>normal! f(vi(<cr>

最后,我将光标放在&#34; p&#34; in&#34; print&#34;并输入cin(。状态行显示:

:<c-u>normal! f(vi(<cr>

末尾有一个闪烁的光标。我按Enter键然后显示状态行:

E488: Trailing characters

根据这本书的预期结果是,vim将删除括号内容并将它们置于插入模式之间。

以下是版本信息:

VIM - Vi IMproved 8.0 (2016 Sep 12, compiled May  2 2017 03:55:34)
MacOS X (unix) version
Included patches: 1-596
Compiled by Homebrew

1 个答案:

答案 0 :(得分:1)

TL; DR:改为使用vim -u DEFAULTS foo

这应该使Vim处于'nocompatible'模式,这是在映射中识别<Key>代码所必需的。


您描述的症状与< included in 'cpoptions'一致,记录在案:

  

在映射,缩写和菜单命令的“ to”部分中禁用<>形式的特殊键代码的识别。例如,当包含:map X <Tab>时,命令X导致<Tab>映射到“ <”(5个字符)。但是如果排除了^I,则“ ^I”(<Tab>是真实的<)。

这与您在命令行中获得映射的文字结果而没有适当扩展<c-u><cr>键码是一致的。

'cpoptions'的默认值为:

  

Vim默认值:“ aABceFs”,
  Vi默认值:所有标志

因此,这意味着<(以及所有其他标志)将在Vi模式下默认包含,当设置'compatible'时(或更准确地说,当{{1} }未设置。)

事实证明,当您在命令行启动Vim中使用-u NONE时,它将以'nocompatible'模式启动。

您可以改用'compatible',它与-u DEFAULTS非常相似,但是它仍然会加载defaults.vim script shipped with Vim runtime,这将设置-u NONE

来自the docs

  

通过'nocompatible'(全部大写)时,其效果与-u DEFAULTS相同,但是加载了defaults.vim脚本,该脚本也将设置-u NONE。 / p>      

'nocompatible'参数与-u以外的其他参数一起使用会带来副作用,即DEFAULTS选项将默认打开。这可能会产生意想不到的效果。