Emacs错误地寻找.el而不是.elc

时间:2011-08-18 19:06:50

标签: emacs elisp

我最近开始使用django-html-mumamo-mode,它是emacs中nXhtml的一部分,一切似乎都有效,只是当我开始在html页面中编写javascript代码时,我收到警告/错误

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

我签入了该文件夹,所有文件都有.elc扩展名,包括js.elc,这可能是emacs无法找到的原因。我可以更改某些内容以使emacs只加载.elc文件吗?

修改:如果我运行M-x load-library jsM-x load-library js.elc

,这种情况将继续发生

Edit2 :我已确认load-suffixes设置为("el" "elc"),而js.elc位于progmodes文件夹中,该文件夹位于{{ 1}}并且所有用户都具有该文件的读取权限。我正在使用emacs版本23.2.1,当我将load-path设置为debug-on-error时,我得到了一个回溯,看起来以下部分包含错误:

t

值得注意的是,第三行包含对正确文件的引用,但最终会尝试加载错误的文件。有没有人见过这种事情或者有任何想法如何解决它?

2 个答案:

答案 0 :(得分:9)

如果你阅读"How Programs Do Loading上的Emacs手册中的部分,如果正常的库加载命令(例如 - “require”,“autoload”),则应加载js.elc文件 ,“load-file”等正在使用中。调试这个的一些事情:

  1. 您的用户ID是否具有访问该位置js.el文件的系统安全权限?
  2. 如果您输入 M-x emacs-version ,您运行的是什么版本的Emacs?
  3. “load-library”命令在“load-path”中搜索lisp文件。检查加载路径的内容时,是否包含指定的目录?
  4. 将变量“debug-on-error”设置为“t”并重新尝试在html页面中编写javascript代码 - 当错误发生时,检查发生错误的源代码行,如果从导致问题的原因是,使用发生错误的源代码行发布更新问题以及Emacs生成的堆栈跟踪。
  5. 编辑:好的,既然你已经添加了堆栈跟踪,就可以看出错误发生的原因。以下是“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”不在同一目录中。看起来他曾经用nXhtml分发js.el但是因为它现在附带了最新的Emacs发行版而停止这样做了。因此,在他的环境中,他可能将“.el”文件放在与“.elc”文件相同的目录中,并且没有遇到过这个问题。所以,你应该做两件事:

    1. 通知nXhtml库的作者,以便他可以修复代码中的错误。
    2. 将必要的“.el”源文件复制到“/usr/share/emacs/23.2/lisp/progmodes/”,这样就不会出现错误。或者,您可以选择在另一个目录中重新安装js.el(可能还有一些其他模块),并将该目录放在“load-path”中的“/usr/share/emacs/23.2/lisp/progmodes/”之前。
    3. 做#1会在长期内解决问题,而做#2应该让你在短期内使用nXhtml。

答案 1 :(得分:1)

检查load-suffixes

的值

C-h v load-suffixes。您可能希望这类似(".elc" ".el")。如果确保你的模式没有将它设置为奇怪的东西,或者动态绑定它。