繁体   English   中英

如何在vim的打开文件中区分两行?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM