首页 > 解决方案 > :source $MYVIMRC 不适用于我的原始缓冲区

问题描述

我有这个映射在我的.vimrc

:map <leader>e :vsplit $MYVIMRC<cr>
:map <leader>ee :tabedit $MYVIMRC<cr>
:map <leader>s :source $MYVIMRC<cr>

我可以在新选项卡中编辑或拆分(所以现在我有 2 个缓冲区 -.vimrc和原始缓冲区)但是当我对我.vimrc的 进行一些更改时,返回原始缓冲区(按<c-w>l),然后按<leader>s,它会在命令行中显示我:source $MYVIMRC<cr>但实际上什么也没做。我尝试了很多次,只是通过添加映射之类的:nnoremap stuff istuff- 来写东西,并<leader>s在我的原始缓冲区中,但什么也没发生。这真的很奇怪,因为它在我的.vimrc缓冲区中工作(当我在自己的.vimrc缓冲区中获取新的更改时)但在我的原始缓冲区中不起作用(当我回到它时),所以是否有任何特殊的来源到其他缓冲区,或者什么时候采购应该发生,每次我按<leader>s?我真的不明白。

编辑:

只是意识到它甚至更陌生。当我添加一些新映射,然后在新缓冲区中获取源时......它可以工作。但是当我从 中删除它们.vimrc并再次获取它们时......它仍然有效,尽管它不再是它.vimrc......这真的很奇怪。

标签: vim

解决方案


从您对问题的描述中很难准确判断发生了什么...

但是一种可能的解释(绝对是您应该解决的问题)是您在映射中使用:map而不是 , 。:nnoremap<leader>s

当您使用:map时,将递归检查扩展是否有其他映射,在大多数情况下,这很可能不是您真正想要的,尤其是在这种情况下。它也可能最终导致每个缓冲区具有不同的行为,因为您可能会触发仅存在于该缓冲区上的递归映射(例如,FileType- 特定映射。)

在这种特定情况下,我认为只有一个映射:会影响这一点(因为你进入 Ex 模式并且映射不再是一个问题),而且我真的不认为:经常映射或映射到产生侧面的东西你描述的效果......但这绝对是要解决的问题。因此,将您的映射更新为:

:nnoremap <leader>e :vsplit $MYVIMRC<cr>
:nnoremap <leader>ee :tabedit $MYVIMRC<cr>
:nnoremap <leader>s :source $MYVIMRC<cr>

另一件事是您描述的副作用,即使用文字输入命令<cr>并将其留在那里供您按Enter。'cpoptions'如果您的includes可以解释<这一点,即 when'compatible'被设置(或者,换句话说, before'nocompatible'被设置。)

您实际看到的内容可能并不取决于执行命令的缓冲区,而是第一次来源.vimrc,在启动时,这些映射在compatible设置时被配置,因此最终得到<cr>' 不能用作“Enter”,而是按字面意思插入。一旦您.vimrc再次获取源,在'nocompatible'设置之后,映射就会再次配置,但这一次具有正确的含义,<cr>并且从那时起,映射可以正常工作,正如您所期望的那样。

所以我建议在你的顶部添加一个显式设置.vimrc,这可能足以解决这个问题。添加这一行:

set nocompatible

推荐阅读