仅在 vimdiff 中定义快捷方式

问题描述 投票:0回答:2

我一直在它的

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>

但这会将它们全局应用于正常模式。

git vim key-bindings vimdiff
2个回答
0
投票

好吧,差异窗口没有特殊的地图模式(那也没有意义)。因此,您通常必须使用

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'

每次按下映射时都会对其进行评估。

为什么我还要谈论第一个解决方案?好吧,这是我往下走的通常方式,所以我想说明为什么在这种情况下这不是最好的主意也不错。


0
投票

但这会将它们全局应用于正常模式。

  • 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
.

© www.soinside.com 2019 - 2024. All rights reserved.