如何在 Vim 中“比较”同一文件中的两个子例程?

问题描述 投票:0回答:6

是否有可能

diff
甚至
vimdiff
两个非常相似的子例程出现在同一个文件中?如果是的话,怎么办?

我可以考虑将两个子例程复制到两个单独的文件中,然后

diff
它们,但是有没有办法在原始文件中做到这一点?

vim diff vimdiff
6个回答
53
投票

插件 linediff.vim :对两个文本块执行交互式比较 类似于 Vincent 指出的,但具有一些附加功能:

  • 有一个关闭打开的缓冲区的命令
  • 似乎无需 GUI 即可工作
  • 在要比较的原始文件上插入一些视觉指示。

要使用它,您可以在要比较的第一个块上执行视觉选择,输入命令

:Linediff
,然后对第二个块重复该操作。要退出,
:LineDiffReset

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

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

25
投票

您无法在原始文件中执行此操作,但您可以在不使用单独的文件(仅使用单独的缓冲区)的情况下执行此操作。如果您在寄存器

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
)。


6
投票

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

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

如果您不习惯使用行号,可以将光标保持在该节的开头,按 v 并选择直到该节的末尾,然后按 : 。它将显示:'<,'>。然后在命令行中键入 write,然后键入文件名。按回车键。同样,第二个也这样做。然后你可以执行上面提到的 vimdiff 命令。

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

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


3
投票

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

  1. 在实现时,用垂直分割的差异显示替换了活动缓冲区。然后,当 关闭 diff 时,它不会重新加载原始缓冲区。为了解决这个问题,我将第三行的

    enew
    更改为
    execute 'tab split | enew'

  2. 为了尽量减少副作用,我在 WipeOutDiffs() 末尾添加了

    call remove(a:diffed_buffers, 0, -1)

HTH, - 斯图


3
投票

我一直在使用这个命令:

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

输入到

sed
的数字是我想要在文件中比较的行号。
<(*)
表示评估并重定向为输入。


1
投票

你可以尝试Block diff vim插件,它会在新选项卡中创建2个新缓冲区来显示差异。

© www.soinside.com 2019 - 2024. All rights reserved.