2012-02-11 3 views
4

В Debian Wheezy, Emacs 23.3.1, запущенные файлы-декодеры с файлом, который пропускает новую строку в конце, приводит к ошибке \ No newline at end of file (я надеюсь, что это правильный перевод , это немецкий \ Kein Zeilenumbruch am Dateiende. на моем компьютере.)Ошибка Emacs ediff «нет новой строки в конце файла»

Возможно ли иметь только предупреждение, чтобы я мог видеть diff и работать над ним (и исправить недостающую строку новой строки)? Это просто немного утомительно, чтобы сначала отключить ediff, затем откройте файл, снова добавьте новую строку, ediff.

+0

Что вы имеете в виду при помощи ediff 'erroring' и 'failing'? Вы хотите рассматривать недостающую новую строку в конце файла как разницу или нет (в этом случае вы можете установить 'ediff-diff-options' в' '-w", чтобы игнорировать различия в пробелах)? –

+0

С «failing» я имею в виду, что вместо получения diff файлы «ediff-files» останавливаются с сообщением об ошибке «Errors in diff output». Вывод Diff находится в # ', а буфер' * ediff-errors *' появляется с '\ Kein Zeilenumbruch ...'. И да, я бы предпочел, чтобы проблема была показана мне как предупреждение, и тогда будет отображаться diff. С '-w' ошибка все еще происходит. (Тем не менее, это не помогло бы, если бы я хотел искать различия в пробелах.) –

+0

ОК, я понимаю, что вы имеете в виду сейчас, я получаю ту же ошибку, если я установил свой язык на немецкий язык. Как вы говорите в своем ответе, Emacs ожидает, что выход diff будет на английском языке. Я предложил другое обходное решение. –

ответ

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?$" 
     "\\)")) 

Update: Глядя на исходный код, действительно кажется, что Ediff Безразлично» t попытаться решить проблему локализации сообщений от diff. Она также должна быть возможность обойти это путем обертывания diff в сценарий оболочки, например:

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

..то настройки 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

Спасибо, я не знал об этой переменной. Теперь нам нужно добавить регулярное выражение для всех возможных языков ... –

+1

Действительно - см. Мой обновленный ответ. –

+0

LC_ALL = C diff $ * – tangxinfa

0

Хорошо, я узнал, что это не так, и, к сожалению, это совершенно очевидно: мое окружение имеет LANG=de, поэтому, когда Emacs вызывает diff, предупреждающее сообщение возвращается на немецком языке, а также, и Emacs, не признавая это «UNKOWN» сообщение , не работает.

Запуск emacs с LANG=C emacs работает вокруг этой проблемы. Тем не менее, я считаю, что это (довольно глупая) ошибка emacs, чтобы сделать предположение о том, что язык пользователя является английским.

+2

Это, кажется, стоит сообщить. 'M-x report-emacs-bug' – phils

Смежные вопросы