acme--失落的黑魔法

2014-02-15

acme,这是一个被世人遗忘了的强大工具,我把它称作失落的黑魔法。它是一个shell/窗口管理系统/编辑器。很难对没有使用过它的人描述清楚它是什么。按russ cox的说法,它是一个integrating development environment。(注意IDE中的I是integrated)。

acme出自贝尔实验室的plan9操作系统,由rob pike设计。说到plan9,多扯几句闲话。我最早接触过plan9系统还是在使用emacs之前。装虚拟机进去看了一圈,发现什么都没有,什么都干不了。鼠标手势很奇怪,这是一个跟我接触过的linux/window之类的完全不一样的东西,我立马被吓坏了。

直到后来接触了emacs,接触了lisp。忘记是哪篇文章上看到的,对我感触挺深。作者原以为所有编程语言都一样的,抱着这种心态去看了下lisp,然后被括号给吓坏了。但是有那么多牛人都高度赞扬它,lisp一定有某种神奇的魔法,作者不能容忍自己对此的无知。直到突然顿悟的那一天,他感觉到了lisp神圣的光芒,他要把他的感受告诉周围的人,让至少100个迷失的灵魂得到救赎......这正是我写这篇文章的用意:布道。

acme是一个编辑器

鼠标手势

是这个编辑器很与众不同的地方。acme大量地使用鼠标。也许emace/vi的键盘党会对此很不屑,但其实使用鼠标是很高效的。就像用过vi的人才会发觉,编辑模式使用是远低于普通模式的,大部分的需求是移动光标,vi可以让你打字如飞。用过emacs的人才会发现,其实vi中的打字如飞,大多都是废操作,在emacs中敲一个键就可以抵N个键。而用过acme的人,才知道原来鼠标可以玩出这么多花样了,让你的效率指数暴表!

使用acme需要一个三键鼠标。左键拖拽是选择;左键拖拽不放手,再点击中键是剪切;左键拖拽不放手,再点击右键是粘贴;剪切再粘贴,就是复制了。右键用于跳转和搜索,选中一个词再点右键会在文本中搜索这个词,跳到它下个出现的位置。还有很多有用的鼠标操作组合,可以自己去发觉。

命令语言

acme中的编辑是通过命令语言实现的。acme和vi的起源,都是ed。ed是使用命令语言的。你现在还可以在vi的命令模式中还可以看到ed的影子,比如使用%s/old/replace/g进行替换就是一条命令语言。vi做的事情,是把命令语言敲的东西所见即所得化了,所见即所得是好的,但是代价编程功能--原本命令是可以组装写成脚本的。与vi不同,acme继承了ed的命令语言方式。

  • 用右键选择:$ 跳转到文本末尾
  • 到开头是:0,到第n行就是:n
  • :3-+#8 跳到行3行8列
  • :3,9 选中第3到9行
  • :/^func/,/^}/ 选择以func开头,以}结尾的一段,也就是选择Go中的一个函数
  • Edit ,x/old/ c/new/ 中键选择命令,将单词old全部替换成new

更多的资料可以去查一下sam,在acme中使用的命令语言跟sam是基本一致的。

acme是一个IDE

acme是一个最小化的集成开发环境。传统的IDE是一个封闭系统,通过各种插件来扩展,而acme是一个粘合剂,它通过管道调用各种unix小工具。所以IDE中的I是integrated,而acme是integrating的。

它是一个窗口管理器,如果你使用过平铺式窗口管理器,对它的界面应该会感到亲切。

当然,它是一个shell,你可以中键点击win打开一个shell窗口,在里面执行你想要的各种命令。

你可以在acme里面完成写代码/编辑/调试全部的过程...但是还有更强大的。在acme中可以收发邮件/浏览网页/打开pdf/浏览图片等等。一切只需轻轻一点:

mailto:tiancaiamao@gmil.com 在acme中对这段文字右键点击会调用默认的邮件工具发送邮件。

http://www.zenlife.tk 右键点击会使用浏览器打开网页。

/Users/geius/Documents/acme.pdf 右击会调用pdf阅读器打开文件

acme(1) 右击会调用man查看命令的使用帮助。

右键点击是跳转,中键点击是执行。比如你还可以这么玩:输入date,中键点击,它会执行date命令。同样,你可以在tag中加入一个make,执行命令编译工程。

中键点击不放,再点左键,是以选中的文字作为参数调用命令。比如选择文字hello world,然后中键左键echo就相当于执行echo 'hello world'。

acme完美地将窗口管理器/编辑器/shell所做的事情结合了起来。除了煮咖啡,acme无所不能(我没有黑某个号称可以煮咖啡的工具)。

acme是失落的黑魔法

unix哲学

既然说到emacs,就不得不提一下这两种哲学。大家都知道,emacs背后是lisp的那一套,如果你读过unix痛恨者手册就会知道,那是一个百家争鸣的时代,主要有三种思想:lisp的,unix的,GUI的。lisp机以失败告终,emacs作为一个一致的lisp环境,算是硕果仅存了,它是一个伪装成操作系统的编辑器。

lisp中有很多好的思想,emacs利用lisp这层中间层语言达到完全可扩展的目的。语言/编辑器/操作系统是和谐统一的界面。还是有人会怀念那个时代,Oberon操作系统是个很牛B的东西,可惜都没人听过。lisp已死,lisp永生。

unix哲学是另一套,不是lisp所追求的一门语言就是一个操作系统,通过函数调用就可以完成进程间通信。unix哲学的核心几条,像KISS这种。每个小工具只做一件事件,并将这件事情做到极致。工具间通过shell管道进行组合,就可以发挥出无穷的威力。

但是emacs确实很强大,不是么?所以rob pike抄袭了Oberon的设计,达到跟emacs同样强大的功能,但是按unix哲学而不是lisp哲学实现,于是便有了acme。

说到抄袭,GUI无疑是赢得了大多数用户,它胜出核心是什么?鼠标!假如没有鼠标还有能GUI吗?而acme中也是强调使用鼠标的。acme正是一个集众家所长的工具。

一切皆文件

一切皆文件是unix哲学,在plan9操作中得到了完全贯彻。acme正是起源于plan9。进程间通过文件进行通信,这是一套非常高端的思想。因为文件通信是语言无关的,所以你可以用任何自己熟习的语言扩展acme,无论是shell/python/c/go等等。

比如说你可以

9 mount `namespace`/acme /mnt/acme

然后你编辑/mnt/acme/1/body就可以改变acme里面的文件内容。比如你在编辑Go代码,就可以使用go fmt读入此文件并写回。

再比如说你要类似执行程序的init文件,只需要修改mount的那个文件,就会实时地反映到程序上,不需要重启程序。

也许你想到了linux的/proc系统,其实/proc就是抄的plan9。

一切皆文件,那么acme的内存空间就可被mount到一个文件上,其它程序通过读写这个文件就可以和acme进行通信!

超链接的魔法

前面说过右键点击是跳转。跳到某个文本的某一行,跳到man手册,跳到浏览器打开某个链接,打开pdf文件等等。是不是很类似"超链接"的感觉?这一切都是通过一个叫做plumb的文件服务实现的。

实现超链接的魔法的基础是一切皆文件。plumb是一个类似订阅/分发的服务,它会mount出一系列的文件。分发者通过读/写文件的方式发出事件,而订阅者也是通过读写文件的方式接受并处理事件。

plumb中有一套规则语言,用于指定分发/订阅的转发规则。比如当我们右击acme(1),后面有一套规则是调用man 1 acme命令,然后将输出写到/mnt/plumb/edit中,而acme是edit文件的订阅者,它将数据从edit中读出并显示。跳转到某一行也是类似的规则。

而打开链接的过程是这样的,plumb中有一条规则是处理http,它将请求转到/mnt/plumb/web中,而浏览器,比如说chrome是/mnt/plumb/web的订阅者,那么它会读取请求的http网址并打开。acme的超链接魔法,只是将右键点击的内容,发送给plumb服务,由plumb决定如何处理和转发。

结语

acme是失落的黑魔法,它里面有很多你从来没见过的神奇的东西。它是rob pike,russ cox这些大牛使用的工具。跟着大牛走,使用大牛们使用的东西,学习大牛们的思维方式,让自己也成为大牛。

vi与emacs之争,IDE与编辑器之争,GUI与命令行之争,这都是持续了不知道多少年的话题。都接触过之后才不至于偏激。如果你倦了,不妨试试acme,也许它才是你要的答案。

编辑器acme