
我想要在編輯文件時即時查看差異。 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