(Vim)在同一个文件中区分两个子程序

时间:2010-09-01 14:30:44

标签: vim diff vimdiff

是否有可能对同一文件中出现的两个几乎相似的子程序进行差异甚至vimdiff?如果是这样,怎么样?

我可以想到将两个子程序复制到两个单独的文件中然后对它们进行区分,但是有没有办法在原始文件中进行它?

谢谢!

6 个答案:

答案 0 :(得分:43)

插件linediff.vim : Perform an interactive diff on two blocks of text类似于Vincent指出的插件,还有一些额外的功能:

  • 有一个关闭打开的缓冲区的命令
  • 似乎没有GUI
  • 在正在分散的原始文件上插入一些视觉指示。

要使用它,您需要在第一个块上进行视觉选择以进行diff,输入命令:Linediff,然后将其重复到第二个块。退出,:LineDiffReset

我发现以下地图很有用:

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

答案 1 :(得分:22)

您不能在原始文件中执行此操作,但可以不使用单独的文件而只使用单独的缓冲区来执行此操作。如果您在寄存器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拒绝放弃更改的文件,您可能需要设置hidden选项。(请参阅:h abandon)。

答案 2 :(得分:4)

您可以将这两个部分/子程序/部分写入两个文件,然后使用vimdiff查看差异。

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

如果您不习惯使用行号,可以将光标保持在该部分的开头,按v并选择直到该部分的结尾,然后按:。它会显示:'&lt;,'&gt;。然后在命令行本身中键入write和then name。按enter键。同样,也为第二个做。然后你可以执行如上所述的vimdiff命令。

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

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

答案 3 :(得分:3)

我非常喜欢ZyX的答案,但需要进行两次修改才能无缝地工作:

  1. 如实施的那样,&lt; F7&gt;用垂直分割差异显示替换活动缓冲区。然后,同时&lt; F8&gt;关闭diff,它不会重新加载原始缓冲区。为解决此问题,我将第三行的enew更改为execute 'tab split | enew'

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

  3. HTH, - 斯图

答案 4 :(得分:2)

我一直在使用这个命令:

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

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

答案 5 :(得分:1)

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