Posts archived in Linux

Smalltalk 作者 Alan Kay 曾说过,对象不是 Smalltalk 的本质,对象间的消息传递才是。对于操作系统中的基本对象–进程,类似的说法也是成立的:进程不是操作系统的本质,进程间的通信才是。像 Mach 这样的微内核操作系统的全部,就是一个供进程传递消息的框架。

进程间通信的技术细节繁杂,以Linux 系统为例,就有文件,管道,消息队列,信号量,RPC,UNIX Socket, RPC 等等多种方式。Windows 系统还有邮件槽, COM 对象等等。Mac OS 则有 AppleEvent 等等。在这里我们介绍 Plan 9 系统中一个不太为人所知的 IPC 机制:Plumber,或者叫做管道工。我在”开发人员为何应该使用 Mac OS X 兼 OS X 小史“中曾赞扬过 Mac OS X 系统中的 AppleEvent 进程间通信机制对工作效率的提升。和AppleEvent 类似,管道工也是对图形界面下进程间通信的一个尝试,不过在通信的粒度上有所区别。

我们从一个简单的例子入手。在如今网络普及的时代,几乎所有的软件都能自动识别链接。只要打入 http:// 开头的一串字符,就立即转化为一个可点击的链接,点击这个链接则自动召唤出浏览器。我们对此毫不感到新鲜,因为这功能再自然不过。其实这些功能在上世纪90年代还是很少见的。 Plan 9 的管道工,在当时就前瞻地提出一套匹配字符串和自动投递给指定应用程序的机制。我们只需要告诉管道工,用户选中字符串匹配某类型的时候就交由某应用程序处理,管道工即负责具体的程序间的通信。这是对 UNIX 管道机制的一个革新。如我在Mac OS 一文中所说,纯粹的管道机制在图形界面程序中已经不再适用了。

我们所熟悉的URI 处理仅限于浏览器,且只能处理由 RFC 2396 预先定义的 URI 模式。即便如此,我们也能体会到 URI 处理器的方便。像大家熟悉的电驴链接实际上是 ed2k:// 打头的 URI。在浏览器点击后就自动用电骡打开;苹果的 iTunes 的链接实际上是 itms: 打头的 URI;Android 商店的链接其实是 market:// 打头的 URI 等等,都是让用户更加方便的例子。有了这些机制后,我们难以想象没有这些机制而需要拷贝粘贴的日子是如何度过的。

管道工是 URI 处理器的推广形式。在管道工里,不仅仅是 URI,一切的字符串都可能匹配。因为读者可能没有用过管道工,我们仍然以大家熟悉的例子来说明。安装了 Skype 浏览器的插件会自动把网页上的电话号码变成一个特殊的“用 Skype 拨打该电话”的按钮,在 Gmail 里开启一些插件后 FedEx 和 UPS 的包裹号码能自动变成链接直接转到包裹查询网站等等。管道工的功能,就是让我们可以很方便的自定义这些转发功能,而不依赖于应用程序的实现。在 Plan 9 系统中,即使你不装 Skype, 不用 Gmail, 用户依然能够通过制定正则表达式匹配规则,来决定如何处理电话号码和包裹追踪号码等等。

管道工的原作者用编译器和编辑器的例子来说明管道工的作用。我们知道编译器报错语法错的时候,会以一定格式报出发生错误的文件和行号,如

Line 43: Hello.cc syntax error.

我们可以设定规则,在用户点击这些错误信息的时候,让管道工自动匹配和提取文件名,行号,并自动发给编辑器,就省却了我们人工打开编辑器跳到某行这个繁琐的步骤。尽管 IDE 已经通过集成编辑器和编译器的方式绕开了这种进程间通信,这种匹配/转发的通信方式仍然用在不少地方。比如 Vim 就引入了一个叫 errorformat (错误格式)的机制,让编辑器能够理解和匹配“错误格式”,并跳到指定的行。

通过 Plan 9 from user space 这个开源实现,我们可以在 Mac 和 Linux 上使用管道工。不过我们已经有了很多现成的工具能够部分实现管道工的功能。因为我日常只用浏览器和shell,因此简略介绍一下我是如何在浏览器和shell中实现类似于管道工的功能的。

用油猴子或者其他浏览器插件,我们可以将网页中某特定的字符串转变成一个定制的链接。然后,取决于所在平台,我们可以将这些链接和预定义的应用程序挂钩。Mac 下一个好用的工具是 RCDefaultApp ,Linux/Gnome 下的 gconftool-2 也直接支持对 URL-handler 的修改。Windows 下的方法则是修改注册表。(当然这些方法都有安全隐患,所以只适合个人使用)。

在终端里,对于 Linux 用户,urxvt 这个终端非常强大,可以使用 perl 扩展来匹配和执行命令,基本上可以完全实现管道工的这种匹配任意字符串且发送给其他程序的功能。在 Mac OS X 中,iTerm 2 是程序员应该用的终端。该终端目前还没有 urxvt 的强大扩展性,不过也能完成大部分匹配任务。比如说,iTerms 的最新版本支持一个叫做 Sementic History 的功能 (Preference -> Profile -> Advanced)。这个功能使得我们可以直接点击 Terminal 里面的文件名召唤出 Finder。用苹果的可能都知道 Mac 里有个 Proxy Icon (应用程序标题栏里面的小图标)的概念,我们可以直接把这个小图标当成文件的代表,拖来拖去,甚至可以直接拖到 Gmail 中当附件。我们其实可以把 iTerms 2 里面的文件名直接当成一个对象拖来拖去。

因为我日常只使用浏览器和终端,Plan 9 的管道工给我的启发是,如果有一套好的进程间通信机制,拷贝粘贴是完全没有必要的。如果你和我一样基本不用鼠标,并且认为拷贝粘贴是一个降低工作效率的事情,那么我建议你尝试一下用管道工的思想去改善你的工作流,看看哪些拷贝粘贴是可以由计算机完成的。

一年前, 我在博客上陆续写了好几篇”完全用命令行工作“的文章. 这些文章介绍了一些我平时用的的基于命令行或纯键盘的工具和命令. 而之所以强调纯键盘(不用鼠标), 是因为我发现拔掉鼠标纯用键盘, 能大幅度的提高工作效率. 这也是我写这个系列的初衷.

其实, 命令行的, 或者支持键盘工作的程序层出不穷,如果做个有心人, 每周几乎都能发现新的甩掉鼠标提高效率的工具。比如说,这一年中我就发现了如 keynav 这样使用纯键盘和二分法定位屏幕的程序,更多的支持 vim 键位的各种浏览器, 编辑器插件. 所有的这些工具, 用起来都非常酷(事实上不用鼠标本身就很酷). 因此,单从好用的工具来讲,”完全用命令行工作” 这个系列每月都可以写一篇. 一年过去了, 随着我更多的使用纯键盘工作, 我发现, 其实和用什么工具没多大关系, 掌握了一个基本原则之后, 那些工具顺手就可以找到.

什么是我想说的基本原则呢? 时隔一年, 我觉得可以总结成一句话: 鼠标更加容易分散注意力, 且输入带宽没有键盘大.

为什么说鼠标分散注意力呢?  我在“拔掉你的鼠标” 这篇文章中有过说明: 鼠标在屏幕上不受我们注意力的边界约束, 很容易使我们的注意力分散到各种地方, 成为工作效率的敌人。如果用时间管理眼光来看, 鼠标甚至可以说是时间管理的敌人 – 鼠标可以让你随时用一个窗口跳到另一个窗口, 一个关注点跳到另一个关注点, 使得你的时间规划失去效果.  我发现拔掉鼠标之后,上网不会乱点,无聊的时候不会点着好友的头像开始聊天,或者没事整磁盘碎片等等。拔掉鼠标的目的, 是为了提升工作效率. 当然我也知道, 拔掉鼠标是属于治标不治本的一种办法, 好在大部分浪费时间的应用都依赖于鼠标, 拔掉鼠标后想浪费时间也无从下手了. 所以在短时间之内的确算是一个提高效率的有效方法.

当然, 真正会把握自己时间的人, 是不会像上面提到的那样因为鼠标而分散注意力的. 即便这样, 鼠标也不见得有键盘好用. 用理论上来说, 鼠标这个“信息通道” 的带宽太小了,相比较于键盘, 鼠标向计算机传输同样的信息可能要花费更多的时间. 一个最简单的例子就是快捷键. 键盘快捷键不光比用鼠标在多级菜单中点来点去快, 甚至也比移动鼠标单击一个图标快. 究其原因, 还是因为鼠标操作图形界面是一种间接的给计算机发指令, 而用键盘快捷键相对直接一点. 只有在移动焦点和点击选择定位位置的时候, 鼠标才比键盘高效.

这一年, 我发现虽然还不能 100% 的抛弃鼠标, 但可以说 95% 的情况下, 鼠标的使用都是可以避免的. 具体来说, 包括以下几处.

第一, 消除浏览和寻找文件时对鼠标的使用, 用搜索来定位文件. 用鼠标定位文件的时候, 一般人会一层一层的打开文件夹直到找到所需的文件. 实际上, 应该使用桌面搜索(苹果自带) 去管理这些文件, 从而不需要用鼠标去点击文件夹. 除了桌面搜索, Quicksilver/Alfred 这样的启动器, 和命令行等等, 都可以节省在浏览文件上所耗费的鼠标点击和时间. 命令行也是一个大宝库, 很多时候, cp/mv 比拖放文件夹快多了.

第二, 消除窗口管理中对鼠标的使用, 用键盘快捷键代替鼠标点击按钮. 在多任务图形界面操作系统里, 我们常常需要移动, 最大最小化, 或者切换窗口. 如果有兴趣, 还可以尝试一下 Awesome 这样的平铺窗口管理器.

第三, 消除应用程序对鼠标的依赖, 使用快捷键. 几乎任何一个复杂一点的应用程序, 如 Firefox, Photoshop 或 Office , 都会提供一整套的快捷键方案. 相比较于用鼠标反复选择点击菜单项, 熟悉快捷键的人完全可以运指如飞, 手不离开键盘完成所有操作. 这也包括 vimperator 等让 Firefox 焕发第二春的杀手级插件.

当然, 我们用了好多年养成了用鼠标代替键盘的习惯,是不可能在一夜之间改回头的。如果你是一个用习惯了鼠标的人, 现在想要从鼠标转移到全键盘, 不要期望一会儿就能扔掉鼠标. 这个过程可能会持续几个月. 如果你上面的每一条都做到了, 就正儿八经拔掉鼠标, 工作个一星期. 几星期之后, 你会发现更多的快捷键, 更多的命令行工具, 写更多的脚本完成原来需要鼠标完成的事情. 到时候, 那就真的是 the world is your oyster 了. 你会发现, 原来计算机用起来是这么的爽, 而且再也不要担心腕关节受损了.

待月西厢下,迎风户半开。隔墙花影动,疑是玉人来。

最近 twitter 上最流行的一个关键词是”西厢计划”. 这个计划名字取得很浪漫,客户端叫做张生,对,就是西厢记里面那个翻墙去见崔莺莺小姐的张生;显然,服务器端必然叫做崔莺莺。客户端的张生是最重要的部件,可以不依赖于服务端工作。

我是个特别好奇的人,遇到好玩的总要学习一下看看是怎么弄的。因为西厢计划的作者只是简要的介绍了一下原理,其他报道又语焉不详,我当时就觉得很好奇,花了昨天一个晚上详细读了一下源代码,终于知道怎么回事了,觉得原理非常漂亮,所以写篇文章介绍总结一下。

先说大方向。大家都知道,连接被重置的本质,是因为收到了破坏连接的一个 TCP Reset 包。以前剑桥大学有人实验过,客户端和服务器都忽略 Reset, 则通信可以不受影响。但是这个方法其实只有理论价值,因为绝大多数服务器都不可能忽略 Reset 的 (比如 Linux, 需要 root 权限配置iptables, 而且这本身也把正常的 Reset 给忽略了)。只要服务器不忽略 Reset, 客户端再怎么弄都没用,因为服务器会停止发送数据,Reset 这条连接。所以,很多报道说西厢计划是忽略 Reset, 我从源代码来看应该不是这样。在我看来,西厢计划是利用了墙的一个可能的弱点–墙只在连接发起的时候把一个 TCP 连接加入监听序列,如果墙认为这个连接终止了,就会从监听序列中去掉这条记录,这样,这条连接上后续的包就不会被监听。西厢计划就是让墙“认为”这个连接终止的一个绝妙的方法。只要墙认为这个连接两端都是死老虎,墙就不会触发关键词检测,其后所有的数据,都不存在连接被重置的问题了。

如何让一个连接置之死地而后生,就是西厢计划那帮黑客神奇的地方了。这也不是一日之功。 首先,这帮牛人发现,墙的是一个入侵检测系统,把含有关键字的包当成一种“入侵”来对待。采取这种设计有很多好处,但缺点是入侵检测系统可能具有的问题,墙都可能有。西厢计划主页上那篇著名的论文就是讲这些七七八八的漏洞的。可以说处理这些七七八八的漏洞是非常困难的,迫使墙的设计者“拆东墙,补西墙”。这样补来补去,外表看起来好像很牛逼的墙,其实有很多本质上无法简单修补的漏洞,其中有一个致命的,就是 TCP 连接状态的判定问题。 出于入侵检测系统这种设计的局限,墙没有,也没办法准确判定一条 TCP 连接的状态,而只是根据两边收到的数据来“推测”连接的状态。而所有的关键词检测功能,都是基于“连接还活着”的这个推测的结果的。因为墙的规则是在连接发起的时候开始对这条连接的检测,在连接终止的时候停止对这条连接的检测,所以,一旦对连接的状态推测错误,把还活着的连接当成已经关闭的连接,墙就会放弃对这条连接上随后所有的包的检测,他们都会都透明的穿过墙的入侵检测。

上面只是想法,具体到 TCP 协议实现这一层,就要只迷惑墙,还不能触及我要通信的服务器。最理想的情况下,在任何有效通信之前,就能让墙出现错误判断,这些,就需要对 TCP 协议有深刻理解了。西厢计划的那帮黑客,居然真的去读 TCP 几百页的 RFC,还居然就发现了方法(这里我假设读者都知道 TCP 的三次握手过程和序列号每次加一的规则)。 我们都知道,三次握手的时候,在收到服务器的 SYN/ACK 的时候,客户端如果发送 ACK 并且序列号+1 就算建立连接了,但是客户端如果发送一个序列号没 +1 的 FIN (表示连接终止,但是服务器知道,这时候连接还没建立呢, FIN 这个包状态是错的,加上序列号也是错的,服务器自己一判断,就知道这个包是坏包,按照标准协议,服务器随手丢弃了这个包), 但这个包,过墙的时候,在墙看来,是表示连接终止的(墙是 ma de in china, 是比较山寨的,不维护连接状态,并且,墙并没有记下刚才服务器出去的 SYN/ACK 的序列号,所以墙不知道序列号错了)。所以,墙很高兴的理解为连接终止,舒了一口气去重置其他连接了, 而这个连接,就成了僵尸,墙不管你客户端了,而这时候,好戏才刚刚开始。

事实上,墙是双向检测的(或者说对每个包都检测的),因此,对服务器和客户端实现相同的对待方法,所以,墙不管客户端还不行,假如服务端有关键词传给客户端,墙还是有可能要发飙的(这里说有可能,因为我也不知道)。所以,最好的办法就是,让服务端也给墙一个终止连接的标志就好了。可是这个说起来简单,做起来难,怎么能让不受自己控制的服务器发一个自己想要的包呢? 西厢计划的那帮黑客,再次去读几百页的 RFC, 令人惊讶的发现,他们居然在 RFC 上发现了一个可以用的特性。我们上面说了,三次握手的时候,在收到 SYN/ACK 后,客户端要给服务器发送一个序列号+1 的ACK,可是,假如我不+1呢,直接发 ACK 包给服务器。 墙已经认为你客户端是死老虎了,不理你了,不知道你搞什么飞机,让这个 ACK 过了。可是服务器一看,不对啊,你给我的不是我期待的那个序列号, RFC 上说了,TCP 包如果序列号错了的话,就回复一个 Reset. 所以,服务器就回复了一个 Reset。这个 Reset 过墙的时候,墙一看乐了,服务器也终止连接了,好吧,两边都是死老虎了,我就不监听这条连接了。而至于客户端,这个服务器过来的 Reset 非常好识别,忽略就是。随后,客户端开始正确的发送 ACK, 至此,三次握手成功,真正的好戏开始,而墙则认为客户端和服务器都是死老虎,直接放过。所以,张生就这样透明的过了墙。 至于过墙以后所有的事情,《西厢记》里面都有记载,各位读者自行买书学习。

现在的西厢计划客户端,即“张生”模块的防连接重置的原理就是这样,服务器端,即莺莺模块的实现也是类似的。防DNS那个,不懂 DNS 协议,所以看不懂。我猜想,因为开发人员都是黑客,所以自然喜欢用最经得起折腾和高度定制的 Linux 开发。 现在看西厢计划的实现,因为依赖于 Linux 内核模块 netfilter, 在 Linux 上如鱼得水,但往其他平台的移植可能是个亟待解决的问题。 我觉得,在其他平台上,可以通过 libpcap 和 libnet ,在用户态实现相同的功能,就是有点麻烦而已,有兴趣的懂网络的可以照西厢计划原理,在家自行做出此功能;当然,全中国人民都用 Linux 最好 :)

PS 1: 据说是西厢计划一个作者画的原理图:http://img.ly/DIi
PS 2: 我对 TCP 的理解仅限于课本,如果上面的对技术的理解有错,请大家指出。
PS 3: 有些漏洞,可能是设计上本质缺陷,不是那么容易修复的。
PS 4: 除了最后一个图,本文没有其他相关链接,如需相关资料,自行 Google。

以前我在博客里说过我用 Gtalk 控制我家的空调,这样我在回家之前就可以先开空调, 到家的时候正好家里凉爽起来了。 这个技术很简单, 只需要弄一个所谓的 X10 设备就行了。 我的朋友 Bao Sheng 做了一个视频, 有兴趣的可以看看他的演示和讲解。

X10 是一种非常方便的协议, 所有的控制信号都通过家中的电源线传播, 所以设备一插到插座上, 就可以被控制,不需要另外布线, 即插即用,对于我这种租房的人来说非常方便。 X10 设备有很多控制的方式。 有一种 X10 设备, 可以连接在计算机上, 然后计算机就可以发送指令控制其他X10设备。 计算机和X10 之间的接口是串口,所以如果你觉得不爽,用单片机和一个 MAX232 芯片就可以控制了,不需要庞大的计算机。

如果家中的电灯等不是插在插座上,而是通过墙上开关控制,你只需要将家中原有的电灯开关换成支持 X10 的电灯开关就行了。这种 X10 的电灯开关, 和普通墙上开关大小一样,功能一样, 但在 eBay 上的售价比在 Home Depot 买的普通开关还便宜,所以完全可以把家中开关全部换掉。这样就可以用计算机控制家中原有的电灯。

空调, 电饭锅, 风扇, 电视机等电器都可以如此控制。 至于我说的网络控制,就更加简单了, Gtalk 协议都是公开的,只需要写个客户端挂机监听就行了。 如果想玩这套东西的, 我这里有源代码。 X10 还有无线射频接口, 所以可以在车上控制车库的门或者门口的灯, 在家也可以躺在床上一键关灯,都是无线接口能干的事情,这里面的技术,和电动车锁的原理是一样的,你甚至可以把家里面的锁换成车上那种,一有人撬,立即杀猪似的发出警报。

控制电器有很多应用, 比如看电影的时候,能够达到一键打开电视和DVD以及关掉大灯的效果。早晨也可以通过控制灯慢慢亮起来让人自然醒来。至于控制空调,电饭锅这些,都是完全看需要看想象力了。

以上这些玩意,属于第一代智能家庭,我家基本上都部署了。 我现在考虑把我们家往二代智能家庭进化, 具体来说要能做到以下几点, 有些技术细节我没想好, 所以写出来请各位读者大牛出主意。

1. 在计算机上可视化控制一切电器

这个不难,只要写一个 GUI 客户端就行了。 如果想做得比较好玩一点,可以像  Second Life 一样, 把家中做成一个虚拟现实系统, 人走到哪个房间, 哪个房间灯自动点亮。 这个需要一个人的定位机制, 而且人身上的传感器要很小, 便于携带。 这个目前还没想好怎么弄。 大家帮我出出主意? 虚拟现实有什么好的软件? 是不是在门口装个摄像头做一下 Motion Detection 比较好?

2. 语音控制

我想语音控制所有的家电。 我看到别人 hack 了一个无线对讲机,让这个对讲机的信号送到计算机里面,但是随身放一个对讲机好像太庞大了,目前正在考虑弄一个蓝牙耳机,这个蓝牙耳机和计算机连接起来,做语音识别,然后发送信号到家电。 计算机端的语音识别软件很多的,应该很好弄。

3. 大脑直接控制和其他控制

BCI 技术还不成熟, 不过带一两个传感器的检测眼球运动的东西早就有了,如果要控制的东西不复杂,可以使用 Ocz Nia,  如果要复杂一点, 可以使用 Emotiv. 唯一的不好就是要带个帽子到处走,倒没有一个随身的车钥匙大小的遥控器方便。 自从有了 WII, 我们可以 Hack 一个 WII Remote, 然后在家挥一下 WII Remote, 就可以让灯亮起来。 要是 WII Remote 再小一点,或者自己买一个加速传感器和位置传感器粘在筷子上, 就很有魔棒的感觉了,到时候对着灯一点,灯就亮了, 哈里波特保证拜你为师 :)

4. 传感器通信

我家现在卧室的门上面都装了一个红外发射器(垃圾堆上捡了个电视遥控器,用了里面的红外发光二极管)和一个接收器,人进入屋子的时候会切断红外线一次,我就自动打开屋子里的灯,本来是贴在地上的, 可是我们家的猫老是走来走去,干扰系统,所以我不得不放在半人高的地方,可是这些器件总是要拖很长的线才能把信号送回去,我现在放半人高的地方,线拖下来, 猫就老在我接出去的线上面蹭痒,搞得系统三天两头挂掉。 各位知道有没有什么便宜的无线协议,能够把这些小器件之间的无线通信问题解决? 市面上的 WIFI 传感器都要大几十美元一个,不够便宜,这些小器件走 X10 也不行,我家没那么多插口, 而且我还得投资 TTL 到 X10 的接口。 蓝牙和WIFI 模块都太贵,RF 技术我是白痴,而且也不知道怎么做一个不互相干扰的系统,各位有高人指点指点?

5. 微型化计算机

我最近找了一些不带风扇的,可以跑 Linux 的作为家庭媒体存储中心和控制中心的计算机, 我的要求是体积要小,耗能要低,可以放在客厅或者锁在锁在壁橱里面。 其实一个几十块钱的二手计算机就可以干这些事情了,但是噪音太大,长得难看,实在不适合放在客厅。

还有就是接口,至少要支持一些 USB 口,这样我外面才能接其他的外设。 我找了一顿没找到什么好的。 各位有什么建议? 我目前找到的包括 WD My Book World Edition, 中科梦龙盒子(太贵), Foxboard, 和 Marvell Plug Computer. 或者自己 DIY 一个 ATOM 芯片的机器, 或者买一个 ARM 开发版, 或者 Hack 一个  20 块钱的二手 TiVo. 我现在还在这些技术之间纠结,想要找性价比最好的。

同时我还想搞一块很节能的液晶面板,带触摸的,算是家庭控制中枢,可以看到所有的灯和传感器的工作情况,就是不知道有便宜的小触摸面板没有?

我的目标是建立一个智能的,让我安居乐业的家。 各位读着还有什么奇妙的想法?

前几篇我已经提到了完全用命令行工作的妙处。 我提到了聊天用的 Freetalk, 查邮件用的 Mutt 等等。这篇完结篇中,我把以前没提到的零零碎碎的完全基于命令行/键盘的用法写出来.

在苹果下, 我用的 Launcher 自然是 Quicksilver. 在 Linux 下, 我一般是直接用命令行. 偶尔用用 GNOME Go, 不过基本上还是用命令行.

窗口管理器上, 我现在用的是 awesome windows manager. 这个窗口管理器支持多屏幕的纯键盘操作, 我强烈建议天天只用 Firefox 和一个编辑器一个命令行的程序员们尝试一下这个窗口管理器。 这个窗口管理器还有一个好处,就是所有的窗口控件都可以脚本化,所以,可以随意在状态栏加时间状态啊,按钮啊, 等等。 而且这些按钮啊,状态阿,都是可以在运行时用脚本修改的。比如你可以定时让状态栏闪动,只需要在 cron 脚本里面写一条就行了, 让控制闪动的脚本按时运行。

现在我聊天还是用 Freetalk. Freetalk 有一个非常好的特征,就是可以任意的加插件。 我写了一个插件,让我在工作的时候,除了爸妈,未婚妻或老板给我发消息触发一个“滴”,其他消息一概不响。这样非常集中精力。 有时候不得不上 MSN, 我就用 centerim 和 centerim-utf8 (后者支持汉字), 不过我极少用,一个主要原因就是我不知道怎么写插件。 这些不让我 hack 的软件基本上都不是太顺手的。

除了写程序和发邮件聊天,剩下的就是上网了。 自然,我上网是 Firefox。 我用了一个叫做 vimperator 的插件,可以纯键盘的用 vim 的方式控制 Firefox. 这个插件可配置性极强,基本上日常用到的翻页,开关标签和搜索,都可以一键完成。 如果您是 vim 的超级粉丝,这个插件肯定让你觉得上网冲浪从来没这么爽过。 以前我常常用 ubiquity, 不过现在鼠标被我拔了,所以”选中一段文字”这样的操作我基本不用,所以 ubiquity 用的相对少了。

还有就是看 pdf 了,我要推荐一个中国人开发的软件,叫做 apvlv。 这个软件可以让你用vim 的方式看 pdf. 比如光标往下走,直接按 j 就行了, 非常方便。 我现在看 pdf 基本上就用这个了, 每次文件另存为的时候只要 :w, 实在是大大提高效率。

最后,我在文本字符下面也发现了一个类似于 awesome 的咚咚, 叫做 screenwm. 这个软件, 可以让你横着或者竖着切分屏幕成任意的组合, 在每一个小单元里面,相当于运行着一个 GNU Screen 窗口。 所以,在我的宽屏上,我的左边是 vim, 右上面是 mutt/gtalk/todo, 右下面是 shell, 工作起来不要反复切窗口, 非常舒服。

如果您有什么完全用键盘工作提高效率的妙招,不妨留言告诉我 :)