我的emacs配置组织

好久都没进行这一方面的整理,找了一下,之前的那个emacs配置 模式还是在5年前,其实, 这个配置方式我用了至少4年的样子,直到去年初才换了一种方式。

之前的那个配置的主要缺点是不容易同步,比如我现在基本上要在这些环境的电脑中运行:

系统 CPU
Ubuntu(GUI) X86
Ubuntu(CMD) ARM/X86
CENTOS(CMD) X86
Win XP X86
Win 7(本地或远程) X86
MAC X86

系统不算多,但关键是个数多,比如光Ubuntu,不同的位置加起来也有10多个了,总不能每 个都去配置,时间长了,不同的电脑上的配置或多或少都有差别,而且,即使一个单独的配 置,一个压缩包都快接近100MB了,更何况还要维护每个插件的更新,于是我决定更新我的 配置管理了。

我还是想采用每个模式的自定义配置为单独一个文件,但每个插件模块一定不要再自己管理 了,于是,我找到了el-get插件。 首先,是我的.emacs的配置:

(setq user-emacs-directory"~/emacs_config")
(add-to-list 'load-path (concat user-emacs-directory "/el-get/el-get"))
(setq el-get-verbose t)
(unless (require 'el-get nil 'noerror)
  (with-current-buffer
      (url-retrieve-synchronously
       "https://raw.github.com/dimitri/el-get/master/el-get-install.el")
    (goto-char (point-max))
    (eval-print-last-sexp)))
(add-to-list 'el-get-recipe-path (concat user-emacs-directory "/el-get-user/recipes"))
(setq
  el-get-sources
  '(
    (:name rix_config
       :websit "http://4096.info"
       :descript "rix self use"
     :type  git 
       :url "http://my_self_git_server/new_emacs_config"
       :after  (progn
              (require  'rix_config)
              (el-get-byte-compile "rix_config")
             )
       )
    (:name evil
           :website "http://gitorious.org/evil/pages/Home"
      :description "Evil is an extensible vi layer for Emacs. It
  emulates the main features of Vim, and provides facilities
for writing custom extensions."
       :type git
          :url "https://github.com/emacsmirror/evil"
          :features evil
          :depends (undo-tree goto-chg)
          :build  (("make" "all" "info"))
            :build/darwin  `(( "make"  ,(format  "EMACS=%s"  el-get-emacs)  "all" "info" ))
           :info "doc")
    ))
(setq
  my:el-get-packages
  '(evil,
  rix_config
  ))
(el-get 'sync my:el-get-packages)
(require 'rix_config)
(rix_config_init)
(server-start)

基本上,emacs的主要配置就是上面的这个文件了,足够简单吧,其实,关键是rix_config 这个插件,我的自定义内容都在这个里面,作为自己的一个插件添加到el-get中,让el-get 自动来更新,而el-get自己本身会检测自己是否安装,如果没有安装的话,会自动安装,于 是,就按照下面的顺序进行了:

pay_diagram.png

其实evil并不是必须的,只是我现在已经使用evil习惯到很多emacs的多个组合快捷键已经 忘了,因此这个必须要先安装。 配置的第一句话其实是写emacs的配置文件的位置,这样,el-get会将插件下载,安装到这个 目录中,默认是在.emacs.d目录中,同时,还有emacs生成的及少量文件也在这个目录中, 好处后面会说。

我自己写的垃圾加载插件是使用git管理的,在我自己的git服务器上,除了自己自定义的配 置外,就一个主要的文件,这个主要的文件,除了安装制定的插件的代码外,基本上就几行 代码。如下:

(setq
 rix:el-get-packages
 '(evil-leader
   org2blog
   tabbar
   yasnippet
   rect-mark
   unicad
   dropdown-list
   highlight-beyond-fill-column
   mmm-mode
   php-mode
   auto-complete
   erlang-mode
   magit
   color-theme
   ))
(el-get 'sync rix:el-get-packages)
(provide 'rix_config)

(el-get 'sync rix:el-get-packages)
(defun rix_config_init () 
  (mapc 'load (directory-files (el-get-package-directory "rix_config") t ".elc$")))

最关键的其实是最后的5行代码,在.emacs中,安装完rix_config之后,在我的自定义脚本 中,由于一些写法的原因,导致不会自动编译通过,不过,我后来修改过了,因此其 实.emacs中rix_config的after并不是必须的。代码还是保留,防止某一天再次需要。 .emacs中最后部分的rix_config_init的调用是加载所有的自定义的编译好的配置,配置文 件只用放到rix_config的目录下即可,当然,我喜欢使用a.001.init,a.002.shell等的文件 名,以便控制加载的顺序,这个部分我从来没改过。

上述的配置在linux上,只要写好.emacs,然后启动emacs,便会自动安装,成功安装完之后, 便可以直接使用了。即使中间由于网络原因错误,重新启动emacs即可继续进行。

而接下来在实际部署中却有些麻烦,虽然只要不断的反复启动emacs即可,但很多的主机并 不能翻墙,或者安装的工具并不全,比如没有bzr,没有doxygen等等造成安装失败,再例如 像windows系列的,更不会有像make之类的内容了。因此, 我还需要一个同步的工具。

我之前用过dropbox,非常喜欢,但被墙了,而以往的检验教训令我不想将任何文件放到自 己无法控制的位置,我找了一个和dropbox很类似,但完全开源的工具,seafile 于是,我下 载了所有的源代码,并编译部署到了我的e9上(类似raspberry pi的单片机,但比 raspberry pi性能更强大,比如4核,2G内存等,我用它来做服务器)。

我当然是部署seafile的私人服务器了,然后将emacs_config添加到seafile中,并在其他的 所有客户端中进行同步。当然,完整的部分命令可能会由于CPU的不同而导致出现问题,但 对于emacs自己编译出来的脚本而言则无任何问题。

如果我对某项配置进行了更改,则这个更改会自动同步到seafile的服务器,然后其他客户 端也会随之更新,如果对这项配置比较满意,我会直接在emacs_config目录中对这个配置进 行提交到git的动作,并备份到git的服务器,而我维护的动作很少,只要维护自己的配置即 可,其他的插件如果嫌版本老了,只要使用el-get重新安装即可。

一切归于平静。