Как выделить весь ранее удаленный текст после восстановления - PullRequest
6 голосов
/ 16 июня 2011

Я часто использую команду или скрипт для удаления текста, и после выполнения восстановления (u) я хочу посмотреть, что было ранее удалено командой / скриптом.

Можно ли выделить предыдущийудаленный текст при использовании команды undelete?(или даже лучше сопоставить предыдущий удаленный текст в команде поиска "/")

Ответы [ 3 ]

6 голосов
/ 16 июня 2011

Если вы только что удалили какой-либо текст, используя d, вы можете использовать /<CTRL-R>", чтобы сопоставить только что удаленный текст (даже если вы только что отменили удаление с помощью u).

Это выиграно 'не работает, если удаленный текст содержит символы новой строки или регулярные выражения (например, \ или [).Если это так, попробуйте:

/\V<CTRL-R>=substitute(substitute(getreg('"'), "[\\/]", '\\\0', 'g'), "\n", '\\n', "g")
  • \V - очень номагия - отключает большинство метасимволов регулярных выражений
  • <CTRL-R>= - вставьте оценку выражения vim
  • substitute(..., "\n", '\\n', "g") - экранировать все новые строки в данной строке
  • substitute(..., "[\\/]", '\\\0', 'g') - экранировать все косые и обратные слэши в данной строке
  • getreg('"') - получить содержимоерегистр ", который содержит самый последний извлеченный и / или удаленный текст

Это немного многословно, поэтому, если вам часто приходится делать это часто, вы можете связать его с командойв вашем ~/.vimrc:

" use ,/ in normal mode to match the most recently deleted or yanked text
nmap ,/ /\V<C-R>=substitute(substitute(getreg('"'), "[\\/]", '\\\0', 'g'), "\n", '\\n', "g")<CR><CR><CR>
4 голосов
/ 16 июня 2011

Как насчет извлечения различий из одного состояния файла и сравнения с другим?

: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
2 голосов
/ 17 июня 2011

Попробуйте плагин Histwin или Gundo.Он позволяет вам различать все ветви отмены, а также показывает унифицированную разницу для различий в окне предварительного просмотра.

...