唯一合理的解决方案是该插件的维护者将他们所有的文件类型特定映射移动到他们所属的 ftplugin。他们目前实现它们的方式是良好实践(<Plug>
)和不良实践(全局文件类型特定映射)的愚蠢组合,所有这些都在plugin/
. 这真是太糟了。
他们目前在做什么:
" in plugin/imaps.vim
inoremap <silent> <Plug>IMAP_JumpForward <C-\><C-N>:call IMAP_Jumpfunc('', 0)<CR>
if !hasmapto('<Plug>IMAP_JumpForward', 'i')
imap <C-J> <Plug>IMAP_JumpForward
endif
- 第一个映射没问题:插件作者应该
:help <Plug>
尽可能多地使用虚拟映射,以便让用户轻松编写自己的映射。IMAP_JumpForward
不过,应该在括号中。
:help hasmapto()
守卫毫无意义。
plugin/imaps.vim
是一个“全局插件”。因此,无论它做什么,都没有明确限定在缓冲区或窗口的范围内,而是为每个缓冲区和窗口完成的。这种<C-j>
映射只有意义……
- 在
tex
文件的上下文中,当使用那个latex-suite插件时,
- 如果您实际上
imaps.vim
在其他地方使用该插件。
他们应该做什么:
" in plugin/imaps.vim
inoremap <silent> <Plug>(IMAP_JumpForward) <C-\><C-N>:call IMAP_Jumpfunc('', 0)<CR>
" in ftplugin/**/<somefile>.vim
imap <buffer> <C-J> <Plug>(IMAP_JumpForward)
坦率地说,这个东西的设计方式应该引发各种危险信号。我根本不做 (la)tex 但https://github.com/lervag/vimtex似乎做得更胜任。