gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:50:28 24 4
gpt4 key购买 nike

我最近开始使用 django-html-mumamo-mode ,它是 emacs 中 nXhtml 的一部分,除了当我开始在 html 页面中编写 javascript 代码时,我得到警告/错误

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

我 checkin 了那个文件夹,所有文件都有 .elc扩展名包括 js.elc ,这可能是emacs找不到它的原因。我可以改变一些东西让emacs只加载 .elc吗?文件?

编辑:如果我运行 M-x load-library js,这种情况会继续发生或 M-x load-library js.elc
编辑2:我已确认 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* ... ... ...)))

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

最佳答案

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

  • 您的用户 ID 是否具有系统安全权限来访问该位置的 js.el 文件?
  • 如果你输入 M-x emacs-version,你运行的是什么版本的 Emacs?
  • “load-library”命令在“load-path”中搜索 lisp 文件。当您检查加载路径的内容时,指定的目录是否在其中?
  • 将变量 "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))

    在第 2 行,该函数将库名称设置为等于“*.elc”库名称减去“c”(例如,它从“/usr/share/emacs/23.2/lisp/progmodes/js.elc”转换它"到 "/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 发行版一起提供,所以不再这样做了。因此,在他的环境中,他可能在与“.elc”文件相同的目录下有“.el”文件,并且没有遇到过这个问题。所以,你应该做两件事:
  • 通知 nXhtml 库的作者,以便他修复代码中的错误。
  • 将必要的“.el”源文件复制到“/usr/share/emacs/23.2/lisp/progmodes/”,以免出现错误。或者,您可以选择在另一个目录中重新安装 js.el(可能还有其他一些模块),并将该目录放在“加载路径”中的“/usr/share/emacs/23.2/lisp/progmodes/”之前.

  • 执行 #1 将长期解决问题,而执行 #2 应该让您在短期内使用 nXhtml。

    关于Emacs 错误地寻找 .el 而不是 .elc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7112751/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com