使 emacs ediff 正常运行的配置

Configuration to make emacs ediff perform decently

在我的 Windows 上的 emacs 中,当用两个 HTML 文件做 ediff-files 或 ediff-buffers 时具有很强的结构相似性,但 ediff 未能找到这种结构相似性。但对于相同的两个文件,DiffNow.com 可以找到结构相似性,并突出显示细微差别。

我怀疑是我ediff配置不当导致的。

你能给我一些关于如何配置 ediff 以找到更多结构相似性的指示吗?

非常感谢!

示例如下:

file_1.html:

<template name="image_add_form">

    <div class="modal fade" id="image_add_form">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal">&times;</button>
                    <div class="modal-title">
                    </div>
                </div>
                <div class="modal-body">
                    <form class="js-add-image">
                        <input type="text" name="img_src"/>
                        <br/>
                        <input type="text" name="img_alt"/>
                        <button class="btn btn-success">save</button>
                    </form>
                </div>
                <div class="modal-footer">
                    <button class="btn btn-warning" data-dismiss="modal">
                        cancel
                    </button>
                </div> 
            </div>
        </div>
    </div>
</template>

file_2.html:

<template name="image_add_form">

    <div class="modal fade" id="image_add_form">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal">&times;</button>
                    <div class="modal-title">
                    </div>
                </div>
                <div class="modal-body">
                    <form class="js-add-image">
                        <input type="text" name="img_src"/>
                        <br/>
                        <input type="text" name="img_alt"/>
                        <button class="btn btn-success">save</button>
                    </form>
                </div>
                <div class="modal-footer">
                    <button class="btn btn-warning" data-dismiss="modal">
                        cancel
                    </button>
                </div> 
            </div>
        </div>
    </div>
</template>

人眼看,和DiffNow.com一样,结构相似性非常明显。

经进一步调查,似乎来自 cygwin 的 diff.exe 可能是问题的原因:

这是 diff 结果的输出

diff file_1.html file_2.html

2,7c2,24
<
< <div class="modal fade" id="image_add_form">
<   <div class="modal-dialog">
<     <div class="modal-content">
<       <div class="modal-header">
<         <div class="modal-title">
---
>
>     <div class="modal fade" id="image_add_form">
>         <div class="modal-dialog">
>             <div class="modal-content">
>                 <div class="modal-header">
>                     <button type="button" class="close" data-dismiss="modal">&times;</button>
>                     <div class="modal-title">
>                     </div>
>                 </div>
>                 <div class="modal-body">
>                     <form class="js-add-image">
>                         <input type="text" name="img_src"/>
>                         <br/>
>                         <input type="text" name="img_alt"/>
>                         <button class="btn btn-success">save</button>
>                     </form>
>                 </div>
>                 <div class="modal-footer">
>                     <button class="btn btn-warning" data-dismiss="modal">
>                         cancel
>                     </button>
>                 </div>
>             </div>
9,20d25
<       </div>
<       <div class="modal-body">
<         <form class="js-add-image">
<           <input type="text" name="img_src"/>
<           <br/><input type="text" name="img_alt"/>
<           <button class="btn btn-success">save</button>
<         </form>
<       </div>
<       <div class="modal-footer">
<         <button class="btn btn-warning" data-dismiss="modal">cancel</button>
<       </div>
<       </div>
22,26c27
<
< </div>
<
<   </template>
<
---
> </template>

已经无法识别结构相似性。

也许,需要应用一些 diff 开关?

例如,使用开关“-w”(忽略所有space)

diff -w file_1.html file_2.html
6a7
>                     <button type="button" class="close" data-dismiss="modal">&times;</button>
13c14,15
<           <br/><input type="text" name="img_alt"/>
---
>                         <br/>
>                         <input type="text" name="img_alt"/>
18c20,22
<         <button class="btn btn-warning" data-dismiss="modal">cancel</button>
---
>                     <button class="btn btn-warning" data-dismiss="modal">
>                         cancel
>                     </button>
22d25
<
24d26
<
26d27
<

这就是我要找的。

diff 是一种基于行的算法。它只报告整行不同。在您的第一个示例中,许多行已重新缩进,导致它们不同。 -w 标志告诉它忽略唯一区别在于空白字符数量的行,如您所见,它可以突出显示具有更显着差异的行。但是,您可能更喜欢 -b,因为 -w 实际上会忽略在单词中间添加空格的行。 -i 将忽略大小写更改。

-d 告诉它花更多 cpu 时间寻找最小的变化集。这通常不会改变 diff 报告的内容,但是现代 cpus 是如此之快以至于额外的时间成本通常是不明显的。你还不如一直用呢

-u 特别有用,因为它提供了一个更易于阅读的统一差异。

有一个名为 wdiff 的程序可以查找不同的单词而不是行,但我不知道是否有任何 emacs 模式使用它。