我正在使用xml和omnicppcomplVim 插件,并利用这些插件为 '>' 键定义的两个插入映射。我的问题是,虽然omnicppcomplimap
当我输入一个缓冲区时,插件会很高兴地按下“>”键filetype
进程或者C,但当它发生时,xml'>' 键的插件imap
将不再起作用,因为当我进入文件类型的缓冲区时它不会重新映射自身xml。这导致我无法进一步使用映射在编辑 xml 文件时提供的功能,即自动写入结束标记(omnicppcompl地图仍然存在)。
我正在寻找的是这两个映射在各自的版本中可用filetype
,并且我相信问题在于xml插件没有重新映射自身omnicppcompl可以。我尝试autocmd
在 .vimrc 中写入 quick 来手动重新映射 '>' 键,但xml插件imap
在其脚本中带有位的本地函数<SID>
。
有人知道我该如何解决这个问题吗?有没有办法强制xml插件重新运行其映射?我不太了解 vim 脚本以及插件如何操作,但这是因为xml插件没有autoload
脚本?
作为参考,xml插件将 '>' 键映射到1485 行的ftplugin/xml.vim
,以及omnicppcompl插件将 '>' 键映射到第 40 行的autoload/omni/cpp/complete.vim
我将非常感谢任何关于如何修复/解决此问题的帮助和建议。
答案1
我只是快速浏览了这两个文件,从我收集的信息来看,插件中的映射似乎正确完成xml
:
inoremap <silent> <buffer> > ><Esc>:call <SID>CloseTagFun()<Cr>
而在插件中,操作不正确omnicppcomplete
:
inoremap <expr> > omni#cpp#maycomplete#Arrow()
当进行这种映射时,插件作者应尝试尽可能地限制其范围:特定于文件类型的映射应该是缓冲区本地的,<buffer>
如第一个示例中所示。
就目前情况而言,根据您加载文件的方式,cpp
映射可能会优先于xml
映射,因为它似乎过于广泛地应用于整个 Vim 实例而不是cpp
缓冲区。
此外,该omnicppcomplete
插件不使用ftplugin
针对特定文件类型而言的常态。
作为一个立即的解决方案,我建议您添加<buffer>
映射cpp
,如果有效,尝试联系作者并说服他/她修改上游插件。
inoremap <buffer> <expr> > omni#cpp#maycomplete#Arrow()