开放[url=http://www.pccode.net].net" class="wordstyle"源码的自由软件-VIM的主创者在本文中讲述了vim的开发内幕和发展方向. 同时提出慈善软件的概念并解释了Bram为何将这一概念用之于vim. 本文也深入程序内部的函数和数据结构, 作者讲述了vim这一复杂的程序是如何工作的, 并且讨论了在vim最新版6.0中的新功能.
介绍
不太可能你还从来没有听说过vim吧. 它作为标准的Vi编辑器存在于Linux的几乎每一种发行版里. 在很多系统里如FreeBSD和Sun Solaris 8它作为一个便于安装的独立软件包, 在其它系统(MS-Windows, Macintosh, OS/2等等)上的源代码和已编译好的可执行程序在因特网上很多地方都可以下载
Vim是一个类似于Vi的文本编辑器, 不过在Vi的基础上增加了很多新的特性, Vim普遍被推崇为类Vi编辑器中最好的一个, 事实上真正的劲敌来自Emacs的不同变体. 1999 年Emacs被选为Linuxworld文本编辑分类的优胜者, Vim屈居第二, 但在2000年2月 Vim赢得了Slashdot Beanie的最佳开放源代码文本编辑器大奖, 又将Emacs推至二线, 总的来看, Vim和Emacs同样都是非常优秀的文本编辑器.
Vim(和Vi)一个最大的优势在于, 它最常用的命令都是简单的字符, 这比起使用复杂的控制组合键要快得多, 而且也解放了手指的大量工作, 学习使用这些命令的时间很快就能从由此带给你的高效率中得到回报. 另外, 与Vi不同, Vim也支持在插入模式下使用上下箭头键, 这使初学者可以很容易上手.
与其它的类Vi编辑器相比, Vim拥有众多的特性: 对180多种语言的语法高亮功能, 对C语言的自动缩进, 以及一个功能强大的内置脚本语言. 对每个人来说, Vim总有让他们喜欢的东西.
Vim的开发仍然在继续进行, 写作本文时, Vim6.0版的工作已经于9月份(2001年 )完成了, 在这之后, vim的主要目标是更稳定, 更实用, 而不是再去增加更多的新功能了, 完善已有功能和修改bug的工作已经够人忙的了. 比起Vim, 原始版的Vi自1985年并没有多大的变化.
上图是GTK版Vim的一个快照, 图片上显示正在编辑的C源代码, 代码的不同部分以相应的语法高亮显示, 被查找的字符模式"msg_didany"以黄色的背景高亮显示. 图上还显示了一个可视化的选择(灰色背景), 绿色的闪烁光标突出显示这一模式. 在底行"-- VISUAL --"表明当前所处的工作模式, 右边是当前光标在文件中的位置信息.
Vim历史
很久以前我自己有一台Amiga计算机. 因为我过去一直使用Vi, 所以我想找一个 Amiga版的类似Vi的编辑器. 我找到一些叫"克隆"的版本. 但没一个中意的. 所以我就挑了其中最好的一个来改进它. 最初的目标是达到所有Vi的功能. 后来我逐渐增加了一些Vi所没有的额外功能, 如多级撤消.
当它看起来已经运行得不错时, 我发布了一个Vim(意思是Vi IMitation[译注] Vi的仿造品)放在由Fred Fish搞的一个公共磁盘上. 接下来开始有人发给了我一些补丁, 还有一些人努力把Vim移植到其它平台上, 如MS-DOS和Unix. 我又增加了更多的一些功能让它看起来更好用. 此时, Vim可以名正言顺地叫"Vi IMProved"( [译注]增加版Vi)了. 后来整个源代码被重新设计并且扩展了很多, 几乎再也找不到原始的"克隆"版源代码的痕迹了.
起初我在Vim所作的工作完全是为了方便自己. 后来我意识到Vim同样可以方便他人, 于是我就把它公之于众. 从此我就不断地致力于让它成为一个更好的工具以服务于它的大量用户. 创造一个对他人有用的东西是很有趣的. 同时, 还有很多优秀的合作小组和用户鼓舞着我的工作.
下面是Vim的发展简历:
-------------------------------------------------------------------------
1991 Nov 2 - Vim 1.14: 第一版 (在Fred Fish的第591号磁盘上).
1992 - Vim 1.22: 移植到Unix上. Vim开始挑战Vi
1994 Aug 12 - Vim 3.0: 支持多窗口多缓冲区
1996 May 29 - Vim 4.0: 支持GUI(图形用户界面) (主要是Robert Webb的努力).
1998 Feb 19 - Vim 5.0: 颜色支持和语法高亮
2001 Sep 26 - Vim 6.0: 折行, 插件, 垂直窗口分隔
-------------------------------------------------------------------------
Vim中的IMproved(增强)到底意味着什么?
1.22版的Vim比之Vi已经多了很多功能. 我决定把"Vi IMitation"改为"Vi IMproved". 随着时间的推移两者之间的差距越来越大, 现在, 几乎没有理由去使用Vi而不是Vim. 我建议所有的Vi用户转而使用Vim. 下面是其大量优点的部分摘录:
- 对文本行的长度没有限制, 允许ASCII码为0的字符; 可以编辑任意类型的文件
, 包括二进制文件.
- 多级的撤消和重做功能: 当你的转换大小写的键盘灯不慎灯亮起来时, 无须担
心误操作会毁了你的文件.
- 多窗口和多缓冲区: 同时可以编辑多个文件, 并且可以在它们之间复制内容.
- 语法高亮: 让你快速把握整个文档的结构, 迅速发现错误所在.
- 命令行历史记录和命令补全: 更正打字失误, 快速重复历史命令, 快速键入
长文件名.
- 可以删除和添加矩形的文本区域: 用于编辑表格
- 错误信息解析: 在Vim中运行编译器并且能根据编译产生的错误信息迅速定位
到源代码中发生错误的地方([译注]对程序员尤其有用)
- 带有超链接([译注]不同于WEB浏览器中的链接, 但功能类似)的在线帮助: 让
你快速找到关于任何命令的详细帮助, 阅读相关帮助主题.
- 一个功能强大的脚本语言: 可以增加你自己的扩展功能.
Vim的开发
几年的辛苦工作之后Vim6.0版终于完成了, 核心的工作由我亲自操刀, 另外有很多人也加入了工作, 有时他们新加一项功能然后发给我一个补丁, 以便我把他们的新功能加进去, 但是多数时间这些发来的补丁还要做一些整合的工作, 很少有人能去把握Vim的各个部分是如何协同工作的. 因为整个代码实在是太复杂了. 比如说, 有人发过来一个跨行搜索字符模式的补丁. 这表明这一功能可以如何实现以及源代码中哪个地方需要做哪些改动. 不幸的是补丁的作者使用指针操作每个文本行, 他并没有意识到这些指针可能是非法的. 我必需总览整个改过的新代码来改正它. 虽然融合这些补丁很麻烦, 但这确实能帮我把握正确的方向.
用户们在Vim邮件列表上的问题往往能指明哪些是最经常碰到的问题. 有时也有人直接发补丁给我, 或者要求增加一些新功能. 我认为这种与用户的互动和合作开发是vim的主要优势. 用户与开发者能直接地开诚布公地交流. 这也正是开源软件比之商业软件更好的原因.
发行
Vim可以自由发行, 不过, 也有少许的限制. 下面一段文字是与Vim一起发行的:
-------------------------------------------------------------------------
摘要
Vim是福利软件. 你可以自由使用和复制, 但是我们希望你能关注一下乌干达的
孤儿. 参见下面的|iccf|节.
如果你将Vim在CD-ROM中发行, 我很高兴能收到一份. 只是想知道世界上又有人
在这样发行Vim(也可以向我的朋友们展示:-)).
正文
对Vim不加修改的复制和发行都没有限制, Vim也可以部分发发行, 但是这段文字
必需包括在内. 你也可以在发行版中包括你自己从一个未被修改的源代码中编译
的可执行文件, 或者你自己的使用例子, 脚本.
如果你要发行一个修改过的Vim版本, 我们(维护者)希望收到一份你的包括源代码
的修订版. 或者让维护者可以通过ftp来下载; 如果所作的改动很小,(比如只是
更改了Makefile) 仅仅把不同之处EMAIL给当前维护者也可以, 但无论如何如果维
护者要求的话, 你必需提供源代码给他.
Vim的维护者保留将这些改进包括到Vim正式版中的权利. 不过仍有商量余地, 但
不允许在你不准备把你的源代码提供给维护人员的情况下发行你的修订版Vim.
当前的维护者是Bram Moolenaar(BRAM@VIM.ORG), 如有变动, 会在适当的地方公开声明(主要是
如www.vim.org 网站上或comp.editors这样的新闻组). 如果实在没法联系维护者,
当然你也就不再有义务把你的修订版源代码发给他.
不允许从Vim源代码发行版或部分发行版中删除本文, 本文的声明也适用于Vim
的前期版本以代替当时的版本声明.
-------------------------------------------------------------------------
我更希望给用户在使用源代码方面更大的自由, 之所以加上如上的限制是为了避免Elvis(vi的一个克隆版)过去遭遇过的事情: 有人弄到了Elvis源代码, 加了一些诸如Windows的GUI特性的东西, 然后开始拿去卖钱. 修改之后的Elvis不公开[url=http://www.pccode.net].net" class="wordstyle"源码而且整个软件的核心代码仍然是最初的Elvis, 这实在太不公平了. 不光是因为有人拿他人的劳动去赚钱, 更重要的是他不公开[url=http://www.pccode.net].net" class="wordstyle"源码, 从而拒绝别人对该软件进行进一步的改进. 正因为这个我才加了如上限制以保证别人对源代码做的修改必需要让我知道. 虽然这些限制仍留有余地, 比如某公司做了一个Vim的修订版然后跟我协商能否不把他们所做出的修改公之于众, 但毕竟让我保留了对自己创造的软件的决定权.
为何不用GNU的GPL(Gnu公共许可证)?
GNU的公共许可证有更严格的限制, 虽然它声明保护软件自由, 但实际上限制了你所能做出的改变. 你可以做出修改, 但如果你要发行修订版的话你必需将你的所有改动公之于众, 这样人们就失去了自己持有他所修改过的源代码的权利, 我想这实际上限制了你的自由. 另一方面, 如果允许任何人都可以任意修改然后作为自己的私藏, 甚至他并未作出修改就从Vim的某部分受益, 也并不公平, 所以我决定加上这一条件: 所有对源代码的修改必需让我知道. 我可据此决定这些改动中哪些确实是对人们普遍有益的, 从而把它添加到Vim中. 而哪些只拥有少量的用户群, 所以允许某个公司从中赚点钱, 毕竟, 如果一个软件的源代码是公开的话, 很难再去要用户为此付钱.
同时我也并不认为所有的软件都应该是免费的或是都应该是开源项目, 我所知道的所有为开源软件工作的人也都为商业软件工作谋生, 或者是全职工作为其工作, 或者是正准备找, 如果没有商业软件,那这些软件业的人又能如何谋生呢? 我认为自由软件, 开源软件和商业软件将会共存, 很多商业软件不可能公开源代码, 因为这样公司就会失去竞争优势. 软件源代码的创造代价昂贵, 所以商业软件公司可不想别人能坐享其成. 由于软件的专利和版权保护力实际上是很微弱的, 不予公开在很多情况下仍然是最好的保护措施. 一个不幸的后果就是, 你无法从中学习这些商业软件是如何实现的, 也无法自己去修改你花钱买来的软件里面的BUG, 解决之道可以是公开一个软件的大部分源代码, 但保留其中核心的部分.
开源软件的前景
什么软件会是开源项目而什么软件又不会是开源项目? 这一问题无从回答, 对于某一个应用领域, 是否有人愿意为此花费大量心力去创造并维护一个软件, 很大程度上依赖于一个个人的动机因素: 又没钱得, 又要花费自己的大量劳动. 这一点无法控制, 而且后果莫测. 不久以前人们还认为只有小的软件项目才可能是开放源代码的, 而大型的软件项目由于项目周期和资金方面的问题必需由一个商业软件公司来承担, 但Linux的发展打破了这想法, 而且Linux并不是个别的例外, 还有不少其它的大型的开源软件项目也都成功了, 如KDE.
现实中我发现多数人只会对自己要使用的软件感兴趣. 这正是Vim当时的情况: 我每天都用它. 这几乎成了一种制约, 因为越来越多的人开始学写程序. 这确实限制了致力于某个专用程序的人数, 理论上可以按如下公式去计算有多少人可能为开源软件工作:
人数 = 感兴趣的人数 x 能力 x 动机
其中:
人数 为某个开源项目工作的人数
感兴趣的人数 有兴趣使用该程序的人数
能力 这其中有能力写程序的人所占的百分比
动机 某个人有志于从事这个项目的比率
值得注意的是, 有兴趣使用某个程序的人数也依赖于已有程序的可用性, 如果没有足够好的可替代程序或者太贵了, 人数就会升高, 如果已经有一个又便宜又好的程序. 人数就会下降.
不是说随便一个人都能写软件, 而且写不同的程序所需要的技巧差别也很大. 如果目标程序是软件工程方面的, 可能就有很多人投身其中, 这其中不乏确实有足够的编程能力的人, 如果程序是处理稀有鸟类的数据, 可能感兴趣的人数就很少.
整个公式中动机是一个最难以把握的因素, 在有能力写程序的人中又有多少人愿意去写? 这一问题听起来也蛮有趣, 看看是否这个因素也是可以估算出来的.
对这一公式的修正要引入另一因素:有多少人愿意为了别人来写程序. 尤其是为伤残人士. 不过, 我想人数很少.
假设人数最终还是被算出来了, 剩下的一个大问题就是: 事实上真的会有人这么做吗. 或者情况好一点: 就算会, 什么时间? 只要有足够的时间, 我相信每个程序都需要有人去做. 应该有一个公式也可以计算出某个程序今年是否会被写出来. 这个就留给读者们去考虑吧...
总的来说, 这个公式中有太多的不确定因素, 可以说难以预测将来会有多少开源软件.
福利软件
由于Vim是一个开源[1] [url=http://www.chinamx.com.cn/Article/os/Linux/200605/20060530130116_28850_2.html][2] [3] 下一页