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

Nig*_*igu 40 vim diff vimdiff

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

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

谢谢!

mMo*_*ntu 45

插件linediff.vim:在两个文本块上执行交互式差异类似于Vincent指出的一个具有一些附加功能:

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

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

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

noremap \ldt :Linediff<CR>
noremap \ldo :LinediffReset<CR>
Run Code Online (Sandbox Code Playgroud)

  • 这个插件工作得很好.它以git形式记录和维护.它突出显示原始文件中的选定块.它不需要gvim.我看不出它是如何改进的,在我看来这是最好的解决方案.请尝试并投票. (8认同)

ZyX*_*ZyX 23

您不能在原始文件中执行此操作,但可以不使用单独的文件而只使用单独的缓冲区来执行此操作.如果您在寄存器中复制了一个子例程a(例如,"ay在可视模式下键入)和寄存器中的其他子例程,这应该可以工作b:

enew | call setline(1, split(@a, "\n")) | diffthis | vnew | call setline(1, split(@b, "\n")) | diffthis
Run Code Online (Sandbox Code Playgroud)

要自动化:

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>
Run Code Online (Sandbox Code Playgroud)

请注意,hidden如果Vim拒绝放弃更改的文件,您可能需要设置选项(请参阅参考资料:h abandon).


Sib*_*der 5

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

    :1, 39 write part1          //any line range or marks can be used
    :40, 79 write part2
    :!vimdiff part1 part2
Run Code Online (Sandbox Code Playgroud)

如果您不习惯使用行号,可以将光标停留在该部分的开头,按v并选择直到该部分的结尾,然后按:。它会显示:'<,'>。然后在命令行本身中键入write,然后输入文件名。按回车。相似,也做第二个。然后,您可以如上所述执行vimdiff命令。

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

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