vim 中的实时 diff 模式编辑

vim 中的实时 diff 模式编辑

我想要在编辑文件时实时查看差异。 vimdiff能够做我想做的事情,比如突出显示两个文件之间的差异。

然而,有两个缺点vimdiff阻碍了我。

首先,它无法独立缓冲同一文件以进行比较diff。这个问题很容易解决。我有以下 shell 脚本(称之为diffvim)来vimdiff独立地制作同一文件的缓冲区(通过制作正在编辑的文件的临时副本)。

#!/bin/sh

# Differentially Viming

TMPDIR=/tmp/diffvim
FILENM=$1
FILEBN=$(basename $FILENM)

if [ ! -d "$TMPDIR" ]; then
  mkdir $TMPDIR
fi

cp $FILENM $TMPDIR/$FILEBN && vimdiff $FILENM $TMPDIR/$FILEBN

第二个缺点vimdiff是编辑非差异同一文件的两个副本之一的部分内容不会触发diff重新计算差异。必须通过调用 来手动完成此操作:diffupdate。我希望这种重新计算能够自动进行。我感觉比较方便的方式是退出时触发插入模式并进入普通的模式。通过将以下映射添加到我的.vimrc文件中,也可以轻松完成此操作:

inoremap <Esc> <Esc>:diffu<CR>

然而,这还不是完美的解决方案。因为如果我在普通的模式,即无需进入然后退出插入模式下,编辑完成后仍不会自动触发重新计算。所以我在我的.vimrc文件中添加了另一个映射:

nnoremap <Esc> :diffu<CR>

但这一次,奇怪的事情发生了。当我打开文件进行编辑时,某些标准键绑定出现故障。例如,如果我按 键hl(也就是说,它们中的任何一个是我打开文件后发出的第一个命令),所有这些都会让我进入插入模式,同时键jG删除一行或整个内容等。但是如果打开文件后,我先按 键Esc,那么这些命令就可以正常工作。

知道出了什么问题吗?你有解决方法吗?

答案1

在查看autocmdvimdoc 后,我想我已经找到了完全符合我想要的解决方案:

autocmd CursorMoved,CursorMovedI * diffupdate

非常感谢 Ingo 的建议!

答案2

<Esc>也用在几个特殊按键的keycode中,起到打印到终端的作用。

超载是个坏主意,尤其是像你这样具有侵入性的东西。使用不同的键,例如<Leader><Leader>,或定义事件触发器:

:autocmd InsertEnter,InsertLeave * diffupdate

相关内容