Vim

vim 中的實時差異模式編輯

  • June 15, 2013

我想要在編輯文件時實時查看差異。 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 hor l(也就是說,它們中的任何一個都是我打開文件後發出的第一個命令),都會讓我進入INSERT模式,而 key jor Gdelete 一行或整個內容等。但如果在之後打開文件,我先按鍵Esc,然後這些命令工作正常。

知道出了什麼問題嗎?你有解決辦法嗎?

在查看autocmdvimdoc 之後,我想我已經找到了完全符合我要求的解決方案:

autocmd CursorMoved,CursorMovedI * diffupdate

非常感謝 Ingo 的建議!

<Esc>也用於特殊鍵的幾個keycode中,起到列印到終端的作用。

超載它是一個壞主意,尤其是像你那樣具有侵入性的東西。使用不同的鍵,例如<Leader><Leader>,或定義事件觸發器:

:autocmd InsertEnter,InsertLeave * diffupdate

引用自:https://unix.stackexchange.com/questions/72205