【问题标题】:Mapping <C-j> in Vim for non-tex files, with Latex-Suite installed在 Vim 中为非 tex 文件映射 <C-j>,并安装了 Latex-Suite
【发布时间】:2021-09-30 22:00:30
【问题描述】:

我发现一些较早的帖子 here 讨论了在 vim 中映射 &lt;C-j&gt; 快捷方式的困难,即

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

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

【问题讨论】:

    标签: vim latex latex-suite


    【解决方案1】:

    唯一合理的解决方案是该插件的维护者将其所有特定于文件类型的映射移动到它们所属的 ftplugin。他们目前实现它们的方式是良好实践 (&lt;Plug&gt;) 和不良实践(全局文件类型特定映射)的愚蠢组合,所有这些都在 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 &lt;Plug&gt; 映射,以便用户轻松编写自己的映射。不过,IMAP_JumpForward 应该放在括号中。
    • :help hasmapto() 守卫毫无意义。
    • plugin/imaps.vim 是一个“全局插件”。因此,无论它做什么,都没有明确地作用于缓冲区或窗口,而是为每个缓冲区和窗口完成的。 &lt;C-j&gt; 映射才有意义……
      • 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 似乎做得更胜任。

    【讨论】:

    • 感谢您富有洞察力的评论。我过去曾强烈考虑过 vimtex 并且很想改用它 - 唯一的问题是我已经使用 latex-suite 快五年了,而且我知道所有的捷径就像我的手背一样。如果有一种简单的方法可以让 vimtex 以尽可能接近 latex-suite 的方式启动和运行,我会立即进行切换。
    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多