Emacs Unicode branch 用 diff-mode 浏览 diff 或者 patch 文件时候,在使用 M-n 或者 M-p 的时候,常常会停在那里,然后 Emacs 完全就没有反应了,大概能过十几秒到半分钟左右才到下一个块,而文件操作 M-N 或者 M-P 就没有问题。似乎是跟特定的块有关系,随便用一个 diff 文件基本上都能碰得到。看起来有问题的块有一个共同的特点,就是有复杂的修改,而不是简单的 + 或者 -,那么 Emacs 就要试图把修改精确地表示出来,比如一行中加了一个词或者改了什么字符,可能需要计算时间,但是两三行的修改也会有这个问题,让人比较讨厌。如下文件所示:
--- t1.txt Sun Nov 25 22:02:20 2007 +++ t2.txt Sun Nov 25 22:02:28 2007 @@ -1,3 +1,3 @@ ther are random characters -this is a test file, haha, take a look +this is another test file, hehe, take a look ther are random characters
渲染出来如图所示:





解决方法
这个似乎在 win32 上有问题,Linux 下还可以。刚才研究了一下
diff-mode的配置,看到一个选项Diff Auto Refine:将其设置为
nil,那些高亮区域就不会显示出来,速度就快许多了。看起来似乎跟
diff-mode.el:diff-refine-hunk()和smerge-mode:smerge-refine-subst()有点关系。更正确的解决方法
上次只是把
Diff Auto Refine禁掉了,并不是完全地解决了问题。最后是发现跟 [MinGW] 有关系。diff-mode显示 diff 的时候,如果Diff Auto Refine开启,会调用smerge-refine-subst进行显示调整,在这个函数中,会调用diff命令。问题就来了,在我的系统中,使用 MinGW 自己的 diff 命令在非 MinGW 环境中调用非常慢,比如开启一个 CMD 窗口中运行,那么 Emacs 中也一样很慢。然后就去换了 [GnuWin32] 中的 diff,运行起来就非常快了。但是 MinGW 中其他的一些包是没有问题的。很奇怪。Post new comment