Vim에서 강조 표시된 실행 취소


12

spacemacs 기본 설정과 같이 Vim에서 강조 표시를 취소하려고합니다. 때로는 빠른 실행 취소를 원할 때 순간적으로 변경되는 내용을 알 수 없습니다. 그래서 언론이 취소 할 때 이와 같은 것을하려고합니다.

강조 표시 취소

Vim에서 어떻게 할 수 있을지 아는 사람이 있습니까?

(나는 이미 Gundo 플러그인을 가지고 있습니다. 기본 실행 취소를보다 부드럽게하고 싶습니다.)

편집 : undotree 플러그인이 작동합니다 ( 군도 는 변경 사항을 강조 표시하지 않습니다). UndotreeToggle명령을 사용 하면 파일의 모든 향후 변경 사항이 강조 표시됩니다.


좋은 생각. 로 강조 표시를 만들 수 matchadd()있지만 파일의 어떤 부분이 변경되었는지 약간 더 까다로워집니다.
joeytwiddle

실행 취소 전에 임시 버퍼 / 파일에 저장 한 다음 실행 취소 후 두 번째 버퍼 / 파일에 저장하고 이전 항목을 정리 (또는 색상 변경) 한 후 새 diff를 강조 표시 할 수 있습니다. 큰 파일의 경우 속도가 느려질 수 있습니다.
VanLaser

UndoTree 는 실제로 변경된 줄을 강조 표시 하지만 실시간 으로는 하지 않습니다. 나는 그것이 GNU diff를 사용한다고 생각합니다. 단어 단위를 얻는 것이 추가 단계 가 될 수 있습니다 (예 : 단어 나누기 분할 선 , diff, 재조합 라인).
joeytwiddle

이 플러그인은 가까이 있지만 여전히 라인 기반입니다. smeargle 은 마지막 저장 이후 변경된 라인을 강조 표시 할 수 있습니다. changesPlugin 은 왼쪽 여백에 변경된 행 (삭제 포함)을 표시합니다.
joeytwiddle

1
@joeytwiddle, changesPlugin은 또한 마지막 변경 영역을 강조 할 수 있습니다
Christian Brabandt

답변:


6

새로운 솔루션

:changes명령을 사용 하여 마지막 변경 사항을 볼 수 있습니다 . 따라서 정규식으로 가장 최근의 줄 변경을 적용 한 다음 matchadd()@joeytwiddle에서 제안한대로 줄을 적용 할 수 있습니다 .

코드는 다음과 같습니다.

function! DiffWithPrevious()
  call clearmatches()
  redir => message
  silent changes
  redir END
  let line = matchstr(message, '\v\n\s{4}1[^0-9]*\zs\d+\ze')
  highlight TemporalDiff ctermbg=green guibg=green
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction

참고 :

  • 이 기능은 이전 강조 표시를 제거하지 않고 새 강조 표시 만 추가하므로 이전 강조 표시를 먼저 제거해야합니다. clearmatches기능을 사용하면 새 항목을 추가하기 전에 일치 항목을 제거 할 수 있습니다. 주의하여 모든 일치 항목 을 제거 합니다. 더 세분성을 원하면 일치 항목을 저장하고 수동으로 제거 할 수 있습니다.

예 :

function! DiffWithPrevious()
  call matchdelete(m)
  ... 
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction
  • 몇 가지 테스트를 한 후에 한 줄 변경에만 작동한다는 것을 알았습니다.

참고 문헌 :


오래된 솔루션

다음은 주로 Diff 현재 버퍼와 원본 파일에서 영감을 얻은 가능한 솔루션입니다 .

function! DiffWithPrevious()
  undo
  write
  redo
  let filetype=&ft
  diffthis
  vnew | r # | normal! 1Gdd
  diffthis
  exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
endfunction

아이디어는 파일을 시스템의 파일과 비교하여 마지막 변경 사항을 실행 취소하고 작성하고 las 변경을 다시 실행하고 diff를 실행하는 것입니다.

나는 이것이 시간적 시간적 diff 시각화를 위해 일해야한다고 생각합니다.


DiffWithPrevious ()에서 "buffer"메시지를 지우는 방법이 있습니까? 함수가 마지막 변경 사항을 강조 표시하기를 원하지만 시간이 지남에 따라 강조 표시가 누적되어 message = 0 또는 message = ""와 같은 것을 시도하지만 성공하지 못했습니다.
tjbrn

물론 그렇습니다. 대답을 업데이트하겠습니다.
nobe4


2

나와 같은 것을 시도하는 사람에게는 대답 덕분에 가장 가깝습니다.

function! DiffWithPrevious()
  call clearmatches()
  undo
  redir => message
  silent changes
  redir END
  let line = matchstr(message, '\v\n\s{4}1[^0-9]*\zs\d+\ze')
  highlight TemporalDiff ctermbg=black guibg=black
  let m = matchadd('TemporalDiff', '\%'.line.'l')
  redraw
  let gchar = getchar()
  highlight TemporalDiff ctermbg=none guibg=none
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.