我有一个包含两个相似但略有不同的部分的源文件。我想将这两个部分合并到一个子程序中,并带有一个处理细微差异的参数,但我需要确保我知道它们,所以我不会错过任何一个。
在这种情况下,我通常做的是将每个部分复制到一个单独的文件中,然后使用 tkdiff 或 vimdiff 来突出显示差异。有没有办法跳过中间文件,只区分同一个文件的两个部分?
7 回答
Vim的linediff插件很适合我。直观地选择文件的一部分并键入:Linediff
. 直观地选择其他部分并键入:Linediff
。它会将 vim 置于vimdiff模式,仅显示您之前突出显示的两个部分。键入:LinediffReset
以退出 vimdiff 模式。
更多信息:
KDiff3是开源的,可在包括 Win32 和 Linux 在内的多个平台上使用。
它具有 Gishu 关于Beyond Compare讨论的“手动对齐”功能(顺便说一下,我个人没有使用过,但我认识的很多人都认为它是一个很棒的工具)。
有关更多示例,请参见此答案。
我使用超越比较。
它允许您在每一侧选择一条线并说“手动对齐”。这对你来说应该很好。
我选择将@ordnungswidrig 的答案重新编写为 bash 函数(我只对单个文件的差异感兴趣,但这可以很容易地更改为处理两个不同的文件......):
# 查找文件中的差异,给出两个部分的开始行和结束行 功能 diff_sections { 本地 fname=`basename $1`; 本地临时文件=`mktemp -t $fname`; 头 -$3 $1 | 尾 +$2 > $tempfile && 头 -$5 $1 | 尾 +$4 | 差异 -u $tempfile - ; rm $临时文件; }
你像这样调用函数......
diff_sections path/to/file 464 483 485 506
任何可以让您手动调整对齐的差异工具都可以完成这项工作。漫反射 ( http://diffuse.sourceforge.net/ ) 是我的最爱,它还可以让您手动调整对齐方式。
如果您可以使用正则表达式描述要组合的部分的开头和结尾,则可以使用以下内容:
sh -c 't=`mktemp`; cat "$0" | grep -e "$2" -A10000 | grep -e "$3" -B 10000 > $t; cat "$1" | grep -e "$2" -A10000 | grep -e "$3" -B 10000 | diff -u $t - ; rm $t' firstfile secondfile "section start" "section end"
作为替代方案,如果您想按行号描述该部分,您可以执行以下操作:
sh -c 't=`mktemp`; cat "$0" | head -$3 |tail +$2 > $t; cat "$1" | head -$5 | tail +$4 | diff -u $t - ; rm $t' first second 4 10 2 8
4 10 2 8 是第一个文件和第二个文件中要考虑的部分的开始和结束行号。
您可以将片段保存为 shell 脚本或别名。
Emacs 有ediff-regions-wordwise —— 你可以取两个缓冲区(或只一个)并在每个缓冲区中选择一个区域,然后 ediff 将显示该区域以进行比较。