wuhen
1
大家有没有遇到emacs28在windows上安装包时内存泄露问题?
我试下emacs28.2和emacs28都存在这个问题。
安装包配置
(require 'package)
(setq package-archives '(("gnu" . "http://mirrors.cloud.tencent.com/elpa/gnu/")
("melpa" . "http://mirrors.cloud.tencent.com/elpa/melpa/")))
(package-initialize)
操作系统:windows 10 Home版本
操作:M-X package-install use-package
结果:emacs卡死,内存成倍狂飙,直到内存耗尽
blove
2
在Windows中,已经用回了 27.2版本。
从28.1开始,windows版只要一起动,就弹出编译警告,同时会在.emacs.d配置目录内产生一个log目录,不断的产生错误记录文件。这种现象到了28.2版本依然存在。
用起来有点恐惧感。所以换回旧版了。
我在 Windows 上从 27 开始就一直用的 master分支(现在是 29.0.50),挺好用的,速度也快,更重要的是 29 支持双缓冲了,滚动屏幕不会闪烁。从来没遇到过内存泄露。
@blove 你说的 log 目录是 eln-cache
?
blove
4
是的。那个目录会自动生成,里面会不断增加类似调试记录的文件。
这个是 native compilation 第一次编译包生成的文件,你看到的警告是编译时的提示信息,没关系的。编译完成后以后就不会显示了。
但如果你的配置用了懒加载,会在你第一次使用的时候进行编译,等一下就好了。
这可是 28.1 的大功能更新,别怕
1 个赞
blove
6
xxoo
7
这个功能很是不便,每次更新插件就要重新编译一次。
都没个开关选项的。
blove
8
刚才试了一下,运行 emacs 后 eln-cache\28.2-5a1d5235 目录产生了 135 个 tmp 或 eln 文件!心想这回再启动 emacs 应该不用再编译了吧!结果重启 emacs 后又重新编译,重复这个过程,又新产生 135 个文件! 有没有设置可以关闭这个编译呢?!
你是不是把这个目录删了啊? 不要手动删。如果不喜欢那个目录可以自己改。
(when (and (>= emacs-major-version 28) (native-comp-available-p))
(setq native-comp-eln-load-path YOUR_PREFERRED_PATH
native-comp-async-report-warnings-errors 'silent))
这个顺便把警告也关了。
关它干嘛呢,习惯就好了。
1 个赞
你要等编译完成,再重启。编译是需要一点时间的。
你可以切到 *Async-native-compile-log*
这个buffer 查看编译的进度,最后看到 finished,就说明目前加载的包都编译完成了。
如果你继续使用的话,遇到第一次使用的包,还会继续执行编译,稍微等一下。
建议不要关闭,因为编译过程使用 Emacs 的话,会感觉卡顿的,关闭提示的话,反而以为是哪里出问题了。你反正用了 28 稳定版,用一段时间后,以后就不会提示了。
如果希望直接就全部编译好内置的包,可以自己手动编译。
下面是我在 windows 上用的编译命令,可以用于编译 29 也可以编译 28. 其中的 NATIVE_FULL_AOT=1
就是在编译 Emacs 时同时编译内置的包为 eln,但是这个会增加编译的时间。
./autogen.sh
./configure --with-native-compilation --without-dbus
make -j$(nproc) NATIVE_FULL_AOT=1
make install prefix=/c/opt/emacs
这是我记录的在 Windows 上的编译步骤,或者直接看Emacs 官方仓库的编译安装说明:
blove
11
我并没有删除那个目录,重启emacs后,会在那个目录继续增加文件!比如原先编译完成后,那个目录产生了 135 个文件,重启后又编译一次,翻了一倍 135 + 135 个文件!
eln-cache 这个目录不用管它的,路径其实也没必要去修改。如果 .emacs.d 是用 Git 管理,直接把它加入 .gitignore 文件忽略就好了。
1 个赞
blove
15
目前尝试编译安装,在执行到
./configure --with-native-compilation --without-dbus
提示错误
configure: error: ELisp native compiler was requested,
but libgccjit was not found.
Please try installing libgccjit or a similar package.
libgccjit 应该如何安装?
执行到
make -j$(nproc) NATIVE_FULL_AOT=1
这一步时,提示缺少 gnutls,即使在 configure 时,加了 --with-gnutls=ifavailable
./configure --with-native-compilation --without-dbus --with-gnutls=ifavailable
也不行!
pacman -S gnutls
后,在 msys 目录能只找到这两个 dll
blove
16
源码是在 Index of /pub/gnu/emacs 这里下载的!不知道是不是与github上的一致!
在启动msys2的 mingw64 环境,执行 pacman -S mingw64/mingw-w64-x86_64-libgccjit
应该可以安装。
但其实不用单独安装,你执行下面这段,应该就自动帮你装好了所有的依赖。
pacman -S --needed base-devel \
mingw-w64-x86_64-toolchain \
mingw-w64-x86_64-xpm-nox \
mingw-w64-x86_64-libtiff \
mingw-w64-x86_64-giflib \
mingw-w64-x86_64-libpng \
mingw-w64-x86_64-libjpeg-turbo \
mingw-w64-x86_64-librsvg \
mingw-w64-x86_64-libwebp \
mingw-w64-x86_64-lcms2 \
mingw-w64-x86_64-jansson \
mingw-w64-x86_64-libxml2 \
mingw-w64-x86_64-gnutls \
mingw-w64-x86_64-zlib \
mingw-w64-x86_64-harfbuzz
这个源码是可以的, 这是 28.2。记得要用 mingw64 的环境执行编译。
如果想用最新的 emacs-28,可以从github 下载:
这个确实有点烦人。
对于内置的包,可以编译安装的时候直接加 NATIVE_FULL_AOT=1,就全部编译好了。
macOS 上如果是使用 macports 安装的话,默认也是开启这个选项的。其他平台的不清楚。
对于第三方包,我目前的做法是,第一次启动 Emacs 时全都加载所有的第三方包,这样就会触发所有的包都编译了。使用过程中就不会有任何提示。
我优先使用 stable melpa 的包,更新插件的数目比较少。这样配置比较稳定。emacs 28 的native compilation特性对我也没什么副作用。
技术细节见 How to manage Emacs packages effectively | Chen's blog