vim 中的實時差異模式編輯
我想要在編輯文件時實時查看差異。
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
. 我希望這種重新計算是自動化的。我覺得比較方便的方式是退出INSERT模式進入NORMAL模式時觸發。這可以通過將以下映射添加到我的.vimrc
文件中輕鬆完成:inoremap <Esc> <Esc>:diffu<CR>
但是,它還不是完美的解決方案。因為如果我在NORMAL模式下進行一些編輯,即沒有進入然後退出INSERT模式,編輯完成後仍然不會自動觸發重新計算。所以我在我的
.vimrc
文件中添加了另一個映射:nnoremap <Esc> :diffu<CR>
但這一次,奇怪的事情發生了。當我打開文件進行編輯時,一些標準鍵綁定出現故障。例如,如果我按 key
h
orl
(也就是說,它們中的任何一個都是我打開文件後發出的第一個命令),都會讓我進入INSERT模式,而 keyj
orG
delete 一行或整個內容等。但如果在之後打開文件,我先按鍵Esc
,然後這些命令工作正常。知道出了什麼問題嗎?你有解決辦法嗎?
在查看
autocmd
vimdoc 之後,我想我已經找到了完全符合我要求的解決方案:autocmd CursorMoved,CursorMovedI * diffupdate
非常感謝 Ingo 的建議!
<Esc>
也用於特殊鍵的幾個keycode中,起到列印到終端的作用。超載它是一個壞主意,尤其是像你那樣具有侵入性的東西。使用不同的鍵,例如
<Leader><Leader>
,或定義事件觸發器::autocmd InsertEnter,InsertLeave * diffupdate