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

ryevplcw  于 2023-10-20  发布在  其他
关注(0)|答案(6)|浏览(156)

是否有可能diff甚至vimdiff两个非常相似的子程序出现在同一个文件中?如果是,如何进行?
我可以考虑将这两个子程序复制到两个单独的文件中,然后对它们进行diff,但有没有办法在原始文件中执行此操作?

cqoc49vn

cqoc49vn1#

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

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

要使用它,您可以在第一个块上执行视觉选择以进行比较,输入命令:Linediff,然后对第二个块重复此操作。要退出,:LineDiffReset
我发现以下Map很有帮助:

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

a64a0gku2#

您不能在原始文件中执行此操作,但您可以在不使用单独文件的情况下执行此操作,只使用单独的缓冲区。如果您在寄存器a中复制了一个子例程(例如,在Visual模式下键入"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)。

hwazgwia

hwazgwia3#

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

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

如果您不习惯使用行号,可以将光标保持在部分的开头,按v并选择直到部分结束,然后按:.它将显示:'<,'>.然后在命令行中键入write和file name。按enter键同样,第二个也是。然后你可以执行如上所述的vimdiff命令。
(写命令将零件保存到一个新文件。)写一个新文件可能不是一个好主意,但这对我有帮助。特别是当我们不得不进行多次比较时。
这是最简单的方法之一,无需使用插件或如果你不关心内存。

u5rb5r59

u5rb5r594#

我真的很喜欢ZyX的答案,但需要做两个修改,使其无缝工作:
1.在实现时,用垂直拆分的差异显示替换活动缓冲区。然后,在关闭diff时,它不会重新加载原始缓冲区。为了解决这个问题,我将第三行的enew更改为execute 'tab split | enew'
1.为了最小化副作用,我在WipeOutDiffs()结束之前添加了call remove(a:diffed_buffers, 0, -1)
HTH,-斯图

j2cgzkjk

j2cgzkjk5#

我一直在使用这个命令:

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

其中,提供给sed的数字是我想在文件中进行差异的行号。<(*)表示求值并重定向为输入。

6mzjoqzu

6mzjoqzu6#

你可以尝试Block diff vim plugin,它会使2个新的缓冲区在一个新的标签,以显示差异.

相关问题