2012-02-11 49 views
4

在Debian Wheezy上,Emacs 23.3.1,在末尾缺少換行符的文件運行ediff-files導致錯誤\ No newline at end of file(我希望這是正確的翻譯;這是我的電腦上德國\ Kein Zeilenumbruch am Dateiende.Emacs ediff錯誤「在文件末尾沒有換行符」

是否有可能有,而不是隻是一個警告,讓我可以看到它的DIFF和工作(並修復丟失的換行符)。?首先Ediff失敗,然後打開文件,再次添加換行符ediff,這只是有點乏味。

+0

你是什麼意思ediff'錯誤'和'失敗'?你是否想在文件尾部處理一個缺失的換行符,或者不要(在這種情況下,你可以將'ediff-diff-options'設置爲'「-w」'來忽略空白區別)? – 2012-02-11 18:40:04

+0

與「失敗」我的意思是,而不是得到一個差異,'ediff文件'停止錯誤消息'差錯輸出錯誤。 Diff輸出在#<緩衝區* ediff-diff *>'和一個緩衝區* * ediff-errors *'彈出'\ Kein Zeilenumbruch ...'。是的,我寧願如果問題顯示給我作爲警告,然後顯示差異。用'-w',錯誤仍然存​​在。 (但是,如果我想查找空白區別,這不會起作用。) – 2012-02-11 22:36:11

+0

好吧,我明白你的意思了,如果我把我的語言設置爲德語,我會得到同樣的錯誤。正如你在答案中所說的那樣,Emacs期望diff的輸出是英文的。我提出了另一個解決方法。 – 2012-02-12 03:37:34

回答

7

試着改變變量ediff-diff-ok-lines-regexp的價值,包括德語文本(「KEIN Zeilenumbruch是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的消息本地化問題。它也應該可以通過在shell腳本包裝diff來解決這個問題,比如:

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

..then定製ediff-diff-program調用包裝來代替:

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

其他代碼在Emacs的源目錄口齒不清/ 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不也做這,但也許我錯過了一些東西。

+0

謝謝,我不知道這個變量。現在我們只需要爲每種可能的語言添加一個正則表達式...... – 2012-02-12 11:24:57

+1

確實 - 請參閱我的更新答案。 – 2012-02-12 13:35:05

+0

LC_ALL = C diff $ * – tangxinfa 2013-08-12 09:05:50

0

好的,我發現有什麼不對,很遺憾,這很明顯:我的環境有LANG=de,因此當Emacs調用diff時,警告信息也以德語返回,而Emacs不識別這個「未知」信息,失敗。

使用LANG=C emacs啓動emacs可解決此問題。但是,我認爲這是一個emacs(非常愚蠢)的錯誤,假設用戶的語言是英語。

+2

這似乎值得報告。 'M-x report-emacs-bug' – phils 2012-02-11 23:32:14

相關問題