根据文件类型设置 imap

根据文件类型设置 imap

我正在使用xmlomn​​icppcomplVim 插件,并利用这些插件为 '>' 键定义的两个插入映射。我的问题是,虽然omn​​icppcomplimap当我输入一个缓冲区时,插件会很高兴地按下“>”键filetype 进程或者C,但当它发生时,xml'>' 键的插件imap将不再起作用,因为当我进入文件类型的缓冲区时它不会重新映射自身xml。这导致我无法进一步使用映射在编辑 xml 文件时提供的功能,即自动写入结束标记(omn​​icppcompl地图仍然存在)。

我正在寻找的是这两个映射在各自的版本中可用filetype,并且我相信问题在于xml插件没有重新映射自身omn​​icppcompl可以。我尝试autocmd在 .vimrc 中写入 quick 来手动重新映射 '>' 键,但xml插件imap在其脚本中带有位的本地函数<SID>

有人知道我该如何解决这个问题吗?有没有办法强制xml插件重新运行其映射?我不太了解 vim 脚本以及插件如何操作,但这是因为xml插件没有autoload脚本?

作为参考,xml插件将 '>' 键映射到1485 行ftplugin/xml.vim,以及omn​​icppcompl插件将 '>' 键映射到第 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()

相关内容