0
0

Announcing oh-my-emacs v0.1

lox 发表于 2013年09月14日 21:21 | Hits: 3174
Tag: Emacs

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

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.
  • Adoptel-getas the default package manager for Emacs, instead of the default builtinpackage.el, say goodbay to./configure; make; make installand explicitly mananully management ofload-path.el-getalso provides automatic documentation management, customizable user's recipe support, etc.
  • Self-adapted, only install necessary packages when it satisfy the prerequisities. You need to installclangforauto-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 throughauto-completewith various ac backend,helmfor 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-modeBabel, 采用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 togit 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.

1Literate 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这类工具才会大行其道吧。

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

 

原文链接: http://cnlox.is-programmer.com/posts/40749.html

0     0

我要给这篇文章打分:

可以不填写评论, 而只是打分. 如果发表评论, 你可以给的分值是-5到+5, 否则, 你只能评-1, +1两种分数. 你的评论可能需要审核.

评价列表(0)