native Emacs Lisp

archlinux 上使用 libgccjit/pure gtk emacs,我使用 straight.el , 安装好之后打开会自动编译所有 package,除了一些 warning,启动速度慢了1到2s,性能提升很明显。

https://aur.archlinux.org/packages/emacs-pgtk-native-comp-git/

最新版不要升级,我今天升级打不开了,退回倒数第二个版本就可以了。

我的emacsclient没法将emacs呼唤到前台,不知道是不是我系统的问题

会不会是以前生成的eln-cache 导致的, 删掉后试试, 我之前遇到过一次。

我用的是最新版,没问题。应该是eln-cache的问题,需要重新编译。

请教怎么删除?

直接手工删光所有eln文件吧。

其实comp.el里面也实现了重新编译机制。可能是你配置了什么,我这里零配置,Emacs升级之后会自动重新编译。

前几天某个版本有问题,导致加载某些包会出现错误,删掉(非Emacs自带的包的)eln也没用。gdb里看了下栈回溯,我猜是优化得太激进了,没时间再进一步细看。去掉了有问题的包完事儿。

直接手工删除 ~/.emacs.d/eln-cache 目录 重启emacs 即可

我试了一下,应该不是缓存的问题。

Arch系统更新非常快,我用的 28.0.50.145529 (最新版) 就无法启动,用的上一个版本 28.0.50.145362 这个版本就可以正常运行。

我使用Emacs 28.0.50.145653-1,毫无问题(pgtk-native-comp分支)

我也用的这个版本,没有问题,反而是之前有几个版本用起来会崩溃(前面我发的内容)

我用了最新的pgtk-native-comp,试了好多遍,查看/proc/pid/maps发现不加载emacs/eln-cache里的eln文件,,,那效果是不是和elc是一样的,,

更新:发现要先编译成elc再编译eln,直接把el编译成eln虽然也会成功但是没有作用!! 还有发现emacs中的终端好像有时候会丢失一些输出,用外部终端可以看到的信息,emacs的终端只能看到很少一部分(vterm or ansi-term)

终端的bug你要是在Emacs develop mailing list跟作者反馈一下应该会很快修好

在这里mark一下,win10 nt-comp编译成功了,安装还是蛮简单的:

  1. 准备工作
pacman -Syu
pacman -S texinfo
pacman -S mingw-w64-x86_64-libgccjit
  1. 下载emacs源码,并切换到feature/compile 分支,然后
./autogen.sh
  1. 配置configure
./configure --without-dbus --without-pop --with-nativecomp --prefix=/your/path/to/emacs
  1. 编写启动脚本
@ECHO OFF
TITlE Emacs
SET HOME=yourhomepath
CD /C %HOME%
SET PATH=\your\mingw\install\path\mingw64\bin;\your\msys64\install\path\user\bin;%PATH%
\your\emacs\install\path\emacsclientw.exe -n -a \your\emacs\install\path\runemacs.exe -e "(make-frame-visible)"

就OK了 但令我疑惑不解的是:

(native--compile-async "~/.emacs.d/elpa" 4 t)

日志文件感觉全是错?

kill-emacs(-1)
  debug(error (file-error "Removing old name" "Permission denied" "c:/Users/jacklisp/.emacs.d/eln-cache/28.0.50-x86_6..."))
  kill-emacs(-1)
  debug(error (file-error "Removing old name" "Permission denied" "c:/Users/jacklisp/.emacs.d/eln-cache/28.0.50-x86_6..."))
  kill-emacs(-1)
  debug(error (file-error "Removing old name" "Permission denied" "c:/Users/jacklisp/.emacs.d/eln-cache/28.0.50-x86_6..."))
  kill-emacs(-1)
  debug(error (file-error "Removing old name" "Permission denied" "c:/Users/jacklisp/.emacs.d/eln-cache/28.0.50-x86_6..."))
  kill-emacs(-1)
  debug(error (file-error "Removing old name" "Permission denied" "c:/Users/jacklisp/.emacs.d/eln-cache/28.0.50-x86_6..."))
  kill-emacs(-1)
...
  debug(error (file-error "Removing old name" "Permission denied" "c:/Users/jacklisp/.emacs.d/eln-cache/28.0.50-x86_6..."))
  k

估计这个版本的编译模式做了修改,不需要手工调用

native--compile-async

这个命令了,emacs会根据你的使用动态的编译响应el文件,这一点可以从

*Async-native-compile-log* 

这个buffer体现出来,比如当你

M-x lsp

后台就会启动编译相应的lsp-xxx.el等相关文件,感觉不错。 感觉可惜的地方有两点

1. emacs在windows 10上的闪屏问题还是存在,并没有解决
2. 不能dump启动,瞬间没爱了,我看论文是支持的,但没找到方法

搞不定这两个问题我还是去用WSL了:->

2 个赞

错误显示没有权限啊

windows下的一启动就编译了,编译好后再编译就显示这个错误

之前试过一次,一样的问题,但好像直接在mingw64的窗口下启动字符界面的可以完成。不过不是很确定,后来用WSL下的了。

字符界面也不行,估计是这个版本不需要手工调用

native--compile-async

命令了,启动emacs在后台会自动调用,使用到哪个el就编译哪个el,如果可以编译的话。

这一堆错误是eln-cache没法删除,为啥没权限我也没搞懂,手动把.emacs.d的eln-cache删了就好了