在同一个文件中,是否可以对两个非常相似的子程序进行diff
或甚至是vimdiff
比较?如果可以,该如何做呢?
我能想到的方法是将这两个子程序分别复制到两个单独的文件中,然后再进行diff
比较,但是有没有在原始文件中直接进行比较的方法呢?
要使用它,您需要对第一个要进行差异比较的文本块进行可视选择,然后输入命令:Linediff
,然后对第二个文本块重复此操作。要退出,请使用:LineDiffReset
我发现以下映射很有帮助:
noremap <leader>ldt :Linediff<CR>
noremap <leader>ldo :LinediffReset<CR>
在原始文件中无法这样做,但是您可以通过仅使用单独的缓冲区而不是单独的文件来完成此操作。如果您将一个子例程复制到寄存器 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>
请注意,如果Vim拒绝放弃更改的文件(请参见:h abandon
),则您可能希望设置hidden
选项。您可以将这两个部分/子程序/部分写入两个文件中,然后使用vimdiff查看它们之间的差异。
:1, 39 write part1 //any line range or marks can be used
:40, 79 write part2
:!vimdiff part1 part2
我一直在使用这个命令:
vimdiff <(cat file.foo | sed -n 10,15p) <(cat file.foo | sed -n 20,25p)
这里需要将数字馈送给sed
,这些数字是我想在文件中进行差异比较的行号。 <(*)
表示对其进行评估并将其重定向为输入。
cat
... 如果省略它也应该可以工作:vimdiff <(sed -n 10,15p file.foo) <(sed -n 20,25p file.foo)
。 - kuzyn我非常喜欢ZyX的答案,但需要进行两个修改才能无缝运行:
按照实现方式,<F7> 用垂直分割的diff显示替换了活动缓冲区。然后,<F8> 关闭了diff,但没有重新加载原始缓冲区。为了解决这个问题,我将第三行的 enew
改为 execute 'tab split | enew'
。
为了最大程度地减少副作用,在 WipeOutDiffs() 结束前,我添加了 call remove(a:diffed_buffers, 0, -1)
。
希望有所帮助, - Stu