我想要在编辑文件时实时查看差异。 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>
但这一次,奇怪的事情发生了。当我打开文件进行编辑时,某些标准键绑定出现故障。例如,如果我按 键h
或l
(也就是说,它们中的任何一个是我打开文件后发出的第一个命令),所有这些都会让我进入插入模式,同时键j或G删除一行或整个内容等。但是如果打开文件后,我先按 键Esc,那么这些命令就可以正常工作。
知道出了什么问题吗?你有解决方法吗?
答案1
在查看autocmd
vimdoc 后,我想我已经找到了完全符合我想要的解决方案:
autocmd CursorMoved,CursorMovedI * diffupdate
非常感谢 Ingo 的建议!
答案2
<Esc>
也用在几个特殊按键的keycode中,起到打印到终端的作用。
超载是个坏主意,尤其是像你这样具有侵入性的东西。使用不同的键,例如<Leader><Leader>
,或定义事件触发器:
:autocmd InsertEnter,InsertLeave * diffupdate