vim - 映射在 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>
解决方案
唯一合理的解决方案是该插件的维护者将他们所有的文件类型特定映射移动到他们所属的 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似乎做得更胜任。
推荐阅读
- javascript - HTML DOM 渲染在 iPhone (iOS 13) 设备中被阻止
- reactjs - 使用语义-ui-react 在表中显示布尔值
- powershell - Powershell 脚本 - 仅以管理员身份运行某些命令,其余脚本以非管理员身份运行
- c# - 在 C# 中合并两个标签 ID 相同的 XML 文件
- openshift - Pod 级路由限制
- python - 如何使用 apply() 函数将字符串列转换为日期类型
- mongodb - 无法为 sharded MongoDB 集群的配置服务器启动副本集
- python - 有没有办法将操作设置为布尔值,然后创建一个 if 语句以在该操作完成时执行某些操作?
- jmeter - 如何在jmeter中运行选择性线程组
- python - 如何使用 Librosa 获得音频的音高?(不是二维数组,但与可丽饼类似)