Announcing oh-my-emacs v0.1 - 行者无疆 始于足下 - 行走,思考,在路上

Announcing oh-my-emacs v0.1

xiaohanyu posted @ Sat, 14 Sep 2013 21:23:17 +0800 in Emacs with tags emacs , 9612 readers

去年偷闲的时候,挖了好多大坑(这里这里这里),怎奈挖坑容易填坑难……客观原因自然是“认真的写作有如雕刻”云云,主观上嘛,“懒”大概是逃不脱的一个字吧。

Wait,是谁说过,“懒惰是程序员的美德”来着。秉承这种美德,耗了将近两个月的业余时间,尝试了不下50个el-get package,并且认真读了不下10个package的manual,遂成 oh-my-emacs.

一切缘起于两个月前的某一天,我忽然心血来潮,想要整理下那一坨"just works"的.emacd.d。我几乎尝试了所有github上比较流行的.emacs.d,但是没有一个满足我的需求。“因为所以,科学道理”, Reinventing the wheelNot invented here 大概是每个程序员必修的一课吧。索性不管那么多了,代码写的不好,又不输房子不输地,坑 挖的不好,大不了留着自己用就是。

Oh-my-emacs着重解决的问题是(引用自oh-my-emacs的README):

  • Better default settings with various eye candy, powerline, scrollbar, color-theme, fonts, etc.
  • Adopt el-get as the default package manager for Emacs, instead of the default builtin package.el, say goodbay to ./configure; make; make install and explicitly mananully management of load-path. el-get also provides automatic documentation management, customizable user's recipe support, etc.
  • Self-adapted, only install necessary packages when it satisfy the prerequisities. You need to install clang for auto-complete-clang, for example.
  • Modular, only load necessary packages as you need.
  • Literate, each package have comprehensive documentation or even a tiny tutorial with it, together with necessary web links. Say goodbye to old, out-dated emacs lisp code from Google.
  • Work as expected, completion every where when possible, semantic code completion through auto-complete with various ac backend, helm for minibuffer completion, etc.
  • Full-blown, oh-my-emacs is not another starter kit, it is hacker kit.

这其中,补全、文档、自适应性,是我特别看重的三点。补全自不必说,作为上古大牛也 许是不需要补全的,但是对于我这样21st Century成长起来、尝试过Visual Studio强大补全甜头的程序员来讲,补全是最为迫切的需求。而Emacs/Vim作为General Purpose Editor, 其最大的使用不便就是没有代码的语义补全(semantic completion)。Emacs有一个内置的 Semantic, 来源于Emacs社区鼎鼎大名,目标远大的CEDET, 但是Semantic的使用和配置 都很复杂(参考emacser.com的文章),而且很慢,有时会让Emacs卡住。究其原因,我认为 Semantic 的思路是不对的。用性能本就不怎么好的Elisp去实现复杂如C++这类语言的 Parser,其本身就是浩大的工作量。正确的思路是,对于不同的语言,依赖于不同的 backend,然后用Elisp写相应补全的interface。所以我认为, auto-complete 的思路是正确的。oh-my-emacs利用已有的各种auto-complete的backend(如 ac-slime, auto-complete-clang 等)基本上实现了对C/C++,Python,ELisp/Common Lisp/Clojure的语义补全。

第二点是文档,Emacs的世界从来不会缺乏选择, el-get-list-packages ,2500个 package,其中有很多package要么是已经过时,要么是年久失修,要么是语焉不详,看上去 一片繁华的Emacs世界,实则荆棘密布。如果你没有一点Elisp的功底,想开箱即用,那几乎是不可能的。单拿Python来说,Emacs和Python社区就有两套不同的 python.el ,这给很多Python和Emacs的初学者造成了困惑。Google: Python Emacs,其首页的几套解决方案,采用的是不同的 python.el ……你说对于一个好容易学会翻墙,开始习惯用Google搜索技术文档的计算机初学者而言,看完这些文章,不晕菜才怪呢。稍微复杂一些的配置,比如 TeXLive,在比如Common Lisp的各种实现和SLIME,想要得到一个比较舒适的环境,不但要配置好Emacs,还要配置好系统环境,这又是一大难题。oh-my-emacs借助org-mode Babel, 采用Literate的方式1, 将文档和代码写在一起,在文档中尽量给出每个模块所需要的系 统环境;对于有多个选择的情况,文档中尽量给出为什么选用package A而不是package B的理由和权衡过程。有一部分文档甚至可以当作Tutorial来看。Literate方式最大的好处是保 持文档和代码的同步,这样,oh-my-emacs即可以用作是“开箱即用”的.emacs.d,也可以当作是手把手的Emacs配置教程 (统计下来,oh-my-emacs中文档和代码的LOC 比例约为3:1左 右)。另外,操作系统的环境千差万别2, 因此oh-my-emacs基本上在每个相关模块的文档里面都指明了使用这个模块所需的系统环境,这也可以看做是我为了填去年的坑所做的一点努力吧。

第三点是自适应性。这又是一个很宽泛的话题。什么叫自适应性?是支持多个操作系统吗? 不是的,至少我没有打算让oh-my-emacs很好的支持Windows,一方面是因为Windows没有一个好的类似于apt-get这种类型的package manager3,oh-my-emacs依赖的很多底层软件如ssh,gcc/clang,TeXLive等在Windows上配置起来都很麻烦,远不如 apt-get/yum/pacman/homebrew这种一条命令来的方便。我这里讲的自适应性,主要包括:

  • 采用el-get, 自动化管理load-path,以及info文档等,say goodbay to git submodule
  • 如果系统环境不满足某个package的要求,就不要安装这个package,免得装完了不能用。 比如 auto-complete-clang 依赖于 clang, 如果系统中没有安装clang,那么oh-my-emacs在启动的时候就不会安装 auto-complete-clang。反之,如果你意识到这个问题并安装了clang,那么可要重启Emacs, auto-complete-clang就应该可用了。
  • 尽量借助工具和代码获取相关配置,而不是在代码中写死。比如,oh-my-emacs大量使用Elisp中的 executable-find ,这需要依赖于操作系统的package manager设置好相关的 $PATH , 这样带来的好处就是oh-my-emacs能够无缝的适应很多环境。
    • 比如 AUCTeX需要PDF阅读器作为LaTeX文档的Viewer, oh-my-emacs采取的策略是优先采用 Okular, 其次是 Evince, 如果操作系统上即没有装Okular也没有装Evince, 那么oh-my-emacs会fallback到 xdg-open, 这样可以用可移植的代码获得最大限度的灵活性和自适应性[4]。
    • 再比如 SLIME 支持多种Common Lisp Implementation, oh-my-emacs采取的策略是同时支持 SBCL/Clozure CL/CLisp ,也就是说,只要你安装了SBCL/Clozure CL/CLisp其中的一个,oh-my-emacs的Common Lisp设置就应该是可以工作的。
    • 针对auto-complete-clang, oh-my-emacs可以利用 pkg-config 检测并设置正确的 ac-clang-flags , 可以对系统中可用的任意C/C++ lib提供语义补全。比如,你可 以用 M-x ome-pkg-config-enable-clang-flag "QtGui" RET 来获得QtGui库的补全 支持,效果可以参考这里

Oh-my-emacs目前已经包含了对C/C++/Python/Common Lisp/Clojure的支持,基本上都提供了较好的语义补全。其他方面,设置了更友好的字体,powerline,color-theme。启用了 一些比较好的内置mode,诸如recentf/savespace/uniquify。对\LaTeX编辑提供了完整的支持,默认采用XeTeX。

Oh-my-emacs的名字来源于 oh-my-zsh, 用意嘛,自然是希望能将oh-my-emacs打造成oh-my-zsh那样。大话止于此,看行动。

最后放张图,更多美照在 这里 。Enjoy emacs, and, your life.

oh-my-emacs

--

Footnotes:

4 这个PDF阅读器的例子主要是在Linux下面测试的,我手头没有Mac的环境,so, patches are always welcome.

1 Literate programming 的 概念来源于祖师爷 Donald Knuth。没记错的话,大名鼎鼎的 \TeX 早期也是用literate的 方式写成的。 Org-babel提供了所谓的"active code in Org-mode",还有专门的Paper论 述Org-babel的workflow。 oh-my-emacs这方面的灵感主要来自于 emacs24-starter-kit

2 也许正是如此,puppet/chef这类工具才会大行其道吧。

3 chocolatey 也许是个不错的选择,但是我没有用过。

 

zarzen said:
Sat, 14 Sep 2013 23:52:41 +0800

赞~这个项目 正好重装还没再配emacs~明天拿来瞧瞧

Avatar_small
mazenvoy said:
Fri, 27 Sep 2013 20:33:27 +0800

毕业3个月了,几乎没有搞过桌面linux相关的东西,emacs更加是在开始找工作的大四后期放弃了,学长算是我见过emacs用得最久的人了。

Avatar_small
Lox said:
Sat, 28 Sep 2013 10:47:06 +0800

惭愧……我搞东西都是博而不精。zju emacs真正的大神是pluskid,yasnippet的作者。

Avatar_small
mazenvoy said:
Sat, 28 Sep 2013 14:26:37 +0800

我们都是普通人,博而又精又谈何容易。你也别太谦虚,你的东西就算不精,但也不是粗制滥造,我从你98写的文章看到这里的博客,光从文章来讲,已经属于精品了。也许你自己看以前的东西会感到幼稚,但是不同时段不同感受,至少我觉得你的东西都很好,至少我玩linux也受过你的影响。

感觉在给你戴高帽子,呵呵,无论如何,祝工作生活愉快,对于码农,其实我更加应该祝你能保持热情

Avatar_small
Lox said:
Sun, 29 Sep 2013 18:31:15 +0800

谢谢学弟鼓励。

偷偷地说,我又开始赋闲了。这次打算做一些东西出来。

如你所说,“就算不精,但也不要粗制滥造”。

共勉。


Login *


loading captcha image...
(type the code from the image)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee