Writing an editor in less than 1000 lines of code, just for fun

Salvatore Sanfilippo

不到 1000 行代码写个编辑器,纯粹为了好玩

原文由 Salvatore Sanfilippo 发布,订阅该博客

警告:这是一篇又长又没什么用的博文。太长不看版就是:我纯粹为了好玩,用不到 1000 行代码写了一个文本编辑器,它不依赖 ncurses,支持语法高亮和搜索功能。代码在这里:http://github.com/antirez/kilo

演示视频在这里:https://asciinema.org/a/90r2i9bq8po03nazhqtsifksb

献给怀旧的人,请继续往下看……

几周前有一条新闻说,Nano 编辑器不再是 GNU 项目的一部分了。我的第一反应是:哇,居然还有这么多人在乎这个老编辑器——它本来只是一个基于终端的“邮件客户端”里自带的编辑器的克隆版。再说一遍,“邮件客户端”。如今,邮件客户端这个概念本身都已经消失了,一切都变了。然而我在 Hacker News 上却看到不少人留言说,正是因为在各种机器上都能找到 nano,他们在做系统管理之类的任务时才多次化险为夷。我的儿子也是用 nano 写下了他的第一个 C 程序。它提供了一种尚可接受的体验,不需要任何文件编辑经验就能上手。

就这样,我开始琢磨要不要写一个比 Nano 本身还要小得多的文本编辑器。基本上就是图个好玩,因为我喜欢、也欣赏小巧的程序。

如今再去写个编辑器,是不是显得很无聊、没用、浪费时间?我们似乎总该去做那些光鲜亮丽、了不起、非常酷炫、复杂又有价值的项目。但有时候,做点没有明确目的的东西反而让人耳目一新。还有一些回忆……

我还记得第一次接触 Commodore 16 内置 ROM 汇编器的经历,以及童年时期用过的那些家用电脑和 BASIC 解释器。编辑器是人与机器之间最基本的连接。它让人能够写下可被计算机理解的东西。那个方形光标一闪一闪的样子,是我们很多人永远不会忘记的。

话虽如此,但我的时间非常有限。横跨两个周末也就几个小时的空闲,还安排了家庭活动,还要为朋友们的长时间烧烤聚会准备烤肉。或许我还是能耍点小技巧,在零碎时间里把编辑器写出来。我的目标是写一个非常小巧、不用 curses、带语法高亮的编辑器。基本上就是得能用。这就是要求……东西不多,但要在几个小时内从零开始全部写出来,已经很难了。

不过……等等,我以前其实写过一个编辑器,它是 LOAD81 项目的一部分,那是一个基于 Lua、面向儿童的编程环境。也许我可以直接复用它……与其用 SDL 往屏幕上绘制,不如直接向终端发送 VT100 转义序列呢?而这部分代码我也有,就在 linenoise 里——另一个玩具项目,后来却在不少严肃项目里派上了用场。所以也许把这两块拼起来就行……

第一周的周六早上我去了海边,感觉很棒。之后我哥哥从 Edinburg 来到 Catania,傍晚时分我们一起坐在花园里,抱着笔记本电脑,躲避白天 30 度的高温,于是我开始动手搭建编辑器的第一个雏形。LOAD81 的代码相当模块化,要把它从原项目中抽离出来简直易如反掌。几个小时后就已经可以勉强进行编辑了,也该去睡觉了。第二天在再次出门去海边之前,我又继续写了一会儿。我 15 岁的儿子要睡到下午一点——毕竟我 15 岁时暑假也是这样——所以我就趁等他起床的间隙,以 30 分钟为单位冲刺写代码,其余时间则陪我可爱的女儿玩。最后在周日晚上,我试着把剩下的问题都修好。

嘿,我记得几年前做一个项目时,那是真正地去 *hack*,一连好几天全职投入。我现在老了,但还年轻到可以写玩具编辑器,并把它当成正经事来对待 :-)

然而生活不易,周一到了。要忙正事了,没时间搞玩具项目,甚至没时间把周末做出来的东西发布出去……它还需要一点最基本的打磨,再配上一篇博文。

我只好等到这个周一才又有机会上手“Kilo”编辑器。它叫 Kilo,是因为它不到 1024 行代码。用于统计代码行数的 cloc 工具告诉我,距离 1024 行还有大约 100 行的余量,而一个像样的编辑器毕竟还需要“搜索”功能。于是又回去写代码,顺便也试着重构并重新加了些注释,毕竟你知道的,在几个小时内把两个项目的代码拼在一起,代码质量很难非常出色。

好了,现在是时候发布了,给这个疯狂的项目画上句号。也许有人会把它当作起点去写一个真正的编辑器,也许它可以被用来写一些有趣的新 CLI,打破常规的 REPL 模式。

代码在这里:http://github.com/antirez/kilo

HN 评论:https://news.ycombinator.com/item?id=12065217

本文章由 muse-spark-1.2-contributor 进行翻译

评论