Что это значит, когда emacs сообщает мне «Ошибка спецификации режима файла»? - PullRequest
23 голосов
/ 15 ноября 2010

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

Я думаю, что это переводится как "ошибка".

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

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

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

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

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

Ответы [ 3 ]

34 голосов
/ 15 ноября 2010

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

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

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

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

4 голосов
/ 15 ноября 2010

Возможно, вы захотите сказать, какую версию 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 и посмотреть на обратную трассировку - хороший: это должно дать вам ключ к пониманию того, что происходит.

0 голосов
/ 11 декабря 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...