是否有可能diff
甚至vimdiff
两个非常相似的子程序出现在同一个文件中?如果是这样,怎么做?
我可以考虑将两个子例程复制到两个单独的文件中,然后再复制diff
它们,但是有没有办法在原始文件中执行此操作?
插件linediff.vim : 对两个文本块执行交互式 diff类似于文森特指出的 ou 具有一些附加功能:
要使用它,您在第一个块上执行视觉选择以进行比较,输入 command :Linediff
,然后重复到第二个块。退出,:LineDiffReset
我发现以下地图很有帮助:
noremap \ldt :Linediff<CR>
noremap \ldo :LinediffReset<CR>
您不能在原始文件中执行此操作,但您可以在不使用单独文件的情况下执行此操作,而只需使用单独的缓冲区。如果您复制了 register 中的一个子程序 a
(例如,"ay
在可视模式下键入)和 register 中的其他子程序, 这应该可以工作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
)。
您可以将这两个部分/子例程/部分写入两个文件,然后使用 vimdiff 来查看差异。
:1, 39 write part1 //any line range or marks can be used
:40, 79 write part2
:!vimdiff part1 part2
如果您不习惯使用行号,可以将光标保持在节的开头,按 v 并选择直到节的结尾,然后按 : 。它将显示:'<,'>。然后在命令行本身中键入 write 和 file name。按回车。同样,也为第二个做。然后你可以按照上面的说明执行 vimdiff 命令。
(写入命令将零件保存到一个新文件中。)编写一个新文件可能不是一个好主意,但这对我有帮助。尤其是当我们不得不多次比较时。
这是不使用插件或不关心内存的最简单方法之一。
我真的很喜欢 ZyX 的回答,但需要进行两项修改才能使其无缝工作:
在实现时, <F7> 用垂直分割差异显示替换活动缓冲区。然后,当 <F8> 关闭差异时,它不会重新加载原始缓冲区。为了解决这个问题,我enew
在第三行更改为execute 'tab split | enew'
.
为了尽量减少副作用,我call remove(a:diffed_buffers, 0, -1)
在 WipeOutDiffs() 结束之前添加。
HTH, - 斯图
我一直在使用这个命令:
vimdiff <(cat file.foo | sed -n 10,15p) <(cat file.foo | sed -n 20,25p)
输入的数字sed
是我想在文件中区分的行号。<(*)
表示评估和重定向作为输入。
您可以尝试Block diff vim plugin,它会在新标签中创建 2 个新缓冲区以显示差异。