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

How to start emacs with specific user-init-file and user-emacs-directory?

我希望能够并行启动多个具有不同配置的 emacs 实例。我还希望能够将 symlink 对应的目录复制到 ~/.emacs.d(或者在我的例子中是 ~/.config/emacs),而无需忽略 sym[=] 中的 init.el 文件104=]ed 目录或将额外的 lisp 代码写入 init.el 来处理这个问题。最后一部分会变得清晰,在我列出可能但(对我来说)不令人满意的解决方案之后,我发现:

  1. 解法:

    env HOME=$HOME/path/to/a/pseudo/home/directory emacs
    

    发现于 How to start up emacs with different configurations?

    问题:

    The down-side to this technique is that Emacs won't see all your other dot files (because it will be looking in $HOME), and so running other processes from within Emacs won't necessarily work as normal; but that's not likely to be a huge issue if you're just experimenting, and you can always symlink or copy the bits you need.

  2. 解法:

    alias emacs='emacs -q --load "/path/to/init.el"'
    

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

    (setq user-init-file (or load-file-name (buffer-file-name)))
    (setq user-emacs-directory (file-name-directory user-init-file))
    

    发现于 How to start emacs with a custom user-emacs-directory?

    问题:

    • it breaks emacs-init-time[...].
    • it is not equivalent to a normal startup [...]:
      • after-init-hook is run before the init file is loaded.
      • The *scratch* buffer is created before the init file is loaded. You'll have to change its mode explicitly (instead of using initial-major-mode).
      • You'll need to explicitly call package-initialize; it won't be done automatically
  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)))"
    

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

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

    另一种解决方案——在某些线程中提到(删除了 link,但 google 有帮助)——是使用标准 init.el 编写一个开关,例如受控通过一个专用的环境变量,然后加载相应的 init.el 并设置 user-emacs-directory.

    Tianshu Wang mentioned chemacs2,通过命令行参数而不是环境变量到底是做什么的。

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

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

还是我遗漏了什么?

编辑#1:真的。这让我很困惑。我环顾四周。人们正在摆弄配置文件以获得这种行为。或者飞到月球来解决这个问题。或说方言。或者召唤恶魔。或其他。

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

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

    git 上的 emacs 变更日志:

    * Startup Changes in Emacs 29.1
    
    +++
    ** Emacs now supports setting 'user-emacs-directory' via '--init-directory'.
    

对自己的注意事项:首先查看软件即将发生的变化,然后再询问互联网的其他部分。但在这种特殊情况下,还是值得的。

检查chemacs2,这就是你需要的。