如何强制Emacs加载非内部package的.el文件?


#1

前因:https://github.com/emacs-lsp/lsp-mode/issues/592

我在emacs的stackexchange看到的答案基本都是 这样 或这样 让你设置load-suffixes

但是这样有一个问题,Emacs内部package的el文件都是经过gz压缩的。如果直接把.elc去掉就会导致他们无法加载,然后报出以下错误

insert-file-contents: Recursive load: "/usr/share/emacs/26.1/lisp/jka-compr.el.gz", "/usr/share/emacs/26.1/lisp/jka-compr.el.gz", "/usr/share/emacs/26.1/lisp/jka-compr.el.gz", "/usr/share/emacs/26.1/lisp/jka-compr.el.gz", "/usr/share/emacs/26.1/lisp/jka-compr.el.gz", "/usr/share/emacs/26.1/lisp/emacs-lisp/warnings.el.gz

那么问题来了,如何强制Emacs对于外部package强制加载el而不影响内部的包呢


#2

本来就是的呀

我有一个外部的mixal-mode.el 内部也有一个mixal-mode.el.gz

他加载的是外部的


#3

Add recipe to start a minimal environment for convenience of bug-reporting and testing

(let ((default-directory (file-name-as-directory package-dir)))
  (push default-directory load-path)
  (normal-top-level-add-subdirs-to-load-path))

这个想法不错;我更喜欢 Magit 的 M-x magit-emacs-Q-command

这个问题不应该解决。

ELC 文件更快,如果你的 ELC 文件过期了,就应该重新编译以更新 ELC 文件。Emacs 还有个 load-prefer-newer,把它改成 t Emacs 就会哪个更新就加载哪个,但我不推荐修改它——ELC 文件更快。


#4

elc文件backtrace不可读,所以希望尽量加载el文件。

emacs内部package倒是无所谓


#5

你的意思是可读性差一些吧?我没有多少跟 Backtrace 打交道的经验,不清楚这会是个问题。


如果你只需要加载一个文件的话,可以试试 loadNOSUFFIX

(load "foo.el" nil nil t)

#6

会差不少,不过我一时间还没有什么有力的例子来证明。

我其实也是这么想的。不过lsp-mode的依赖比较重。yyoncho觉得一个个手动加载会比较蠢。

Magit这个也不错,不过我我发现用(setq no-byte-compile t)可以让package.el装包时不自动编译。 最后搞了这么一个东西。用package.el手动下载lsp-mode全家桶到一个临时文件夹 然后启动测试。关Emacs直接全部删掉。


#7

也有可能你们走得太远了、考虑的太多了,既然可读性差没有好的解决办法,那就不去解决,也不至于要避免 Byte Compiler。

印象中 Backtrace 遇到 Byte Compiled 的函数,如果看不清楚,我会跑到这个函数的源码,用 C-M-x (eval-defun) 重新执行它一遍,然后重现 Bug,这样 Backtrace 就没有 Byte Compiled 的信息了。


#8

不明白为啥要删除elc,这个本身就是为了效率而编译的,而且完全没有影响backtrace,除非全是lambda函数。