Виділено скасування в Vim


12

Я намагаюся виділити скасування відміни у Vim, як конфігурація за замовчуванням spacemacs. Іноді, коли я хочу швидко скасувати, я не можу зрозуміти, що змінилося, тому що це миттєво. Тож я намагаюся щось подібне зробити, коли натискання скасовано:

виділено скасування

У когось є ідея, як це зробити у Vim?

(У мене вже є плагін Gundo, я просто хочу зробити скасування скасування за замовчуванням більш гладким)

Редагувати : Плагін для скасування статусу спрацьовує ( Гундо не виділяє зміни), просто використовуйте UndotreeToggleкоманду, і всі майбутні зміни у файлі будуть виділені.


Хороша ідея. Ви можете створити родзинку за допомогою matchadd(), але трохи складніше опрацювати, які частини файлу змінилися.
joeytwiddle

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

UndoTree насправді виділяє змінені лінії , але це не робиться в режимі реального часу. Я думаю, що він використовує GNU diff. Отримати деталізацію слова було б додатковим кроком (наприклад, розділені рядки при перервах слова , diff, рекомбінація рядків).
joeytwiddle

Ці плагіни наближаються, але вони все ще на основі рядків : мазка може виділити лінії, змінені з моменту останнього збереження. changePlugin позначки змінили лінії (включаючи вилучення) у жолобі зліва.
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 = "", але успіху немає.
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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.