是否有可能diff甚至vimdiff两个非常相似的子程序出现在同一个文件中?如果是,如何进行?我可以考虑将这两个子程序复制到两个单独的文件中,然后对它们进行diff,但有没有办法在原始文件中执行此操作?
diff
vimdiff
cqoc49vn1#
插件linediff.vim : Perform an interactive diff on two blocks of text类似于Vincent指出的一个,具有一些额外的功能:
要使用它,您可以在第一个块上执行视觉选择以进行比较,输入命令:Linediff,然后对第二个块重复此操作。要退出,:LineDiffReset我发现以下Map很有帮助:
:Linediff
:LineDiffReset
noremap <leader>ldt :Linediff<CR> noremap <leader>ldo :LinediffReset<CR>
a64a0gku2#
您不能在原始文件中执行此操作,但您可以在不使用单独文件的情况下执行此操作,只使用单独的缓冲区。如果您在寄存器a中复制了一个子例程(例如,在Visual模式下键入"ay),而在寄存器b中复制了另一个子例程,则此操作应该有效:
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)。
hidden
:h abandon
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命令。(写命令将零件保存到一个新文件。)写一个新文件可能不是一个好主意,但这对我有帮助。特别是当我们不得不进行多次比较时。这是最简单的方法之一,无需使用插件或如果你不关心内存。
u5rb5r594#
我真的很喜欢ZyX的答案,但需要做两个修改,使其无缝工作:1.在实现时,用垂直拆分的差异显示替换活动缓冲区。然后,在关闭diff时,它不会重新加载原始缓冲区。为了解决这个问题,我将第三行的enew更改为execute 'tab split | enew'。1.为了最小化副作用,我在WipeOutDiffs()结束之前添加了call remove(a:diffed_buffers, 0, -1)。HTH,-斯图
enew
execute 'tab split | enew'
call remove(a:diffed_buffers, 0, -1)
j2cgzkjk5#
我一直在使用这个命令:
vimdiff <(cat file.foo | sed -n 10,15p) <(cat file.foo | sed -n 20,25p)
其中,提供给sed的数字是我想在文件中进行差异的行号。<(*)表示求值并重定向为输入。
sed
<(*)
6mzjoqzu6#
你可以尝试Block diff vim plugin,它会使2个新的缓冲区在一个新的标签,以显示差异.
6条答案
按热度按时间cqoc49vn1#
插件linediff.vim : Perform an interactive diff on two blocks of text类似于Vincent指出的一个,具有一些额外的功能:
要使用它,您可以在第一个块上执行视觉选择以进行比较,输入命令
:Linediff
,然后对第二个块重复此操作。要退出,:LineDiffReset
我发现以下Map很有帮助:
a64a0gku2#
您不能在原始文件中执行此操作,但您可以在不使用单独文件的情况下执行此操作,只使用单独的缓冲区。如果您在寄存器
a
中复制了一个子例程(例如,在Visual模式下键入"ay
),而在寄存器b
中复制了另一个子例程,则此操作应该有效:要实现自动化,请执行以下操作:
请注意,如果Vim拒绝放弃更改的文件,您可能需要设置
hidden
选项(请参阅:h abandon
)。hwazgwia3#
您可以将这两个部分/子程序/节写入两个文件,然后使用vimdiff查看差异。
如果您不习惯使用行号,可以将光标保持在部分的开头,按v并选择直到部分结束,然后按:.它将显示:'<,'>.然后在命令行中键入write和file name。按enter键同样,第二个也是。然后你可以执行如上所述的vimdiff命令。
(写命令将零件保存到一个新文件。)写一个新文件可能不是一个好主意,但这对我有帮助。特别是当我们不得不进行多次比较时。
这是最简单的方法之一,无需使用插件或如果你不关心内存。
u5rb5r594#
我真的很喜欢ZyX的答案,但需要做两个修改,使其无缝工作:
1.在实现时,用垂直拆分的差异显示替换活动缓冲区。然后,在关闭diff时,它不会重新加载原始缓冲区。为了解决这个问题,我将第三行的
enew
更改为execute 'tab split | enew'
。1.为了最小化副作用,我在WipeOutDiffs()结束之前添加了
call remove(a:diffed_buffers, 0, -1)
。HTH,-斯图
j2cgzkjk5#
我一直在使用这个命令:
其中,提供给
sed
的数字是我想在文件中进行差异的行号。<(*)
表示求值并重定向为输入。6mzjoqzu6#
你可以尝试Block diff vim plugin,它会使2个新的缓冲区在一个新的标签,以显示差异.