在 windows 平台将 emacs 绿色化的方法

概要

其实在 windows 平台的 emacs 本来就是绿色软件,但是其配置文件的位置并不是可移动的,而是 用户的个人文件夹或者环境变量、注册表中的 home 变量指定的位置。

这篇博客 里面有一个将配置文件放在 emacs 文件夹中的方法,但是这个代码只能将配置文件放在 emacs 目录/share/emacs/当前版本号/ 之中,而我想要把含有配置文件的文件夹放在 emacs 根目录下,这是我的代码:

    (defvar program-dir
      (replace-regexp-in-string "share/emacs.*/etc/$" "home/" data-directory :from-end))
    (setenv "HOME" program-dir)
    (load "~/.emacs.d/init.el")

将上述代码放在 emacs 目录/share/emacs/site-lisp/site-start.el 中即可,没有这个文件就新建 一个。然后在 emacs 目录中新建一个 home 文件夹来存放配置文件,就可以在启动 emacs 的时候读取了。

原理

data-directory 变量表示 emacs 文件夹下的 ect 文件夹地址,这里面含有 emacs 的地址。

    data-directory
c:/TOTALCMD/tools/emacs/share/emacs/24.5/etc/

我们可以使用正则表达式将从 share 目录开始一直到字符串结尾的地址删除,这样就只保留了 emacs 目录,然后接上 home 目录就可以完整地表示配置文件的路径了。

    (defvar program-dir
      (replace-regexp-in-string "share/emacs.*/etc/$" "home/" data-directory :from-end))
    program-dir
c:/TOTALCMD/tools/emacs/home/

后面的代码将 emacs 中 HOME 环境变量设置成配置文件的路径,再读取配置文件 init.el,这样 emacs就完全的绿色化了。

11 个赞

看到有朋友在windows环境下使用Emacs并分享经验,真心感动:grin:

(´・ω・`)

原来是中二君的博客,哈哈 @kuangdash

……好羞耻啊喂……

这个改进很棒,点赞。补充一点,我目前把 emacs 放在整个 msys2 环境里,这样就能在 win 下得到一个很便捷的 unix 环境了。

其实我有一个装在vagrant里面的emacs的,平常可以用有x11 forward的ssh软件来连接它,就是占的硬盘空间有点大,在128G的surface上有点吃紧了_(:зゝ∠)_

vagrant 不重么,可以试试 Docker(Beta),至少我在 OSX 已经可以让它常驻内存了:Blog | Docker

Faster and more reliable: no more VirtualBox! The Docker engine is running in an Alpine Linux distribution on top of an xhyve Virtual Machine on Mac OS X or on a Hyper-V VM on Windows, and that VM is managed by the Docker application. You don’t need docker-machine to run Docker for Mac and Windows.

1 个赞

好,我回头试试

(´・ω・`)

翻了一下硬盘,当年的绿色全套 win32toolkit 都还在

今天偶然看到这个帖子,把我的配置跟大家分享下,也是在网上抄的。 下面是我的目录结构: 它们放在U盘根目录的Emacs文件夹下,前两个是Emacs程序,Files是我自己的文件,后面是多个配置。 在Emacs/Emacs-64bit/share/emacs/site-lisp/subdirs.el文件里加入下面的代码:

需要哪个配置就用哪个,这几个配置共用一个Files文件夹(主要是org文件)。 在每个配置里面加入下面的代码就可以C-x C-f直接浏览这个文件夹: (setq default-directory (concat usb-drive-letter “Emacs/Files/”)) 下面是agenda files list: (setq org-agenda-files (list (concat usb-drive-letter “Emacs/Files/”)))

我是这样组织的:针对 emacs 版本设置不同的 package 目录,版本兼容就在一份配置里做(太老的版本就放弃)。这样我可以随时下载运行 nightly build,玩崩了也没影响。

$ ll ~/.emacs.d/
-rwxr-xr-x    1 gqj  staff   415B Jul 25  2014 README.txt
-rwxr-xr-x    1 gqj  staff   7.8K Feb  6 19:43 basic.el
drwxr-xr-x    4 gqj  staff   136B Aug 16  2015 bin/
-rwxr-xr-x    1 gqj  staff   2.2K May 22  2016 configure
-rw-r--r--    1 gqj  staff   1.0K Feb  6 02:21 custom.el
drwxr-xr-x    3 gqj  staff   102B Nov 27  2015 defuns/
drwxr-xr-x   22 gqj  staff   748B Jan  4 01:36 el-get-24.5.3/        \
drwxr-xr-x   22 gqj  staff   748B Jul 14  2016 el-get-25.0.95.1/     |
drwxr-xr-x   33 gqj  staff   1.1K Feb  6 22:54 el-get-25.1.1/        |
drwxr-xr-x   27 gqj  staff   918B Nov 18 23:55 el-get-25.1.3/        |
drwxr-xr-x   26 gqj  staff   884B Jan  9 23:21 el-get-25.1.91.1/     |
drwxr-xr-x   27 gqj  staff   918B Jan  9 23:20 el-get-26.0.50.1/      >
drwxr-xr-x   88 gqj  staff   2.9K Aug 23 00:23 elpa-24.5.3/          |
drwxr-xr-x   83 gqj  staff   2.8K Jul  1  2016 elpa-25.0.95.1/       |
drwxr-xr-x  121 gqj  staff   4.0K Feb  6 02:21 elpa-25.1.1/          |
drwxr-xr-x   99 gqj  staff   3.3K Nov 16 00:20 elpa-25.1.3/          |
drwxr-xr-x   97 gqj  staff   3.2K Jan  8 03:15 elpa-25.1.91.1/       |
drwxr-xr-x   97 gqj  staff   3.2K Jan  8 03:50 elpa-26.0.50.1/       /
-rwxr-xr-x    1 gqj  staff    11K Feb  7 22:05 extra.el
drwxr-xr-x   73 gqj  staff   2.4K Feb  7 22:05 init/
-rw-r--r--    1 gqj  staff   1.4K Dec 24 23:16 init.el
drwxr-xr-x    3 gqj  staff   102B Nov 23  2015 private/
drwxr-xr-x   28 gqj  staff   952B May 26  2016 site-lisp/
drwxr-xr-x   34 gqj  staff   1.1K Nov 23  2015 snippets/
-rw-r--r--    1 gqj  staff   2.8K Dec 24 23:16 source.el
-rwxr-xr-x    1 gqj  staff   1.3K Jan  8 04:16 test-startup.sh
drwxr-xr-x    4 gqj  staff   136B Dec  1  2015 vendor/

以上是我的主配置,长期霸占 ~/.emacs.d/。当我想体验别人的配置,克隆到本地任意目录,然后用 runemacs 脚本去启动,在里边修改 HOME,指向配置所在目录,这样它就不会干扰 ~/.emacs.d/,这 就是绿色呀。Windows 下也是一样。

1 个赞

用这个PA.c Platform可以很方便的把emacs便携化,优势在于

  1. 及其轻量,只有不到300K
  2. 不用改动emacs目录下任何东西;不用改动任何现有配置
  3. emacs本体与配置分离,如果要升级emacs,可直接替换整个目录而不影响配置

简单说一下方法:

准备

  1. 下载Template 用于制作运行环境
  2. 下载Launcher用于将上面的运行环境打包

制作

  • 把下载的Template解压得到文件夹,命名为EmacsPortable

  • 把emacs图标放入EmacsPortable\App\AppInfo下

  • 按照模板说明填写EmacsPortable\App\AppInfo\appinfo.ini,其中[Control]一栏如下:

    [Control] Icons=1 Start=EmacsPortable.exe

  1. 新建EmacsPortable\App\AppInfo\Launcher\EmacsPortable.ini,内容填充如下
[Launch]
ProgramExecutable=Emacs\bin\runemacs.exe
CommandLineArguments=--insecure
SingleAppInstance=true
WaitForProgram=false

[Language]
Base=%PortableApps.comLocaleglibc%
Default=zh_CN

[Environment]
EMACSRUNTIME=%PAL:AppDir%\Emacs\bin
HOME=%PAL:DataDir%\Home
LANG=%PAL:LanguageCustom%
PATH=%EMACSRUNTIME%;%PATH%
  • 将包含emacs可执行程序的目录解压到EmacsPortable\App下

  • 运行Launcher打包,主要目的是通过Launcher可以生成带emacs图标的启动器。运行打包出来的可执行文件,会将便携版的emacs释放到你指定的目录

  • Done!

绿色化完成之后的目录结构如下:

qgymib@qgymib-PC MSYS /d/PortableApps/tmp/EmacsPortable
$ tree
.
├── App
│   ├── AppInfo
│   │   ├── appicon.ico
│   │   ├── appicon_128.png
│   │   ├── appicon_16.png
│   │   ├── appicon_32.png
│   │   ├── appinfo.ini
│   │   └── Launcher
│   │       ├── EmacsPortable.ini
│   │       └── Splash.jpg
│   ├── DefaultData
│   │   └── Home
│   ├── Emacs
│   └── Readme.txt
├── Data
│   └── Home
├── EmacsPortable.exe
├── EmacsPortable.ini
├── help.html
└── Other
    ├── Help
    │   └── Images
    │       ├── Donation_Button.png
    │       ├── Favicon.ico
    │       ├── Help_Background_Footer.png
    │       ├── Help_Background_Header.png
    │       └── Help_Logo_Top.png
    └── Source
        ├── EmacsPortable.ini
        ├── LauncherLicense.txt
        └── Readme.txt

把你的个人配置.emacs.d放在EmacsPortable\Data\Home下即可

最后说一点点

其实归根到底是使用这个工具更改了emacs所在运行环境的HOME变量,把它指向了一个相对目录。用这个SDK其实只是因为我的电脑上使用了大量PortableApp.com提供的绿色软件,保持形式统一而已。

最后的最后

看到这儿的小伙伴们有福了,这儿可以直接下载我已经封装好的环境 使用方法:

  1. 把你的emacs整个目录丢到EmacsPortable\App下。这里有个空的Emacs文件夹,是为了提示目录需要放在此处的。emacs.exe的路径为EmacsPortable\App\Emacs\bin\emacs.exe
  2. 把你的配置丢到EmacsPortable\Data\Home下。.emacs.d的路径为EmacsPortable\Data\Home\.emacs.d
  3. Have fun!
7 个赞

如果多个portableApp相互调用呢,我有点想吧Git也这样打包,但是如果这样,emacs调用git是不是就不方便了啊

百度云链接失效了,能否重新分享一下