Ошибка Emacs ediff "нет новой строки в конце файла" - PullRequest
4 голосов
/ 11 февраля 2012

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

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

Ответы [ 2 ]

8 голосов
/ 12 февраля 2012

Попробуйте изменить значение переменной 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 в сценарий оболочки, например:

#!/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)))
   ...

Кажется немного странным, что Эдифф также не делает этого, но, возможно,Я что-то упустил.

0 голосов
/ 12 февраля 2012

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

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

...