2009年5月10日星期日

Vim与中文分词

Vim的"w"、"e"等一系列快捷键无法支持中文已经在vim_use和vim_dev中讨论过多次了,但是貌似没有开发者愿意给Vim写一个关于此问 题的补丁。我前一段时间研究了一下,发现让Vim在这方面支持中文确实是不现实的。在这里写一下原因,如果有人想继续研究这个问题,至少可以参考一下。

解决这个问题最直观的想法就是让Vim调用外部的中文分词库分词,然后把光标移动到正确的地方。相应的困难有两点:Vim不愿意和外部进程通信;Vim集成中文分词器很困难。

Vim的众多开发原则中,有一点是非常重要的,那就是可移植性。Vim运行在很多平台上,不止是*nix、Mac和Windows,还有VMS甚至 QNX。任何一个Vim的特性补丁能否被检入,不止取决与这个特性的紧急程度,还在很大程度上取决与这个特性的可移植性。Vim不愿和外部进程通信也正是 基于这个考虑,因为不同操作系统的通信机制千奇百怪,要设计和维持一套统一的协议是很困难的。没有和外部进程通信的渠道,让Vim调用外部分词库也就无从 谈起了。

使Vim用外部的分词器是最好的解决方案,因为在统一接口的条件下,这样可以保持很高的灵活性,在多个分词器之间切换。既然这样不行,那分词器可以集成进 Vim么?可惜,答案是很困难(不是不可能)。Vim关心的另一个非常重要的原则就是性能。Vim运行的环境可以是有图形界面的,也可以命令行。特别是在 命令行下,延迟是不可忍受的。幸运的是现在的中文分词库的性能都还不错,一般都有上百kb/s的处理速度,每秒都在十万字以上。另外,既然是集成进 Vim,那在众多中文分词库中应该选用哪一个呢?还有一个不利的因素就是现在中文分词都都需要词库,而这个词库是很大的。这么大的一个词库如果集成进 Vim,那下载起来会很困难。再者词库是需要更新的(程序会自己学习新词么?嗯,也许会吧,十年之后……),这就是大麻烦了,还要和网络通信,大大的不 行。

即便有个牛人把上面的麻烦都解决了,写出来了一个可用的补丁,和Bram他们讨论的差不多了,那也需要在一个branch中测试个一年半载来尽可能的找出所有bug(可以参见vim_dev的patches页面)。那时候,任何一个开发者应该都已经被磨的没脾气了。

看起来万事俱备,实际上满是窟窿 T-T

这个问题最好的参考,也是前车之鉴,就是Vim的拼写检查部分。在Vim中输入:h develop-spell可以查看帮助文件中关于拼写检查当年的讨论结果。最终拼写检查没有使用现成的Aspell,而是Vim自己实现了一份。Vim和Emacs的不同之处很明显,这是Vim的特色,但是在这种情况下这种自给自足的小农思想也成了Vim的一圈桎梏吧。

3 条评论: