如何使用特定的 user-init-file 和 user-emacs-directory 启动 emacs?

Lit*_*ser 5 emacs startup

我希望能够启动多个具有不同配置的并行 emacs 实例。我还希望能够将相应的目录符号链接到~/.emacs.d(或在我的情况下~/.config/emacs),而无需忽略符号链接init.el目录内的文件或写入额外的 lisp 代码init.el来处理此问题。在我列出了可能但(对我来说)不令人满意的解决方案之后,最后一部分将变得清晰,我发现:

  1. 解决方案:

    env HOME=$HOME/path/to/a/pseudo/home/directory emacs
    
    Run Code Online (Sandbox Code Playgroud)

    找到如何使用不同的配置启动 emacs?

    问题:

    这种技术的缺点是 Emacs 不会看到所有其他点文件(因为它将查找$HOME),因此从 Emacs 内运行其他进程不一定能正常工作;但如果您只是进行试验,那么这不太可能是一个大问题,并且您始终可以符号链接或复制您需要的位。

  2. 解决方案:

    alias emacs='emacs -q --load "/path/to/init.el"'
    
    Run Code Online (Sandbox Code Playgroud)

    每个init.el文件都是这样开始的,以正确设置user-init-file和user-emacs-directory变量:

    (setq user-init-file (or load-file-name (buffer-file-name)))
    (setq user-emacs-directory (file-name-directory user-init-file))
    
    Run Code Online (Sandbox Code Playgroud)

    找到如何使用自定义用户 emacs 目录启动 emacs?

    问题:

    • 它打破了emacs-init-time[...]。
    • 它不等同于正常启动[...]:
      • after-init-hook在加载 init 文件之前运行。
      • 缓冲区*scratch*是在加载 init 文件之前创建的。您必须显式更改其模式(而不是使用initial-major-mode)。
      • 您需要显式调用package-initialize; 它不会自动完成
  3. 也许是一个解决方案:

    以下不起作用。

    alias emacs='emacs -q --eval "(progn (setq user-init-file /path/to/init.el) (setq 
    user-emacs-directory (file-name-directory user-init-file)))"
    
    Run Code Online (Sandbox Code Playgroud)

    但我不知道这样的事情是否真的有效并可以通过上述解决方案解决问题。我找不到--eval启动过程中何时执行。我也不知道,我如何测试,何时after-init-hook执行。

  4. 解决方案(编辑#2):

    另一个解决方案 - 在一些线程中提到(删除了链接,但谷歌帮助) - 是使用标准init.el编写一个开关,例如由专用环境变量控制,然后加载相应的 init.el 并设置用户-emacs-目录。

    Tianshu Wang提到chemacs2,它到底是通过命令行参数而不是环境变量来实现的。

    就我而言,我会采取这种方式,因为它还处理额外的配置文件,例如由 spacemacs 创建的文件。但另请参阅解决方案 5。

让我困惑的是,emacs 没有为user-init-file和提供任何命令行参数user-emacs-directory。

或者我错过了什么?

编辑#1:真的。这让我很困惑。我进一步环顾四周。人们通过修改配置文件来获得这样的行为。或者飞到月球来解决这个问题。或用方言说话。或者召唤恶魔。管他呢。

  1. 解决方案(编辑#3):

    使用git版本的emacs或者等待正式发布emacs29.1

    git 上 emacs 的 Changlog:

    * Startup Changes in Emacs 29.1
    
    +++
    ** Emacs now supports setting 'user-emacs-directory' via '--init-directory'.
    
    Run Code Online (Sandbox Code Playgroud)

对自己说:在询问互联网的其他部分之前,首先要了解软件即将发生的变化。但在这种特殊情况下,还是值得的。

Tia*_*ang 2

检查chemacs2,这就是您所需要的。