好久都没进行这一方面的整理,找了一下,之前的那个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自己本身会检测自己是否安装,如果没有安装的话,会自动安装,于 是,就按照下面的顺序进行了:
其实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重新安装即可。
一切归于平静。