Что означает, когда emacs сообщает мне "Ошибка спецификации режима файла"?
Это самое бесполезное сообщение об ошибке, которое я когда-либо видел.
Я думаю, это переводится на.. "error".
Полное сообщение об ошибке из буфера * Сообщения *:
File mode specification error: (wrong-type-argument characterp "string value here")
Я думаю, что последняя часть этого сообщения означает, что emacs ожидал персонажа и получил строку.
Но как мне начать диагностировать, что это значит, когда emacs сообщает мне "Ошибка спецификации режима файла"? и как я могу сузить место возникновения этой ошибки?
Как связаны эти две ошибки (ошибка режима файла, ожидаемый символ и полученная строка)?
Ответы
Ответ 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 пытается выполнить возвращаемое значение тела функции. Поэтому обратите внимание на подсчет скобок!