Emacs ediff错误“文件末尾没有换行符”

时间:2012-02-11 18:07:27

标签: emacs diff newline

在Debian Wheezy,Emacs 23.3.1中,运行带有文件的ediff文件最后会丢失换行符导致错误\ No newline at end of file(我希望这是正确的翻译;它是德语{{1}在我的电脑上。)

是否可以只发出警告,以便我可以看到差异并对其进行处理(并修复丢失的换行符)?首先让ediff失败,然后打开文件,再次添加换行符,再加上ediff,这有点单调乏味。

2 个答案:

答案 0 :(得分:8)

尝试更改变量ediff-diff-ok-lines-regexp的值以包含德语文本(“Kein Zeilenumbruch am Dateiende”):

(setq ediff-diff-ok-lines-regexp
      (concat
       "^\\("
       "[0-9,]+[acd][0-9,]+\C-m?$"
       "\\|[] "
       "\\|---"
       "\\|.*Warning *:"
       "\\|.*No +newline"
       "\\|.*missing +newline"
       "\\|.*Kein +Zeilenumbruch +am +Dateiende"
       "\\|^\C-m?$"
       "\\)"))

更新:查看源代码,似乎Ediff没有尝试处理来自diff的邮件本地化问题。还应该可以通过将diff包装在shell脚本中来解决此问题,例如:

#!/bin/bash
LANG=C diff $*

..然后自定义ediff-diff-program来调用包装器:

(setq ediff-diff-program "~/bin/my-diff.sh")

Emacs源目录中的其他代码lisp / vc似乎确实处理了这个问题,例如vc-hg-state

(defun vc-hg-state (file)
  "Hg-specific version of `vc-state'."
   ...
        (with-output-to-string
          (with-current-buffer
              standard-output
            (setq status
                  (condition-case nil
                      ;; Ignore all errors.
              (let ((process-environment
                 ;; Avoid localization of messages so we
                 ;; can parse the output.
                 (append (list "TERM=dumb" "LANGUAGE=C")
                     process-environment)))
   ...

似乎有点奇怪,Ediff也没有这样做,但也许我错过了一些东西。

答案 1 :(得分:0)

好的,我发现了什么是错的,很遗憾,很明显:我的环境有LANG=de,因此当Emacs调用diff时,警告信息也会以德语返回,而Emacs,不承认这个“未知”的消息,失败了。

使用LANG=C emacs启动emacs解决此问题。但是,我认为emacs的一个(非常愚蠢的)错误是假设用户的语言是英语。