关于emacs的版本与启动时加载目录的问题~


#1

最近想要学习spacemacs,但是由于每天都离不开emacs,所以想要在现有的emacs可以运行的情况下hack spacemacs。怎么让emacs怎么能启动时加载不同的目录呢?一个是emacs,一个是需要hack的spacemacs。emacs启动时是不是默认加载.emacs.d目录?可以修改吗?


#2

emacs --with-profile my-profile


#3

也可以考虑直接写两个alias,来回mv文件夹


#4

感谢大佬~~!!


#5

I’m newbiee


#6

什么意思,可以详细说明一下吗?


#7

我在用的命令:

alias spacemacs='mv ~/.emacs.d ~/.backup/purcell && mv ~/.backup/sp ~/.emacs.d'
alias purcell='mv ~/.emacs.d ~/.backup/sp && mv ~/.backup/purcell ~/.emacs.d'

#8

来回 mv 有一个问题是如果在用的 emacs中有 autoload 对应的文件尚未加载,待使用 autoload 函数时会报错(文件无法找到)。

不知道你们如何解决的?


#9

话说 emacs 为何不提供一个指定 user-emacs-director 的命令行选项,这样灵活多了。


#10

关了emacs再做mv啊……


#11

好吧,我比较习惯原来的保留运行,同时体验新的配置。


#12

你需要更加无痛的方式:


#13

找了下在启动时指定目录的功能,发现几年前就有人提了补丁。但 Emacs 开发者认为没有必要:

  • 会增加维护成本;
  • 此特性没有很迫切的使用场景,且当前不是没有解决方案,只是不那么方便。

补丁提交人 François Févotte 总结了目前有三种方法:

  1. 设置 =HOME= 环境变量

    缺点: Emacs 及其子进程会把 =~/= 解析为新设置的 =HOME= 目录,容易混乱

  2. 设置 =~/.emacs.d/= 的软链接

    缺点:多个 Emacs 运行实例,必须共享同一个配置目录

  3. 使用 =emacs -q -l SOMEWHERE/init.el= 启动,在 =SOMEWHERE/init.el= 中设置 =user-init-file= and =user-emacs-directory=

    缺点:会 bypass 正常启动流程,有些功能比如 =emacs-init-time= 、 =after-init-hook= 无法正常工作

我比较倾向与方法1, @twlz0nehere-emacs 脚本刚才看了下也是采用此种方案。


#14

Emacs 有个 --user 不知道能不能利用上

--user, -u USER             load ~USER/.emacs instead of your own

#15

Good to know that.

试了一下,这个应该是指系统的用户。创建用户比较麻烦,我指定一个不存在的用户,会警告( *Warnings* ):

Error (initialization): User foo has no home directory

想不通这个选项的使用场景,一般也访问不了其他用户的权限啊,除非是 root 。


#16

可能需要一些 Unix 用户管理的知识。不见得就需要 root,有相关的权限就行。


#17

就是因为修改不了其它用户的文件,我才可以放心用这个帐户搞事。我写 Common Lisp 就是另外开了一个没有设置密码的低权限账户,然后从主用户 su 过去以免操作失误产生垃圾文件污染到关键路径,产生的缓存文件也不需要一个个手动清理,只要 rm 这个专用账户的 $HOME 就行,甚至可以放心地全盘 find rm 属于这个专用账户的文件。


#18

首先这个用户要存在,比如在 mac 下:

⋊> dscl . read /Users/foo
...
NFSHomeDirectory: /Users/foo
Password: ********
PrimaryGroupID: 80
RealName:
 Test User
RecordName: foo
RecordType: dsRecTypeStandard:Users
UniqueID: 1010
UserShell: /bin/bash

@xuchunyang @LdBeth 但似乎并没有起到隔离作用,环境变量依然是当前用户的:

⋊> emacs -user foo --batch --eval \
   '(message "=> %S" (string= "'$HOME'" (getenv "HOME")))'
=> t

#19

所以我是 su 到开发用户,再反过来用这个选项指定价值主用户配置的。毕竟对我来说没必要搞很多份配置。


#20

为啥我指定了emacs executable path,它还是在terminal里打开了。。