随身携带你的神器——Emacs

  1. Emacs的运行方式分析
    ===================

Emacs可以在大多数目前常见的系统中运行,GNU/Linux、FreeBSD、macOS、Windows等都可以。一般来说在
Emacs主页 下载对应的版本,在本地展开或安装后就可以跑起来了。不过聪明的读者一定发现了,Emacs需要中用户的主目录(系统变量HOME指向的目录),例如,Windows操作系统中登录用户的账户目录(例如C:\Users\ABC),读取配置文件。如果在这个目录中没有找到配置文件,Emacs也会自己创建配置文件,用以保存用户在使用过程中的一些自定义内容。

这样,问题来了,如果我想随身携带Emacs作为写作工具可行吗?我不停的在不同的计算机上写东西,我怎么保证我的写作体验不变呢?难道我需要在每一台临时使用的计算机上安装Emacs的运行环境(特别是那些扩展Package)?那如果遇到了没有Home目录的写入权限怎么办?如果依赖了某些特殊的Package版本怎么版?

听起来,问题似乎非常多。好在,我们现在有一个大家耳熟能详的名词——“绿色软件”。

我们如果可以让Emacs脱离系统定义的HOME目录位置,从一个预先定义好的位置读取配置文件,那不就成了可以独立运行的绿色软件了吗?

  1. 让Emacs绿色运行
    ===============

要让Emacs随身运行,我们需要先来看看Emacs配置文件的存放方法

2.1 Emacs的配置文件

在Windows环境下,Emacs的配置文件有如下几种文件保存方法[1]

  1. .emacs 文件。
  2. _emacs 文件。以保证在Dos和FAT文件系统下的向前兼容。
  3. .emacs.d/init.el 使用init.el作为启动文件,并 .emacs.d
    目录管理Emacs的各种配置文件。

2.2 全面查看Emacs的配置存放方法

从Emacs的手册中,我们可以看到Emacs配置文件在Windows操作系统中按以下优先级确定指定配置文件的存放位置[2]

  1. 如果设置了 HOME 环境变量,那么直接存放在该环境变量指定的目录位置中
  2. 如果设置了 HKCU\SOFTWARE\GNU\Emacs\HOME
    注册表主键,那么使用该主键指明的目录位置
  3. 如果设置了 HKLM\SOFTWARE\GNU\Emacs\HOME
    注册表逐渐,那么使用该主键指明的目录位置。由于该目录位置会被不同Windows用户共享使用,因此不推荐使用该键值。
  4. 如果 C:\.emacs 存在,则使用 C:/. 存放配置文件。
    这个设计是为了保证前向兼容,在以前的Emacs版本中,如果 HOME
    目录没有定义,则使用默认的 C:/ 作为HOME目录。
  5. 使用Windows 用户的 AppData
    目录。通常这个目录位于用户profile目录中。具体位置根据Windows版本及计算机所在的域名的不同而有所变化。

所以,让Emacs脱离操作系统的限制,以绿色方式运行的方法再指定 HOME
环境变量的内容。而且,需要避免对其他使用HOME环境变量的程序,如
Vim,的影响(如果你想左右互博的话,:P)。

2.3 找到Emacs代码设置HOME环境变量的地方

Emacs提供了在加载用户配置文件前进行运行环境定义的方法,按照代码在运行时刻的执行优先级
[3] 列举如下:

  1. site-start.el
  2. init file
  3. 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)
  1. 代码使用及总结
    ==============

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

  1. 参考文档
    =========

  1. https://www.gnu.org/software/emacs/manual/efaq-w32.html#Location-of-init-file

  2. https://www.gnu.org/software/emacs/manual/efaq-w32.html#Location-of-init-file

  3. 从Emacs的site-run-file变量文档中看到,不同配置文件的执行优先级顺序。

推荐阅读更多精彩内容