可能重复:(
Vim)diff两个子程序在同一个文件中
有时我看到一块代码我怀疑与同一文件中的另一个块相同,但是对于视觉检查来说有点太长了,我可能只是遗漏了一些东西.我试图在视觉上选择块并猛拉到默认寄存器,将该寄存器放入/(查找),但它甚至与原始块不匹配.
有没有办法选择一个部分,把它放在一个寄存器中,选择另一个部分然后差异两个,而不创建一堆新文件? 我想象差异结果在选项卡或拆分中的新缓冲区中打开.
编辑:我的问题基本上是这一个的重复.我发现这个答案是最有帮助的,也是最接近我想要的.我唯一要改变的是让它以统一格式输出,所以它看起来像我习惯的diff输出(它还有更多的信息).我想这意味着使用不同的diff实用程序.
灵感来自我的lh#path#strip_common()函数:
echo matchstr(@a.'@@'.@b, '^\zs\(.*\)\ze.\{-}@@\1.*$')
Run Code Online (Sandbox Code Playgroud)
将显示寄存器@a和寄存器之间的共同点@b.
您可以显示更多信息:
function ShowDiff(a,b)
" I expect neither string to contain '@@'
let start = matchstr(a:a.'@@'.a:b, '^\zs\(.*\)\ze.\{-}@@\1.*$')
let end= matchstr(a:a.'@@'.a:b, '^.\{-}\zs\(.*\)\ze@@.\{-}\1$')
let a = a:a[len(start): -len(end)-1]
let b = a:b[len(start): -len(end)-1]
echo "identical beginning: ".strlen(start )." chars -> ".start
echo "identical ending : ".strlen(end)." chars -> ".end
echo "typical to a : ".strlen(a)." chars -> ".a
echo "typical to b : ".strlen(b)." chars -> ".b
endfunction
Run Code Online (Sandbox Code Playgroud)
用于:
:call ShowDiff(@a, @b)
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用以下序列,假设这两个段已位于寄存器中,'a并且'b。可能可以放入宏或函数中。
new
only
put a
diffthis
vnew
put b
diffthis
Run Code Online (Sandbox Code Playgroud)
这将创建一个新的缓冲区,使其成为唯一可见的缓冲区,放入'a其中,将其设置为 diff'd,然后以垂直分割打开一个新缓冲区,放入'b此分割空缓冲区并将其设置为 diff。立即vim(或gvim) 将显示差异。
完成后,键入:ls以获取缓冲区列表,使用:buffer *N*返回到原始文件并使用:bdel! *N*删除创建的缓冲区(名为“[No Name]”)。