- Emacs的运行方式分析
===================
Emacs可以在大多数目前常见的系统中运行,GNU/Linux、FreeBSD、macOS、Windows等都可以。一般来说在
Emacs主页 下载对应的版本,在本地展开或安装后就可以跑起来了。不过聪明的读者一定发现了,Emacs需要中用户的主目录(系统变量HOME指向的目录),例如,Windows操作系统中登录用户的账户目录(例如C:\Users\ABC),读取配置文件。如果在这个目录中没有找到配置文件,Emacs也会自己创建配置文件,用以保存用户在使用过程中的一些自定义内容。
这样,问题来了,如果我想随身携带Emacs作为写作工具可行吗?我不停的在不同的计算机上写东西,我怎么保证我的写作体验不变呢?难道我需要在每一台临时使用的计算机上安装Emacs的运行环境(特别是那些扩展Package)?那如果遇到了没有Home目录的写入权限怎么办?如果依赖了某些特殊的Package版本怎么版?
听起来,问题似乎非常多。好在,我们现在有一个大家耳熟能详的名词——“绿色软件”。
我们如果可以让Emacs脱离系统定义的HOME目录位置,从一个预先定义好的位置读取配置文件,那不就成了可以独立运行的绿色软件了吗?
- 让Emacs绿色运行
===============
要让Emacs随身运行,我们需要先来看看Emacs配置文件的存放方法
2.1 Emacs的配置文件
在Windows环境下,Emacs的配置文件有如下几种文件保存方法[1]:
-
.emacs
文件。 -
_emacs
文件。以保证在Dos和FAT文件系统下的向前兼容。 -
.emacs.d/init.el
使用init.el作为启动文件,并.emacs.d
目录管理Emacs的各种配置文件。
2.2 全面查看Emacs的配置存放方法
从Emacs的手册中,我们可以看到Emacs配置文件在Windows操作系统中按以下优先级确定指定配置文件的存放位置[2]:
- 如果设置了
HOME
环境变量,那么直接存放在该环境变量指定的目录位置中 - 如果设置了
HKCU\SOFTWARE\GNU\Emacs\HOME
注册表主键,那么使用该主键指明的目录位置 - 如果设置了
HKLM\SOFTWARE\GNU\Emacs\HOME
注册表逐渐,那么使用该主键指明的目录位置。由于该目录位置会被不同Windows用户共享使用,因此不推荐使用该键值。 - 如果
C:\.emacs
存在,则使用C:/.
存放配置文件。
这个设计是为了保证前向兼容,在以前的Emacs版本中,如果HOME
目录没有定义,则使用默认的C:/
作为HOME目录。 - 使用Windows 用户的
AppData
目录。通常这个目录位于用户profile目录中。具体位置根据Windows版本及计算机所在的域名的不同而有所变化。
所以,让Emacs脱离操作系统的限制,以绿色方式运行的方法再指定 HOME
环境变量的内容。而且,需要避免对其他使用HOME环境变量的程序,如
Vim,的影响(如果你想左右互博的话,:P)。
2.3 找到Emacs代码设置HOME环境变量的地方
Emacs提供了在加载用户配置文件前进行运行环境定义的方法,按照代码在运行时刻的执行优先级
[3] 列举如下:
- site-start.el
- init file
- default.el
从这个加载顺序,可以看到,修改site-start.el是修改 init
文件读取位置的好地方。
2.4 确定修改方法
在Emacs中,要设置环境变量,可以使用 setenv
函数来实现。查看帮助,我们看到函数定义是:
(setenv VARIABLE &optional VALUE SUBSTITUTE-ENV-VARS)
。所以,我们可以使用这样的形式来设置环境变量:
(setenv "HOME" "path/to/some/directory")
为了让Emacs脱离特定操作系统的设置,我们可以写一些小代码,动态获得当前Emacs所在的目录,并将其所在磁盘的根目录下的home
目录(名)作为存放配置文件的HOME目录。
所以我们可以得到完整的代码。
2.5 Emacs代码
(defvar PortableHome (substring data-directory 0 3))
(defvar usb-home-dir (concat PortableHome "home/"))
(setenv "HOME" usb-home-dir)
- 代码使用及总结
==============
3.1 代码使用
将上述代码存放到site-start.el文件中。并将这个文件存放到Emacs的site-lisp目录中。并将你的配置文件放到Emacs所在磁盘根目录下的home目录中(按照.emacs、emacs、.emacs.d/init.el三种方式之一),好了,重启Emacs,你应该看到,你的Emacs已经按照你的配置运行起来啦!
把Emacs相关文件以及你新创建的Home目录中的所有内容都复制到一个U盘中吧,你会发现无论在那一台计算机上,你的Emacs都可以一如既往为你提供统一的文本编辑功能啦!
3.2 总结
本文描述了让Emacs脱离特定操作系统的限制(更换操作系统类型时,需要使用对应系统的Emacs可执行文件,但配置文件是可以做到统一的)。在U盘中运行的一种方法。我使用这种方法,使我的Emacs在从Win7升级到Win10的过程中,不必重新进行任何配置,保持了统一的使用体验。也让我在解决使用Windows的过程中一定会遇到的重新安装系统,简化了工作环境初始化的工作量。
我可以安心的去喝一杯可乐,等待备份复制进程跑完,我的Emacs就会满血复活。
你们的Emacs呢?:P
- 参考文档
=========
-
https://www.gnu.org/software/emacs/manual/efaq-w32.html#Location-of-init-file ↩
-
https://www.gnu.org/software/emacs/manual/efaq-w32.html#Location-of-init-file ↩
-
从Emacs的site-run-file变量文档中看到,不同配置文件的执行优先级顺序。 ↩