Как насчет извлечения различий из одного состояния файла и сравнения с другим?
:command! -nargs=0 DiffLastChange exe "norm! u" | vert new | set bt=nofile | r # | 0d _ | diffthis | wincmd p | exe "norm! \<c-r>" | diffthis
Теперь вы можете просто запустить DiffLastChange
, чтобы увидеть различие последнего изменения в файле.
Объяснение:
exe "norm! u"
отменить последнее изменение в текущем буфере vert new
вертикально разделить новый буфер set bt=nofile
измените тип буфера на «чистый» буфер r #
чтение содержимого из альтернативного файла, т. е. буфер, с которого мы начали с 0d _
, очистите новый буфер, удалив пустую строкувверху в регистр черной дыры diffthis
пометить текущий буфер как часть переключателя diff wincmd p
на последний буфер (обратно в буфер, который мы началиwith) exe "norm! \<c-r>"
выполнить повтор для восстановления исходного состояния буферов diffthis
пометить исходный буфер как отдельный от diff
После того, как выЯ рекомендую выполнить :diffoff!
, чтобы отключить оба дифференциала.
К сожалениюКоманда is в своем текущем состоянии не может обрабатывать несохраненные буферы, так как :read #
будет читать в файле.Решение состоит в том, чтобы скопировать содержимое буфера в именованный регистр, а затем вставить его в рабочий буфер.К сожалению, это загубит именованный регистр.Рефакторинг кода в функцию даст большую гибкость и позволит использовать переменную для сохранения содержимого регистра (и типа регистра) и восстановления регистра в конце.
function! DiffLastChange(...)
let a = @a
let at = getregtype('a')
let c = a:0 == 1 ? a:1 : 1
let ft = &ft
try
exe "norm! " . c . "u"
sil %y a
vert new
set bt=nofile
exe "set ft=" . ft
sil pu a
0d _
diffthis
wincmd p
exe "norm! " . c . "\<c-r>"
diffthis
finally
call setreg('a', a, at)
endtry
endfunction
command! -nargs=? DiffLastChange call DiffLastChange(<f-args>)
В дополнение кисправляя несохраненные проблемы с буфером и проблемы с залипанием, я добавил возможность вернуться в историю с помощью аргумента команды, например :DiffLastChange 3
.Команда также устанавливает тип файла буфера очистки на тот же, что и у исходных буферов, поэтому для этого буфера будет включена подсветка синтаксиса.
Для гораздо более надежного решения, позволяющего увидеть различия между частями истории в буфере Iсогласиться с Кристианом Брабандтом и предложить Гундо или Гиствин .Для получения дополнительной информации о Gundo см. vimcasts .
Для получения дополнительной информации см .:
:h diffthis
:h diffoff
:h wincmd
:h 'bt'
:h :r
:h :d