vim - :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
......这真的很奇怪。
解决方案
从您对问题的描述中很难准确判断发生了什么...
但是一种可能的解释(绝对是您应该解决的问题)是您在映射中使用: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
推荐阅读
- node.js - 单个对象中的内部连接续集 ORM
- azure - Azure Logic-app trackedProperties 中 trackedProperties_NAME_g 和 trackedProperties_NAME_s 的意义?
- c++ - 扩展类中可选虚函数,运行时测试是否存在
- python - 如何将一行熊猫df乘以一个数字n,并在两者之间保持一个分隔符?
- google-maps - 如何在 react-native-google-places-autocomplete 中设置搜索图像图标?
- android - 如何在回收站视图中从 API 响应中设置检查为真复选框
- css - 如何在 css-modules 中使用 react-draft-wysiwyg?
- docker - WSL1、Docker Desktop、卷挂载始终为空
- javascript - 如果单击取消按钮,如何拒绝输入框中的任何更改?
- java - 使用 access_token/refresh_token/expires_in 参数创建一个没有 flow/installApp 内容的凭证