[英]How to diff two lines in an open file in vim?
我偶尔会在代码中看到很长的行,我需要检查它们是否相同。 在vim中是否有一种方法可以选择两条线并将它们区分开以显示两者之间的差异?
例如,给出vim中的两行:
AVeryLongReturnType* MyLongClassName:hasAnEvenLongerFunction(That *is, Overloaded *with, Multiple *different, Parameter *lists);
AVeryLongReturnType* MyLongClassName:hasAnEvenLongerFunction(That *is, Overloaded *with, Multiple *different, Parameter *1ists);
我希望vim告诉我这两条线实际上是不同的,因为每个法术的“列表”都不同。 这是可能的,如果是的话,我该怎么做?
一个快速而肮脏的解决方案是只选择两行并对其进行排序,同时删除重复项:
撤消再次恢复所有内容。
@ sehe方法的替代方法不需要使用临时文件:
funct! DiffTwoTexts(text1, text2)
new
put =a:text1
normal ggdd
diffthis
new
put =a:text2
normal ggdd
diffthis
endfunct
funct! DiffTwoLines(line1, line2)
let text1 = getline(a:line1)
let text2 = getline(a:line2)
call DiffTwoTexts(text1, text2)
endfunct
comma! DiffWithNext call DiffTwoLines('.', line('.') + 1)
这仍然很难阅读,因为它将所有内容保存在一行中,所以我想出了这个修改:
funct! EvalTextPreprocessor(expr, text)
let text = a:text
return eval(a:expr)
endfunct
comma! -nargs=1 DiffWithNextPre call DiffTwoTexts(
\ EvalTextPreprocessor(<q-args>, getline('.')),
\ EvalTextPreprocessor(<q-args>, getline(line('.') + 1)))
此新命令将vimscript表达式作为其参数,其中变量text
指的是正在预处理的任何行。 所以你可以打电话,比如说
DiffWithNextPre split(text, '[(,)]\zs')
对于您的样本数据,这将提供两个缓冲区
AVeryLongReturnType* MyLongClassName:hasAnEvenLongerFunction(
That *is,
Overloaded *with,
Multiple *different,
Parameter *lists)
;
和
AVeryLongReturnType* MyLongClassName:hasAnEvenLongerFunction(
That *is,
Overloaded *with,
Multiple *different,
Parameter *1ists)
;
仅突出显示以Parameter
开头的行。
你甚至可以从那里建立起来,创造一个命令
comma! DiffTwoCFunctionSigs DiffWithNextPre split(text, '[(,)]\s*\zs')
请注意,我稍微修改了正则表达式,以便在行尾保留尾随空格。 您可以通过将\\s*
移动到\\zs
之后完全忽略它们。 如果您不熟悉特定于vim的RE原子,请参阅:help /\\zs
。
一个准确的做法是使命令占用一个范围(参见:help command-range
),你可以通过将最后一行的范围的第一行差异化来使用。 那么你只需从第一行到第二行进行视觉选择并调用命令。
这不是一个功能,但它很容易编写脚本,例如在你的vimrc中:
function! DiffLineWithNext()
let f1=tempname()
let f2=tempname()
exec ".write " . f1
exec ".+1write " . f2
exec "tabedit " . f1
exec "vert diffsplit " . f2
endfunction
这将在另一个选项卡中打开垂直拆分中的当前行和下一行。 请注意,此代码是一个示例
''
标记来选择另一条线 你可以不用'vert'来进行水平分割
将它映射到花哨的东西,所以你不必:call
手动:call
它:
:nnoremap <F10> :call DiffLineWithNext()^M
我用过linediff.vim 。
这个插件提供了一个简单的命令“:Linediff” ,用于区分两个单独的文本块。
你也可以创建一个新的空窗口缓冲区和复制行,然后创建命令:
:windo diffthis
这应该会打开一个新窗口,显示这两行的差异
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.