vimdiff:强制逐行比较(忽略据称 missing/additional 行)

vimdiff: force line-by-line comparison (ignore supposedly missing/additional lines)

如何强制 vimdiff 始终逐行比较两个文件而不识别添加或删除的行?

问题是,如果两个文件之间的差异很大,但偶然文件中的两行匹配,vimdiff 认为这些行是相同的,只是将其余行视为添加或删除的行,结果diff 完全无法使用。在我的例子中,文件 1 中的第 i 行始终对应于文件 2 中的第 i 行,因此 vimdiff 无法找到添加或删除的行。

以下是一个小示例,其中包含两个文件,每个文件包含三个变量的值。 Vimdiff 错误地将 file1/line1 与 file2/line3 匹配,并认为它周围的一些行已被添加或删除。差异(减去颜色)看起来像这样:

              |  1 foo 8.1047  < del/new
              |  2 bar 6.2343  < del/new
1 foo 0.0000  |  3 foo 0.0000  < match
2 bar 5.3124  |  4 bar 1.4452  < wrong
3 foo 4.5621  |                < new/del
4 bar 6.3914  |                < new/del
5 foo 1.0000  |  5 foo 1.0000  < match
6 bar 6.3212  |  6 bar 7.2321  < wrong

然而,我想要的是以下内容,除了匹配的第 5 行外,所有行都标记为错误:

1 foo 0.0000  |  1 foo 8.1047 < wrong
2 bar 5.3124  |  2 bar 6.2343 < wrong
3 foo 4.5621  |  3 foo 0.0000 < wrong
4 bar 6.3914  |  4 bar 1.4452 < wrong
5 foo 1.0000  |  5 foo 1.0000 < match
6 bar 6.3212  |  6 bar 7.2321 < wrong

当我复制这个例子来尝试时,我注意到如果你有与每一行相关联的行号,vimdiff 会做你想做的事。

所以可以用cat加上行号然后diff:

  cat -n file1 > file1_with_line_no
  cat -n file2 > file2_with_line_no

  vimdiff file1_with_line_no file2_with_line_no

然后输出就是你想要的(显示为 diff 以便于复制到这里):

 diff file1_with_line_no file2_with_line_no --side-by-side
 1  foo 0.0000                                            |      1  foo 8.1047
 2  bar 5.3124                                            |      2  bar 6.2343
 3  foo 4.5621                                            |      3  foo 0.0000
 4  bar 6.3914                                            |      4  bar 1.4452
 5  foo 1.0000                                                   5  foo 1.0000
 6  bar 6.3212                                            |      6  bar 7.2321

在 bash 中,您可以将其添加到 .bashrc 中,这样您就可以在命令行中使用 linediff 来正常调用两个文件之间的差异:

linediff() { 
     if [ -z "" ] || [ -z "" ]; then return; fi
     f1=$(basename "")
     f2=$(basename "")
     cat -n "" > "/tmp/$f1"
     cat -n "" > "/tmp/$f2"
     vimdiff "/tmp/$f1" "/tmp/$f2"
     rm "/tmp/$f1" "/tmp/$f2"
 }

现在 linediff file1 file2 将执行上述操作并在之后进行清理。

Vim 依靠外部 diff 命令来分析这两个文件,因此您可以通过使用不同算法的不同工具来影响结果。您可以通过 'diffexpr' 选项进行配置;该工具的输出必须为 "ed" 样式。 CP。 :help diff-diffexpr.

请注意,这只会影响添加/更改/删除的行;为了在更改的行本身中显示字符差异,Vim 自行完成。

不幸的是,我不知道有任何替代的 diff 工具可以提供这样的输出,但也许其他人可以填写。

使用 diffchar.vim 插件怎么样?它在非差异模式下逐行比较。请打开 2 windows 上的 2 个文件,然后按 F7。默认情况下,它会尝试按行中的字符查找差异,但您可以更改差异单位、单词或其他内容。