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

相關內容