vim에서 실시간 diff 모드 편집

vim에서 실시간 diff 모드 편집

파일을 편집하면서 실시간으로 차이점을 확인하고 싶습니다. vimdiff두 파일 간의 차이점을 강조하는 등 내가 원하는 작업을 수행할 수 있습니다.

vimdiff그러나 나를 방해하는 두 가지 단점이 있습니다 .

첫째, 비교를 위해 동일한 파일을 독립적으로 버퍼링할 수 없습니다 diff. 이 문제는 해결하기 쉽습니다. 편집 중인 파일의 임시 복사본을 만들어 동일한 파일의 버퍼를 독립적으로 만드는 다음 쉘 스크립트(라고 함 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

vimdoc을 살펴본 후 autocmd, 제가 원하는 것을 정확히 수행하는 솔루션을 찾은 것 같습니다.

autocmd CursorMoved,CursorMovedI * diffupdate

제안해주신 Ingo님께 진심으로 감사드립니다!

답변2

<Esc>또한 터미널에 인쇄하기 위해 여러 특수 키의 키코드에도 사용됩니다.

과부하는 나쁜 생각입니다. 특히 당신처럼 침입적인 경우에는 더욱 그렇습니다. 예를 들어 다른 키를 사용 <Leader><Leader>하거나 이벤트 트리거를 정의합니다.

:autocmd InsertEnter,InsertLeave * diffupdate

관련 정보