(Vim) diff две подпрограммы в одном файле - PullRequest
39 голосов
/ 01 сентября 2010

Можно ли различить или даже vimdiff две почти одинаковые подпрограммы, которые встречаются в одном файле?Если да, то как?

Я могу подумать о том, чтобы скопировать две подпрограммы в два отдельных файла и затем сравнить их, но есть ли способ сделать это в исходном файле?1005 *

Ответы [ 6 ]

43 голосов
/ 09 января 2012

Плагин linediff.vim: Выполнение интерактивного сравнения с двумя блоками текста аналогично тому, что указал Винсент, с некоторыми дополнительными функциями:

  • имеет команду закрыть открытый буфер
  • , кажется, работает без графического интерфейса
  • вставить некоторую визуальную индикацию в исходный файл (ы), на который распространяется диффузия.

Для его использования вы выполняете визуальный выбор первого блока для сравнения, вводите команду :Linediff и повторяете ее для второго блока. Чтобы выйти, :LineDiffReset

Мне показались полезными следующие карты:

noremap \ldt :Linediff<CR>
noremap \ldo :LinediffReset<CR>
22 голосов
/ 02 сентября 2010

Вы не можете сделать это в исходном файле, но вы можете сделать это без использования отдельных файлов, только отдельных буферов.Это должно работать, если вы скопировали одну подпрограмму в регистр a (например, с "ay, набранной в визуальном режиме) и другую подпрограмму в регистр b:

enew | call setline(1, split(@a, "\n")) | diffthis | vnew | call setline(1, split(@b, "\n")) | diffthis

Для автоматизации:

let g:diffed_buffers=[]
function DiffText(a, b, diffed_buffers)
    enew
    setlocal buftype=nowrite
    call add(a:diffed_buffers, bufnr('%'))
    call setline(1, split(a:a, "\n"))
    diffthis
    vnew
    setlocal buftype=nowrite
    call add(a:diffed_buffers, bufnr('%'))
    call setline(1, split(a:b, "\n"))
    diffthis
endfunction
function WipeOutDiffs(diffed_buffers)
    for buffer in a:diffed_buffers
        execute 'bwipeout! '.buffer
    endfor
endfunction
nnoremap <special> <F7> :call DiffText(@a, @b, g:diffed_buffers)<CR>
nnoremap <special> <F8> :call WipeOutDiffs(g:diffed_buffers) | let g:diffed_buffers=[]<CR>

Обратите внимание, что вы можете установить опцию hidden, если Vim отказывается оставить измененный файл (см. :h abandon).

4 голосов
/ 22 апреля 2016

Вы можете записать эти две части / подпрограммы / секции в два файла и затем использовать vimdiff, чтобы увидеть разницу.

    :1, 39 write part1          //any line range or marks can be used
    :40, 79 write part2
    :!vimdiff part1 part2

Если вам неудобно использовать номера строк, вы можете держать курсорв начале раздела нажмите v и выберите до конца раздела, а затем нажмите:.это покажет: '<,'>.Затем введите write, а затем имя файла в самой командной строке.Нажмите Ввод.Аналогично, сделай для второго тоже.Затем вы можете выполнить команду vimdiff, как указано выше.

(Команда записи сохраняет деталь в новый файл.) Запись нового файла может быть не очень хорошей идеей, но это помогает мне.Особенно, когда нам пришлось пройти сравнение несколько раз.

Это один из самых простых способов без использования плагина или если вас не беспокоит память.

3 голосов
/ 19 сентября 2016

Я использую эту команду:

vimdiff <(cat file.foo | sed -n 10,15p) <(cat file.foo | sed -n 20,25p)

Где числа, поданные на sed - это номер строки, которую я хочу найти в файле. <(*) означает оценку и перенаправление в качестве ввода.

3 голосов
/ 09 сентября 2011

Мне очень нравится ответ ZyX, но нужно было сделать две модификации, чтобы он работал без проблем:

  1. Как реализовано, заменяет активный буфер отображением различий по вертикали. Затем, пока закрывает diff, он не перезагружает исходный буфер. Чтобы это исправить, я изменил enew в третьей строке на execute 'tab split | enew'.

  2. Чтобы минимизировать побочные эффекты, я добавил call remove(a:diffed_buffers, 0, -1) непосредственно перед окончанием WipeOutDiffs ().

НТН, - Stu

1 голос
/ 02 сентября 2010

вы можете попробовать Block diff vim plugin , он создаст 2 новых буфера в новой вкладке, чтобы показать различия.

...