如何使用特定的 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
来处理这个问题。最后一部分会变得清晰,在我列出可能但(对我来说)不令人满意的解决方案之后,我发现:
解法:
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.
解法:
alias emacs='emacs -q --load "/path/to/init.el"'
每个 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))
发现于 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
也许是一个解决方案:
以下无效。
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
被执行时,我该如何测试。
解决方案(编辑#2):
另一种解决方案——在某些线程中提到(删除了 link,但 google 有帮助)——是使用标准 init.el
编写一个开关,例如受控通过一个专用的环境变量,然后加载相应的 init.el 并设置 user-emacs-directory.
Tianshu Wang mentioned chemacs2,通过命令行参数而不是环境变量到底是做什么的。
就我而言,我会采用这种方式,因为它还处理额外的配置文件,例如由 spacemacs 创建的。但另请参阅解决方案 5。
令我困惑的是,emacs 没有为 user-init-file
和 user-emacs-directory
提供任何命令行参数。
还是我遗漏了什么?
编辑#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,这就是你需要的。
我希望能够并行启动多个具有不同配置的 emacs 实例。我还希望能够将 symlink 对应的目录复制到 ~/.emacs.d
(或者在我的例子中是 ~/.config/emacs
),而无需忽略 sym[=] 中的 init.el
文件104=]ed 目录或将额外的 lisp 代码写入 init.el
来处理这个问题。最后一部分会变得清晰,在我列出可能但(对我来说)不令人满意的解决方案之后,我发现:
解法:
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.解法:
alias emacs='emacs -q --load "/path/to/init.el"'
每个
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))
发现于 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 usinginitial-major-mode
). - You'll need to explicitly call
package-initialize
; it won't be done automatically
- it breaks
也许是一个解决方案:以下无效。
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
被执行时,我该如何测试。解决方案(编辑#2):
另一种解决方案——在某些线程中提到(删除了 link,但 google 有帮助)——是使用标准
init.el
编写一个开关,例如受控通过一个专用的环境变量,然后加载相应的 init.el 并设置 user-emacs-directory.Tianshu Wang mentioned chemacs2,通过命令行参数而不是环境变量到底是做什么的。
就我而言,我会采用这种方式,因为它还处理额外的配置文件,例如由 spacemacs 创建的。但另请参阅解决方案 5。
令我困惑的是,emacs 没有为 user-init-file
和 user-emacs-directory
提供任何命令行参数。
还是我遗漏了什么?
编辑#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,这就是你需要的。