攒了自己一点配置,发现必须要有一个包管理机制,有什么好的建议,能避免一些坑

攒了自己一点配置,发现必须要有一个包管理机制

对于 borg, straight.el , submodule(或者还有什么新的思路),之间的区别或者坑,还是不很清楚。 能给一些建议吗?


自己想用 submodule ,也更轻量,还不知道有什么坑 感觉用了 straight.el,自己在写另一个 doom

1 个赞
  • straight.el 代替默认的 package.el,方便下载 github 上的代码
  • use-package 管理不同的包,把相应的代码放在一起,无缝结合 straight.el
  • org-babel 把自己的配置以文档的形式写出来,自动生成配置代码,方便维护

你可以看看我的配置作为参考:ward-emacs/config.org at master · willbchang/ward-emacs · GitHub

个人觉得自己的配置,加上自己日常使用的东西就行了,很多东西觉得用得上,其实装上就没再用过了。

1 个赞

除了straight基本一样。straight就是下载更新太慢了,如果不用melpa以外的包的话感觉没必要上straight。

straight.el 下载包我这边几秒钟就好了,所以就切过来了。

包管理应考虑 是否需要换源

我的配置中粘贴过来的。

我尝试过的 Emacs 配置方式有多种,尝试过的 Emacs 包管理方法有 ~package.el~ ~straight.el~ ~git submodule~ ~borg.el~ 。

最开始使的 Emacs 时,将所有的配置文件放到 ~init.el~ 文件中。后来学习了别人的配置方法,将配置分解到以 ~init-~ 为前缀的多个子文件中。现在我使用 org-mode (见[[https://en.wikipedia.org/wiki/Literate_programming][文学编程]])组织 Emacs 配置文件。

使用 org-mode 管理自己的配置文件也经历了多个阶段。最开始是直接写在 org 文档中,加载 Emacs 的时候,自动检测该文件的状态,自动解析 org 文档到 el 文件中,这种方式导致 Emacs 启动较慢。后来使用函数在关闭 Emacs 时将 org 文档 tangle 到 el 文件中。现在我使用 org-auto-tangle 这个包,当配置文件发生变动时就自动的 tangle 配置文档。

原来我将 org 文档 tangle 到多个以 ~init-~ 为前缀的子文件中,这样的好处是,可以使用 git 对配置进行更精细化的版本管理。但是在尝试了用了几次后,发现,Emacs 的启动速度慢了很多。

关于包的管理,我使用 git submodule 进行。使用 git submodule 进行包的管理,个人具有最大的可控制性。[[GitHub - emacscollective/borg: Assimilate Emacs packages as Git submodules][Borg]] 是对 git submodule 的一个包裹,相对完全使用 git submodule 的方式更方便一些。关于此包的详细的使用方法见 [[Top (Borg User Manual)][Borg官方手册]]。

是否需要使用 use-package 类的包?我的回答是不需要。使用 Borg 管理有个好处是, ~borg-assimilate~ 后的包和 Emacs 的内置包一样,不需要使用 use-package 或 leaf 此类包对配置文件进行包裹。在配置中不需要使用 ~require~ 调用某个包,Borg 的方式不会增超 Emacs 的启动时间,我目前有一百六十多个包,启动时间在 +1.6s+ 0.7s 左右(MacOS M1, Emacs 28.1)。

一般的流程是使用 ~epkg-describe-package~ 查看包的依赖,然后直接使用 ~borg-assimilate~ 命令安装包。或者先使用 ~borg-clone~ 命令克隆包到本地,然后使用 ~borg-build~ 对包进行编译安装。

但是我一般直接使用 ~borg assimilate~ 命令安装某个包,之后跟据 ~Borg Build~ buffer 的提示安装相应依赖包。重复上述的步骤,即可。

如果一个包并不在 melpa 上,就需要到 github 上获取链接。

重新 build 一个包之前可以对 .gitmodules 进行编辑,下面给出示例:

[submodule "magit"]
	path = packages/magit
	url = git@github.com:magit/magit.git
	no-byte-compile = lisp/magit-libgit.el
	recursive-byte-compile = true
[submodule "auctex"]
	path = packages/auctex
	url = git@github.com:emacsmirror/auctex.git
	build-step = ./autogen.sh
	build-step = ./configure --with-texmf-dir=$HOME/texmf
	build-step = make
	build-step = sudo make install
[submodule "corfu"]
	path = packages/corfu
	url = git@github.com:minad/corfu.git
	load-path = .
	load-path = ./extensions

简单说明:如果不想 compile 一个包就使用 no-byte-compile 选项。比如,我不使用 helm 插件,有些包提供了关于 helm 的支持,此时我就可以不 compile 对应的文件,那么 Emacs 就不会加载这些配置。

Borg 升级包,可以在 magit 界面中进行,按 ~f m~ 获取 submodule 的更新,展开 ~Modules~ 可以看到 ~Modules unpulled~ ,进入相应的包中的 magit 界面,通过按 ~SPC k~ 删除 ~Untracked files~ ,然后按 ~m~ merge 配置。最后使用 ~borg-build~ 重新 build 包即可升级相应的包。有时候会提示某个文件有旧的版本,那么就需要进行这个包的文件夹,把 ~.elc~ 文件删除然后再重新 build 。

6 个赞

参考我的配置, https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-elpa.el

使用emacs内置的包管理,主要目的就是追求稳定。

我写的插件 https://github.com/redguardtoo/elpa-mirror 可以建立本地包仓库

1 个赞

package-initialize 这个会加载包,对启动速度的影响,是怎么考虑呢

我用 Borg 有一段时间了,总体上是比较满意的。不过如果像你上面的安装 corfu 插件时,在配置目录下就没法启动 C-x p f project-find-file, 回卡死 Emacs,已经反馈给上游。

Borg 的亮点是将第三方包吸收(Assimilate)到子模块中以后,第三包就时 autoload的,可以像内置包一样去使用。

另外,在 Windows 上尽量不要用 Borg,因为它依赖 magit,要管理 几十甚至几百个子模块,在 Windows 上基本上属于不可用状态。但 Borg 在 Linux 下用,很流畅,macOS 稍微有一点点慢。

1 个赞

没过过这个命令,不知道有这个问题呢。

刚试了下,的确有这个问题。

我已经给Emacs 报了这个 bug,目前维护者给的临时方案是不要让project.el 去查询子模块。 设置 project-vc-merge-submodules 为 nil

等更新吧,我还没尝试用 project

分享一下Emacs插件管理方法,主要依赖 eaf-git

  1. 添加插件 eaf-git submodule 按 a 键添加 github url, 如果发现少依赖了,继续添加
  2. 把玩插件 切换到 config 目录,新建一个配置文件,手写 require 和 setq 来配置新插件
  3. 去和留 新插件用起来不错,切换到 eaf-git dashboard 按 y 键 commit/push, 不喜欢新的插件按 d 键删除干净

平常维护:

  1. 升级插件 eaf-git submodule 按 u 键升级插件,继续把玩
  2. 保留升级 升级版本用了几天没啥bug, 切换到 eaf-git submodule 按 y 键记录升级
  3. 回滚旧版 升级新版本有bug, 但是又没时间折腾,切换到 eaf-git submodule 按 r 键自动回滚到上一个版本
  4. 清理插件 很多插件都是用的时候和心动,其实时间长了,自己并不经常用,eaf-git submodule 按 d 键,干干净净自动删除 submodule

我日常就是借助 eaf-git 的 submodule 功能管理所有插件的原始文件,自己定制就在 config 目录手写点 require、setq、 hook、 advice, 一般顺手用 lazy-loadone-key 这两个包把新的插件配置做成运行时按需加载的模式,保持Emacs的极限速度。

我一般安装新插件以后,基本上一年才更新一次,因为 git submodule 会完全杜绝 今天手贱升级以后,啥事都没干, 尽在折腾兼容性 的问题, 留下更多时间看书和创作。

上面就是我的插件折腾方法,不需要花哨的包管理器,兼顾灵活、直观、快速和可回滚。

4 个赞

从懒猫大佬的配置中学到很多

没研究过,我就是抄其他配置。emacs 27不需要运行这一行。