41

是否有可能diff甚至vimdiff两个非常相似的子程序出现在同一个文件中?如果是这样,怎么做?

我可以考虑将两个子例程复制到两个单独的文件中,然后再复制diff它们,但是有没有办法在原始文件中执行此操作?

4

6 回答 6

50

插件linediff.vim : 对两个文本块执行交互式 diff类似于文森特指出的 ou 具有一些附加功能:

  • 有命令关闭打开的缓冲区
  • 似乎在没有 GUI 的情况下工作
  • 在被区分的原始文件上插入一些视觉指示。

要使用它,您在第一个块上执行视觉选择以进行比较,输入 command :Linediff,然后重复到第二个块。退出,:LineDiffReset

我发现以下地图很有帮助:

noremap \ldt :Linediff<CR>
noremap \ldo :LinediffReset<CR>
于 2012-01-09T13:14:37.210 回答
24

您不能在原始文件中执行此操作,但您可以在不使用单独文件的情况下执行此操作,而只需使用单独的缓冲区。如果您复制了 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)。

于 2010-09-01T20:15:15.463 回答
6

您可以将这两个部分/子例程/部分写入两个文件,然后使用 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 命令。

(写入命令将零件保存到一个新文件中。)编写一个新文件可能不是一个好主意,但这对我有帮助。尤其是当我们不得不多次比较时。

这是不使用插件或不关心内存的最简单方法之一。

于 2016-04-22T08:53:07.410 回答
3

我真的很喜欢 ZyX 的回答,但需要进行两项修改才能使其无缝工作:

  1. 在实现时, <F7> 用垂直分割差异显示替换活动缓冲区。然后,当 <F8> 关闭差异时,它不会重新加载原始缓冲区。为了解决这个问题,我enew在第三行更改为execute 'tab split | enew'.

  2. 为了尽量减少副作用,我call remove(a:diffed_buffers, 0, -1)在 WipeOutDiffs() 结束之前添加。

HTH, - 斯图

于 2011-09-09T01:10:14.130 回答
3

我一直在使用这个命令:

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

输入的数字sed是我想在文件中区分的行号。<(*)表示评估和重定向作为输入。

于 2016-09-19T15:12:01.360 回答
1

您可以尝试Block diff vim plugin,它会在新标签中创建 2 个新缓冲区以显示差异。

于 2010-09-01T23:04:35.083 回答