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。默认情况下,它会尝试按行中的字符查找差异,但您可以更改差异单位、单词或其他内容。
如何强制 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。默认情况下,它会尝试按行中的字符查找差异,但您可以更改差异单位、单词或其他内容。