Sunday, January 30, 2011

ELPA: 下一代Emacs的扩展管理器

原文发表于「桃源」: http://linux.cuit.edu.cn/?p=1169

我们已经习惯了各种包管理器工具, Debian、Ubuntu有 apt-get, RedHat、Fedora有 yum, Arch有 pacman, Gentoo有 emerge, BSD有 port. 包管理器的存在让我们再也不用考虑安装、删除、升级软件的细节, 也不用为了各种包之间的依赖关系而头疼, 这也是我认为UNIX/Linux相比于Window$的一个很大的优点. 今天介绍的 ELPA (Emacs Lisp Package Archive) 就是专为Emacs设计的包管理器, Emacs发展至今已经拥有了数量庞大的第三方扩展, 但安装这些扩展的方式依旧非常原始. 下载压缩包, 解压, 放到Emacs可以识别的 load-path, 修改 “.emacs”, 这一系列动作对于用户来说实在是不够友好 (虽然Emacs用户普遍喜欢折腾). ELPA可以使得安装Emacs扩展就像使用发行版的包管理器工具安装软件一样便捷, 并且Emacs官方也 决定 在下一个Emacs版本, 即Emacs 24中默认集成ELPA. 这里 是GNU的官方ELPA页面, 在那里你也可以下载到已经集成了ELPA的Emacs 24测试版.

ELPA采用同 apt-get 等包管理器工具类似的原理, 会从指定的源服务器中下载扩展以及相关依赖扩展, 然后放到特定目录 (默认为 “~/.emacs.d/elpa/”), 可能会将Lisp代码编译成字节码, 最后激活它, 当下次Emacs启动时自动加载它.

虽然Emacs 24还没有正式发布, 但是我们已经能够提前使用ELPA (实际上ELPA已经发展了好几年). 步骤很简单, 如果你使用的是Emacs 22及以上版本, 把下面的代码复制到Emacs的 *scratch* buffer中, 将光标移动到代码的最后一行, 然后按下 C-j, 一切就都搞定了, 剩下的事情就交给代码去完成吧. 如果你使用的是Emacs 21及以下版本, 请参考 这个帮助页面.

(let ((buffer (url-retrieve-synchronously
               "http://tromey.com/elpa/package-install.el")))
 (save-excursion
   (set-buffer buffer)
   (goto-char (point-min))
   (re-search-forward "^$" nil 'move)
   (eval-region (point) (point-max))
   (kill-buffer (current-buffer))))

上面的代码执行完之后, ELPA就算安装完毕, 这时会多出一个 “~/.emacs.d/elpa/” 目录, 所有通过ELPA安装的扩展都会放在那里, 并且 “.emacs” 文件也被自动添加了加载ELPA的代码. 该如何通过ELPA安装扩展呢? 在Emacs中按下 M-x package-list-packages 会列出所有可供安装和已经安装的扩展, 如下图:

ELPA

将光标移动到需要安装的扩展上, 按下 i 键, 就会出现如上图的 “I” 标志, 选定好之后按下 x 键便开始安装扩展. 还有其它一些按键:

按键 功能
n
下移一行
p
上移一行
r
刷新扩展列表
i
标记为安装
d
标记为删除
u
取消标记
g
还原所有标记
x
执行标记
q
关闭当前窗口
h
帮助
?
查看当前扩展的详细注释信息

当前ELPA的最大缺点是扩展数量还不是很多, 截至写这篇文章时仅有134个扩展. 有人说是因为ELPA只接受自由软件的缘故, 但我觉得大多数Emacs扩展开发者并不会太在意这个, 可能最大的原因还是因为大部分开发者都不知道ELPA的存在. Emacs发展这么多年, GNU也没有 像Vim那样 集中管理各种第三方扩展, 好在官方也终于决定在Emacs 24中集成ELPA, 可以预想将来也会逐渐丰富扩展仓库. 如果你是第三方扩展的开发者并且也愿意将扩展提交给ELPA, 可以参考 这个页面, YASnippet的作者pluskid也写了 一篇给需要提交给ELPA的作者的建议, 希望ELPA的扩展仓库可以越来越丰富.

最后, GNU正在寻找用于Emacs 24的合适配色主题, 有兴趣参与的同学可以访问 这个页面 自定义一份主题提交给GNU, 也许你的方案就会出现在下一个版本的Emacs中. 参与开源, 我为人人, 人人为我.

Sunday, January 23, 2011

解决Mac中Emacs、MacVim不能正确读取PATH的问题

发现我现在的题目真是越来越长了, 越来越有论文开题的范了~

因为安装了MacPort, 我在 “.bashrc” 文件中自定义了 PATH 变量, 但当我打开 “Emacs.app” 时却发现 PATH 变量并没有被正确读取, 最明显的表现就是会找不到我用MacPort安装的程序. 经过一番查找才 发现, 原来是因为Mac OS X中的GUI程序在启动时并不鸟Shell初始化文件, 管你 bash, tcsh, 什么 sh. 在Mac中有一个专门给GUI程序 设置环境变量的地方: ~/.MaxOSX/environment.plist, 这是一个二进制文件, 你可以使用Xcode自带的 “Property List Editor.app” 来查看、修改其中的内容, Mac中还有一个命令 defaults 也可以对这种类型的文件进行读写. 我们可以稍微修改一下 “.bashrc” 文件以便每次自定义好 PATH 变量之后就立即修改 “environment.plist” 文件, 代码如下:

export PATH=...
defaults write ~/.MacOSX/environment PATH "$PATH"

这样当再次打开 “Emacs.app” 时查看到的 PATH 变量就是正确的值了. 同样我在使用 “MacVim.app” 时也遇到了这样的情况, 我本来以为通过上面的方法已经解决, 但… 你懂的, 再次经过一番查找, 很多人也只是推荐上面的方法. 还有 勾选MacVim的 “Preferences” 中的 “Launch Vim processes in a login shell.”, 但在我的MacVim中没有找到这个选项, 应该是新版本取消掉了. 我怀疑这是MacVim的bug (不然为啥 “Emacs.app” 好好的…), 不过貌似也不是所有人都有遇到. 而我现在找到的唯一解决办法是直接从Terminal中执行 “mvim” 命令来启动MacVim, 这样就会继承Shell的环境变量, 不过这也是不得已才想出的临时解决办法, 毕竟我以后就不能直接用Quicksilver来启动MacVim了, 真是遗憾.

综上, Mac的App真够折腾.

Friday, January 21, 2011

AsciiDoc简介

原文发表于「桃源」: http://linux.cuit.edu.cn/?p=1157

AsciiDoc是什么?

AsciiDoc 是一种简单的基于纯文本的文档生成工具, 与它类似的还有 reStructuredText, Markdown. 说是生成文档, 其实它可以将纯文本文件转换成各种类型, 比如:

使用AsciiDoc进行文档编写最著名的恐怕是Git官方的 Git User’s Manual (我表示对于初学者很难看懂), 这篇博客也是通过AsciiDoc生成, 文后会附上本文的原始代码以便参考.

Thursday, January 20, 2011

小技巧: 在Mac中添加字体, 并让XeTeX能够找到

当使用LaTeX排版时, 我习惯于使用Adobe的中文字体, 生成出来的PDF效果很好. 但由于某种众所周知的原因, 各种操作系统都没有自带, 因此我需要手动添加.

以前在使用Ubuntu时, 只需要将字体文件放到"/etc/fonts/fonts.conf"配置文件中指定的字体目录, 再执行"fc-cache -f"即可. 而Mac OS X提供了更简便的方法进行字体的安装, 只需要打开"Font Book", 在"File"菜单中点击"Add Fonts..."即可. 不过有一点必须注意, 字体必须安装到"Computer"这个"Collection"中, 否则在使用xelatex编译时会找不到字体. 建议修改"Font Book"设置中的"Default Install Location"为"Computer", 如下图.