Выделенная отмена в Vim


12

Я пытаюсь сделать выделенную отмену в Vim, например, конфигурацию по умолчанию для spacemacs. Иногда, когда я хочу быстро отменить, я не могу понять, что изменилось, потому что это происходит мгновенно. Поэтому я пытаюсь сделать что-то подобное, когда отмена прессы:

выделено отменить

У кого-нибудь есть идеи, как это сделать в Vim?

(У меня уже есть плагин Gundo, я просто хочу сделать отмену по умолчанию более плавной)

Редактировать : плагин undotree выполняет свою работу ( Gundo не выделяет изменения), просто используйте UndotreeToggleкоманду, и все будущие изменения в файле будут выделены.


Хорошая идея. Вы можете создать выделение с помощью matchadd(), но немного сложнее определить, какие части файла изменились.
Joeytwiddle

Возможно сохранение во временный буфер / файл перед отменой, затем во второй буфер / файл после отмены и выделение новых различий после очистки (или изменения цвета) предыдущих. Может быть медленным для больших файлов.
VanLaser

UndoTree на самом деле выделяет измененные строки , но не в реальном времени. Я думаю, что это использует GNU diff. Получение гранулярности слова было бы дополнительным шагом (например, разделение строк на разрывы слов , различие, рекомбинация строк).
joeytwiddle

Эти плагины близки, но они все еще основаны на строках : размытие может выделить строки, измененные с момента последнего сохранения. changesPlugin отмечает измененные строки (включая удаления) в желобе слева.
Joeytwiddle

1
@joeytwiddle, changesPlugin также может выделить регион последних изменений
Кристиан Брабандт,

Ответы:


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.

Я думаю, что это должно делать работу для временных визуализаций временного различия.


есть способ очистить сообщение "буфер" на DiffWithPrevious ()? Мне бы хотелось, чтобы функция выделяла только последние изменения, но выделение со временем накапливается, я пытаюсь что-то вроде message = 0 или message = "", но безуспешно.
июля

Конечно, да, позвольте мне обновить мой ответ.
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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.