Emacs неправильно ищет .el вместо .elc - PullRequest
4 голосов
/ 18 августа 2011

Я недавно начал использовать django-html-mumamo-mode, который является частью nXhtml в emacs, и кажется, что все работает, за исключением того, что когда я начинаю писать код javascript на html-странице, я получаю предупреждение / ошибка

Can't find library /usr/share/emacs/23.2/lisp/progmodes/js.el

Я зарегистрировался в этой папке, и все файлы имеют расширение .elc, включая js.elc, поэтому, вероятно, emacs не может его найти. Могу ли я что-то изменить, чтобы emacs просто загрузил файл .elc?

Редактировать: Это продолжает происходить, если я запускаю M-x load-library js или M-x load-library js.elc

Edit2: Я подтвердил, что load-suffixes установлен на ("el" "elc"), и что js.elc находится в папке progmodes, которая находится в load-path, и что все пользователи прочитали разрешения для этого файла. Я использую emacs версии 23.2.1, и когда я установил debug-on-error на t, я получил трассировку, и похоже, что следующая часть содержит ошибку:

error("Can't find library %s" "/usr/share/emacs/23.2/lisp/progmodes/js.el")                                                                                                                         
find-library-name("/usr/share/emacs/23.2/lisp/progmodes/js.el")                                                                                                                                     
find-function-search-for-symbol(js-indent-line nil "/usr/share/emacs/23.2/lisp/progmodes/js.elc")                                                                                                   
(let* ((lib ...) (where ...) (buf ...) (pos ...)) (with-current-buffer buf (let ... ... ... ...)) (put fun (quote mumamo-evaled) t))                                                                
(if (get fun (quote mumamo-evaled)) nil (let* (... ... ... ...) (with-current-buffer buf ...) (put fun ... t)))                                                                                     
(unless (get fun (quote mumamo-evaled)) (let* (... ... ... ...) (with-current-buffer buf ...) (put fun ... t)))                                                                                     
(progn (unless (get fun ...) (let* ... ... ...)))                                                                                                                                                   
(if mumamo-stop-widen (progn (unless ... ...)))                                                                                                                                                     
(when mumamo-stop-widen (unless (get fun ...) (let* ... ... ...)))

Примечательно, что третья строка содержит ссылку на правильный файл, но в итоге она пытается загрузить неправильный файл. Кто-нибудь видел подобные вещи раньше или есть идеи, как это исправить?

Ответы [ 2 ]

9 голосов
/ 19 августа 2011

Если вы прочитали раздел руководства Emacs по "Как программы загружаются , файл js.elc должен быть загружен, если обычные команды загрузки библиотеки (например, -" требуют " "," autoload "," load-file "и т. д.). Некоторые действия для отладки:

  1. Имеет ли ваш ИД пользователя разрешения системы безопасности для доступа к файлу js.el в этом месте?
  2. Если вы наберете M-x emacs-version , какую версию Emacs вы используете?
  3. Команда «load-library» ищет файлы lisp в «пути загрузки». Когда вы проверяете содержимое вашего пути загрузки, находится ли в нем указанный каталог?
  4. Установите для переменной «debug-on-error» значение «t» и повторите попытку записи кода javascript на html-странице - при возникновении ошибки проверьте исходную строку, где произошла ошибка, и, если это не очевидно из что является причиной проблемы, опубликуйте обновление вашего вопроса с несколькими строками источника, где произошла ошибка, а также трассировкой стека, созданной Emacs.

РЕДАКТИРОВАТЬ: Хорошо, теперь, когда вы добавили трассировку стека, можно увидеть, почему происходит ошибка. Вот ключевые строки из функции «find-function-search-for-symbol» (это функция, в которой происходит ошибка):

(when (string-match "\\.el\\(c\\)\\'" library)
  (setq library (substring library 0 (match-beginning 1))))
;; Strip extension from .emacs.el to make sure symbol is searched in
;; .emacs too.
(when (string-match "\\.emacs\\(.el\\)" library)
  (setq library (substring library 0 (match-beginning 1))))
(let* ((filename (find-library-name library))

В строке # 2 функция устанавливает имя библиотеки, равное имени библиотеки "* .elc" минус "c" (например, оно конвертирует его из "/usr/share/emacs/23.2/lisp/progmodes/ js.elc "to" /usr/share/emacs/23.2/lisp/progmodes/js.el ". Затем, в строке № 7 приведенного выше кода, он пытается найти этот исходный элемент (и терпит неудачу, так как он этого не делает существует). Глядя на трассировку стека, ключевая строка:

(if (get fun (quote mumamo-evaled)) nil (let* (... ... ... ...) (with-current-buffer buf ...) (put fun ... t)))   

, который вызывается в функции nXhtml "mumamo-funcall-evaled". Автор nXhtml, очевидно, не учел, что файл «.elc» может существовать, но что «.el» не находится в том же каталоге. Похоже, он раньше распространял js.el с помощью nXhtml, но прекратил это делать, поскольку теперь он поставляется с последними дистрибутивами Emacs. Таким образом, в его среде он, вероятно, имеет файлы «.el» в том же каталоге, что и файлы «.elc», и не сталкивался с этой проблемой. Так что, вероятно, вам следует сделать 2 вещи:

  1. Уведомить автора библиотеки nXhtml, чтобы он мог исправить ошибку в своем коде.
  2. Скопируйте необходимые исходные файлы ".el" в "/usr/share/emacs/23.2/lisp/progmodes/", чтобы вы не получили ошибку. В качестве альтернативы, вы можете переустановить js.el (и, возможно, некоторые другие модули) в другой каталог и поместить этот каталог перед "/usr/share/emacs/23.2/lisp/progmodes/" в вашем "пути загрузки" ,

Выполнение # 1 решит проблему в долгосрочной перспективе, а выполнение # 2 должно позволить вам использовать nXhtml в краткосрочной перспективе.

1 голос
/ 20 августа 2011

Проверьте ваше значение load-suffixes

C-h v load-suffixes. Вы, вероятно, хотите, чтобы это было что-то вроде (".elc" ".el"). Если это так, убедитесь, что ваш режим не установил что-то странное или динамически связал.

...