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

mur*_*d99 4 emacs elisp

我最近开始使用Django的HTML-mumamo模式是在Emacs nXhtml的一部分,一切似乎除了工作,当我开始在HTML页面中编写JavaScript代码,我得到的警告/错误

Can't find library /usr/share/emacs/23.2/lisp/progmodes/js.el
Run Code Online (Sandbox Code Playgroud)

我检查了该文件夹,所有文件都有.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-errort我有一个回溯,看起来以下部分包含错误:

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* ... ... ...)))
Run Code Online (Sandbox Code Playgroud)

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

zev*_*zev 9

如果您阅读Emacs手册中关于"程序如何加载"的部分,如果正常的库加载命令(例如 - "require","autoload","load-file"等),则应加载js.elc文件.正在使用.调试这个的一些事情:

  1. 您的用户标识是否具有访问该位置的js.el文件的系统安全权限?
  2. 如果您输入M-x emacs-version,您运行的是什么版本的Emacs?
  3. "load-library"命令在"load-path"中搜索lisp文件.检查加载路径的内容时,是否包含指定的目录?
  4. 将变量"debug-on-error"设置为"t"并重新尝试在html页面中编写javascript代码 - 当错误发生时,检查发生错误的源代码行,如果从那里看不清楚是什么导致问题,使用发生错误的源代码行发布更新问题以及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))
Run Code Online (Sandbox Code Playgroud)

在第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)))   
Run Code Online (Sandbox Code Playgroud)

这是在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/"之前.

做#1会在长期内解决问题,而做#2应该让你在短期内使用nXhtml.

  • 在ubuntu上我安装了包"emacs23-el",问题解决了. (4认同)