微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Vim 中为非 tex 文件映射 <C-j>,并安装了 Latex-Suite

如何解决在 Vim 中为非 tex 文件映射 <C-j>,并安装了 Latex-Suite

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

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

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

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。