NEE's Blog

用 BASIC 构建自己的 Vi 文本编辑器

May 07, 2026

本文翻译自 Building my own Vi text editor in BASIC,原载于 Hacker News。

重新发明一个(更简陋的)Vim

这篇文章讲的是我的新文本编辑器项目——yvi

我喜欢重新发明轮子。至少在艺术、手工、烹饪和编程这些事情上,我喜欢这么做。这是我学习的方式,也是让工具贴合自己思维的方式。我觉得可能因为我的背景是艺术,而且我没有正规学过计算机科学(尽管我现在在教计算机),所以我的软件总带着一种手工打造的味道。

作为一个典型案例,我曾经因为不满于那些笨重、文档糟糕或过度臃肿的主流方案,自己构建了静态网站生成器 panblog

我也对那些与主流范式——尤其是硅谷当前软件理念——不太一样的编程语言情有独钟。比如我喜欢胶水语言(glue languages)、面向学习者的语言和库,还有各种脚本语言。我最喜欢的是 Lua、Bash、Fish、Forth 系列以及 BASIC

与 Yabasic 的邂逅

去年我花了几个月时间研究并编写 BASIC,具体来说是 Yabasic 方言——它大约有 25 年历史,至今仍在持续维护。虽然网上有朋友推荐我尝试其他变体,但我发现 Yabasic 易用且文档完善。它在构建图形界面方面不太擅长(至少以我的经验来看),但我可以用 L5 或 Processing-p5 库来弥补。

作为一门现代 BASIC,它用起来相当有趣。我用它做了赛博赛马游戏(灵感来自 UFO50 和 Flash 游戏 Quibble Race)、修改了文字版《俄勒冈之旅》的内部逻辑,还克隆了一个简化版的 Dope Wars 经济模拟游戏。

从灵感到实现

最近我接触到了 Vidak 发起的 The People’s Permacomputer 项目,由此发现了一个活跃的 BASIC 编程论坛,以及各种从零构建 70 年代风格计算机 的项目。

我多年来一直使用 Neovim(更早之前是 Vim),但从未自己写过文本编辑器。我决定试试实现一个自己的。完整实现 Vi 似乎是一个不小的挑战,但我受到 Offpunk 的启发——它是一个极简的 TUI 客户端,用于浏览 Web 和 Gemini 协议,只实现了少量快捷键如 h/j/k/lgG 等。所以我想,用一个最小化的 Vim 命令集来构建一个超简单的编辑器,能有多难?

从 100 行到 500 行

事实证明并不太难!用 Yabasic 大约 100 行代码,我就实现了基本布局——一个空白的编辑页面,加上简单的 Vi 命令用于移动光标和切换插入/普通模式。我添加了打开文件、新建文件和保存的功能。令人满足的是,我现在可以用这个编辑器打开 vi.bas 自身的源代码来查看和编辑它了。

一个早期的设计决策是关于换行的处理。我决定不实现自动换行,因为这大大简化了程序。作为折中,你可以在一行上写任意多的内容,但只显示前 80 个字符,底部状态栏会显示你的行号和字符位置。

yvi 在复古终端中运行

接下来我想要更多功能:按词前进/后退、跳到行首/行尾、文件开头(gg)和结尾(G),以及用 dd 删除整行。于是我加入了多字符组合命令、命令组合能力、数字前缀(目前支持 1-9)、搜索功能。程序规模增长到了约 500 行。我还加了 u 键用于撤销最近一次编辑。

后来又加入了更多命令,比如 S(覆盖整行)、c(剪切并插入)等。我已经在实际编码项目和日常写作中使用它了。这篇文章本身就是用 yvi 编辑器写的。

“造轮子”的意义

目前我不太确定应该在哪里停下,这个程序可能还会继续演化,但它已经达到了一个相当好用的状态。当然还有不少 bug,我不建议用它来处理任何重要或丢失后会灾难性的事情!但 yvi 已经实现了让我觉得有用的那些核心功能。

我为能构建自己的文本编辑器感到自豪——它适合基本写作和简单编程,而且可以持续扩展。代码可能不够优雅,但功能完备且易于修改。

它可能不仅是用 BASIC 实现的最好的 Vi 克隆——我认为它是唯一的一个

你可以立即试用:


关键要点:

  1. 重新发明轮子是最好的学习方式——不是为了产出完美产品,而是为了深入理解工具的工作原理
  2. 从最小可用版本开始——yvi 从 100 行核心功能起步,逐步扩展到 500 行,始终保持可用
  3. BASIC 依然充满魅力——25 年历史的 Yabasic 方言仍然可以构建有趣的实用工具
  4. dogfooding 的价值——用自己写的编辑器来编写编辑器的文档,这种自我迭代是验证工具可用性最好的方式
  5. 不完美也没关系——有 bug、不优雅,但功能够用且可扩展,这就是”手工软件”的精神
comments powered by Disqus