我试图重现史蒂夫·洛什的第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
答案 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
选项将默认打开。这可能会产生意想不到的效果。