首页 > 解决方案 > 映射在 Vim 中用于非 tex 文件,安装了 Latex-Suite

问题描述

我在这里找到了一些较旧的帖子,讨论了在 vim 中映射快捷方式的困难<C-j>,即

map <C-j> <C-w>j

由于latex-suite 使用<C-j>在文本中向前跳转。我处于类似的情况,但我想在编辑 tex 文件时保留 latex-suite 的正常快捷方式,并且只在编辑非 tex 文件时使用新映射。我对为什么这不是默认行为感到有些困惑 -即使我没有加载 tex 文件并且其他快捷方式(如映射到)没有,latex-suite 的<C-j>快捷方式在输出中显示为快捷方式工作。我是否正确理解,与大多数latex-suite 的快捷方式不同,这个来自latex-suite 的快捷方式由于某种原因被加载而不管文件类型如何?如果是这样,我该如何让它只为 tex 文件加载,以便我可以为非 tex 文件使用其他映射?:map`a\alpha<C-j><C-j>

标签: vimlatexlatex-suite

解决方案


唯一合理的解决方案是该插件的维护者将他们所有的文件类型特定映射移动到他们所属的 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似乎做得更胜任。


推荐阅读