我一直在它的
vimdiff1
布局中使用 vimdiff,它并排打开本地和远程两个缓冲区。与其他标准布局相比,我更喜欢这种布局的原因是两个快捷方式 do
和 dp
分别用于获取和放置差异块。
------------------------------------------
| | |
| | |
| | |
| LOCAL | REMOTE |
| | |
| | |
| | |
------------------------------------------
然而,最近我遇到了这样一种情况,在这种情况下,我经常混合使用两个块,对于这种情况,手动编辑 MERGED 文件更容易。
现在,我想切换到
LOCAL,MERGED,REMOTE
布局,我想知道是否可以仅为 vimdiff 定义自定义键绑定。
即,我想为gl
和gr
定义两个:diffget LOCAL
和:diffget REMOTE
快捷方式。
------------------------------------------
| | | |
| | | |
| LOCAL | MERGED | REMOTE |
| | | |
| | | |
------------------------------------------
有没有办法只为 vimdiff“模式”定义键绑定? 或者,是否已经存在我不知道的标准键绑定? 供参考:https://git-scm.com/docs/vimdiff/en
当然,我可以将这些设置为全局键绑定:
noremap gl :diffget LOCAL<CR>
noremap gr :diffget REMOTE<CR>
但这会将它们全局应用于正常模式。
好吧,差异窗口没有特殊的地图模式(那也没有意义)。因此,您通常必须使用
map-local
来实现特殊缓冲区的映射目标:
au BufRead * if &diff | exe 'noremap <buffer> gl :diffget LOCAL<CR>' | exe 'noremap <buffer> gr :diffget REMOTE<CR>' | endif
然而,如果退出差异模式,这会将映射留在缓冲区中。 Diff不是一种特殊的缓冲区,而是一种特殊的模式。对于这种情况,使用
<expr>
回调更容易:
nnoremap <expr> gl &diff ? ':diffget LOCAL<CR>' : 'gl'
每次按下映射时都会对其进行评估。
为什么我还要谈论第一个解决方案?好吧,这是我往下走的通常方式,所以我想说明为什么在这种情况下这不是最好的主意也不错。
但这会将它们全局应用于正常模式。
gl
默认情况下在正常模式下什么都不做,gr
是一个非常小众的命令,您可能从未使用或听说过,因此它们在全球范围内映射是非常安全的。所以我认为你可以安全地将它们添加到你的
vimrc
中,但稍作修改:
nnoremap gl :diffget LOCAL<CR>
nnoremap gr :diffget REMOTE<CR>
:noremap
为正常模式、视觉模式和操作员等待模式创建非递归映射,如果该场景处理不当(它仅对自定义动作有用),这并不是一个好主意。 :nnoremap
将您的映射限制为正常模式,这更符合您正在尝试做的事情。
就是说,如果您真的只想为差异设置这些映射,可以使用
:help <expr>
映射来完成,如下所示:
nnoremap <expr> gl &diff ? ':diffget LOCAL<CR>' : 'gl'
nnoremap <expr> gr &diff ? ':diffget REMOTE<CR>' : 'gr'
映射保持全局,但其右侧在运行时进行评估,在不同的上下文中产生不同的宏。在这里,检查是在
:help 'diff'
选项上完成的:如果它被启用,那么 gl
做 :diffget LOCAL<CR>
,如果没有,那么 gl
做 gl
.