咨询 Emacs 包按条件加载的方案

目前遇到的问题

手头上有多台各操作系统的机器(Linux,Mac),上面安装有多版本的 Eamcs(主要是26,27 两个版本),目前这多台机器使用同一个 .emacs 配置文件进行配置,导致有如下问题:

  1. Emacs 版本不同,有些包不支持低版本的 Emacs,如 tree-sitter。
  2. 有些机器性能很差,带不动比较大的包,如 eglot及相关的 LSP 后端
  3. 有些机器键盘不同,导致写在 .emacs 中的按键映射冲突,如 Mac 下不能使用部分快捷键

目前的处理策略

对于问题 1 和 2,在对应的机器上的 .emacs 配置中注释掉对应的包引入代码。对于问题 3,通过其他工具改键或者修改 .emacs 中的按键映射。这个办法会在导致下面几个比较麻烦的问题:

  1. 不同机器上 .emacs 配置差异越大越大
  2. 每次使用一台新机器,需要重复花时间解决配置问题
  3. 保存 .emacs 配置文件的仓库更新后,不能直接拉下来使用,需要处理冲突。

想解决的问题

在不将配置拆分为多个文件或者为不同系统分别写一套配置的情况下,想知道 Emacs 下有没有类似包或者语法可以实现按条件加载包, 可以实现 C 中的宏定义效果,类似于如下伪代码,通过不同的条件判断来判断是否加载包或者使用不同的按键映射。

#if 机器是 Linux 系统
  (use-package eglot)
#endif

#if 机器内存大于 4 G
  (use-package lsp-mode)
#endif

如果有好的方案,希望能分享一下。

感谢分享,我尝试一下。

(shell-command-to-string "hostname") 可以显示电脑的hostname.

1 个赞

这和用 (system-name) 有什么区别吗?

配置文件不用,但包是要编译后使用的,如果26编译安装的包在27使用会有一些未知问题,一般升级emacs后都需要将所有包重新编译一遍。如果多版本共存应该只有用 更换home目录的办法

use-package本身就有if关键字

1 个赞

用这个写法确实可以实现条件加载的功能。

上面可能没说清楚,是指有多台机器,不同机器上的 Emacs 版本不同,目前通过上面的网友说的 use-package 包的 :if 参数解决了这个问题。