(Vim) diff две подпрограммы в одном файле

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

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

Спасибо!

Ответ 1

Вы не можете сделать это в исходном файле, но вы можете сделать это, не используя отдельные файлы, только отдельные буферы. Это должно работать, если вы скопировали одну подпрограмму в регистре 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).

Ответ 2

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

  • имеет команду закрыть открытый буфер
  • работает без GUI
  • вставить некоторую визуальную индикацию в исходном файле (файлах).

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

Я нашел полезные советы:

noremap \ldt :Linediff<CR>
noremap \ldo :LinediffReset<CR>

Ответ 3

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

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

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

НТН, - Stu

Ответ 4

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

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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