Подтвердить что ты не робот

Что означает, когда emacs сообщает мне "Ошибка спецификации режима файла"?

Это самое бесполезное сообщение об ошибке, которое я когда-либо видел.

Я думаю, это переводится на.. "error".

Полное сообщение об ошибке из буфера * Сообщения *:

File mode specification error: (wrong-type-argument characterp "string value here")

Я думаю, что последняя часть этого сообщения означает, что emacs ожидал персонажа и получил строку.

Но как мне начать диагностировать, что это значит, когда emacs сообщает мне "Ошибка спецификации режима файла"? и как я могу сузить место возникновения этой ошибки?

Как связаны эти две ошибки (ошибка режима файла, ожидаемый символ и полученная строка)?

4b9b3361

Ответ 1

Используйте M-x toggle-debug-on-error RET, чтобы отбросить в отладчик при возникновении этой (или любой) ошибки - при условии, что это правильная ошибка, а не просто сообщение. Это дает вам трассировку стека, поэтому вы можете выяснить, что вызвало ее, и перейти оттуда (возможно, с помощью edebug, как только вы определили, какие функции для инструмента, но вы можете делать много с обычным отладчиком).

Стандартные команды отладчика: M-: (info "(elisp) Debugger Commands") RET

Основной ручной ввод для отладки lisp (включая edebug): M-: (info "(elisp) Debugging") RET

FYI, rgrep сообщает мне, что единственный экземпляр строки "Ошибка спецификации режима файла" в файлах *.el для NTEmacs 23.2.1 отображается в определении функции normal-mode:
M-x find-function RET normal-mode RET

Ответ 2

Возможно, вам захочется сказать, какую версию Emacs вы используете.

Если это GNU Emacs 23, то соответствующий код находится в функции normal-mode в files.el и выглядит следующим образом:

(report-errors "File mode specification error: %s"
  (set-auto-mode))

Таким образом, функция set-auto-mode (или некоторая функция, вызываемая оттуда) сигнализирует об ошибке wrong-type-argument, а normal-mode добавляет текст File mode specification error, чтобы помочь вам отследить его, но, к сожалению, это не помогает здесь, поскольку функция set-auto-mode заключается в том, чтобы определить, какой основной режим должен иметь буфер, а затем включить этот режим. Я ожидаю, что сам режим сигнализирует об ошибке.

Итак, совет phils включить debug-on-error и посмотреть на обратную трассу - это хорошо: это должно дать вам представление о том, что происходит.

Ответ 3

Для меня это произошло потому, что у меня была дополнительная пара () круглых скобок вокруг тела функции, которое я написал. Я предполагаю, что make lisp пытается выполнить возвращаемое значение тела функции. Поэтому обратите внимание на подсчет скобок!