EverEdit 的初心——the Emacs & Vim Enhanced Reversion Edit

关键字

EverEdit, TextEdit

笔者评论

EverEdit 是一个已有十年以上历史的文本编辑器软件, 按其远超同类的功能、优秀的性能和超强的可扩展性来讲,它本应出现在著名的世界级文本编辑器清单中,而在诸多国外编辑的文本编辑器的评论中,它却并未列席,笔者认为多有不公。EverEdit 是瓶好酒,但深藏巷中,导致它小众的原因,不在于软件本身,而在于它是是作者@Ever的兴趣之下的独立开发作品,这并不妨碍它的优秀,但在推广和运营它的投入和它的功能相比就显得不足了。

EverEdit,如果按 GNU 的习惯命名规则,笔者将之解释为:

 Emacs & Vim Enhanced Reversion Edit

在初期它吸取了 Emacs 的 C + script 的思想和 Vim 文本配置的精髓,经过多年打磨,对于大多数人,特别是亚洲语系的使用者的使用来讲,它几乎超越了所有之前对手,足以满足日常高强度工作,因此笔者专门开辟一个栏目来介绍它。

软件名片

作者:@Ever
主页: http://www.everedit.net/
下载: http://www.everedit.cn/download

版本历史

按历史年代类比来划分,EverEdit 在成型之前经历过多次更名,笔者本篇着重记录它是如何从一个基本的起点进化到现在的过程,以供开发者参考。

史前时代

起初,神向图灵和邱奇传授了可计算性,冯诺依曼以此为基础创造了大型计算机,适时,Unix 是空虚混沌,Linux Kernel 渊面黑暗,开发者的手指运行 ed 和 vi 上,其后,从 vi 产生了 Vim,神挥了挥袖子,让 RMS 和 Steele 创造了 Emacs,我们叫它宏文本编辑器。其后 RMS 用它创造了 GCC,并用 Emacs 和 GCC 将 GNU Freeware 的礼盒送给了世界上每个使用软件的人。

从零开始编写一个的编辑器的构想,也许是萌芽于二十世纪初期,作者 @Ever 在日本工作的一个失眠的夜晚。

彼时的文本编辑器市场明星产品不多,亚洲的 Emacs 用户还在忍受它的乱码、并不出色的性能和小指关节的疼痛;同时期的 Vim 对 GUI 下文本编辑需求的处理还显得怪异,用户经常被复制后失焦、中英文混排,长行问题所折磨;开源的学究派 编辑控件 Scintilla 虽然支持了大部分编程语言的高亮,但仅限于编辑小文件,其渲染达不到工业级。而定位局限,只能偶尔一用的 Notepad2 还在襁褓中成长,富文本编辑器 WPS、Office Word、iWork Pages 们却不属于纯文本这个战场。

以及一些现在来看,数百个先行者已淡出主流视野,掩埋在历史车轮之下,有的已以开放源码的方式体面退出的编辑器,内核其实都不那么可靠,那个时代,是商业软件 EditPlus、UltraEdit、TextMate、BBEdit 的黄金年代,而 EverEdit 的代码还未出现在 @Ever 的硬盘上。

石器时代——MegaxEditor 初生

EverEdit 从作者的硬盘到公布于众,前前后后也有数年时间。作者多年更新的博客记述了它的点点滴滴,这个作品最初的目标是:

  1. 较低的内存占用
  2. 可扩展的语法渲染(可以采用正则进行更加通用的匹配)
  3. 可自定义的键盘
  4. 完全 unicode 支持和 codepage 自动选择
  5. 可扩展的架构,包含 plugin
  6. 对于超大文件的支持
  7. 同一种字体的多种样式支持

其第一个尝鲜版命名为 MegaxEditor,实现了其中的 1、3、4、6,大部分实现了 2,但 5 未找到合理的架构未实现,7 的实现有性能问题。可以说,实现的目标虽然不够,但由于其内核从开始就是原创相比已站在了一个高起点上。

陶器时代——功能补全

其后,作者 @Ever 第一次释出公开版本,其升级过程中逐步实现了:

  • 嵌入语法高亮,比如 HTML 中内嵌 Javascript 和 Css
  • 提高了自动换行的效率
  • 嵌入的脚本语言是 Lua(可能受 Scintilla 影响 )
  • 语法加亮上,支持同文档多达 4 种语言
  • 文件标签的拖放
  • 真彩图标
  • 用内存映射解决了高速自动换行

红铜时代——持续增强

实现上述功能后,作者又将架构从 SDI 单文档窗口改为 MDI 多文档窗口模式,并添加了工具栏,当然,这两个功能是必备的。

它最初使用的是微软官方程序的选择 MFC 库,但 MFC 的缺陷在于臃肿冗杂,并不优雅(但当时为实现原型,MFC 确实是比原生 Win32 API 更好的选择)。

之后,也许是受同时代 Chrome 在 Windows 上采用的代码库的启发,@Ever 将程序框架从 MFC 迁移到 WTL,而后者虽然不是微软官方推荐,但也是微软团队作品,只是对于开发者来讲,文档不如 MFC 完整,很大程度上依赖开发者内容。其实 WTL 也算不上框架,只是代码模板库。能否用好,主要靠使用者内功。

同时,作者考察了同时代编辑器 TextMate 的功能优势,很有野心地将其一一实现在作品中,如:常用文本包(Bundles )、模式(Schema)和代码片段(Snippet ),随后,将软件名称缩短了两个字符,改为 MegaxEdit。

不得不说,作者在 C++ 和设计思维方面具有天赋,比如 Tab Trigger 的实现,确实能带为编写所有编程语言的代码上带来不可思议地加速。

接着加入了 Perl 兼容正则表达式用于查找替换,虽然是并不是所有文本编辑器都具备的高级功能,但对程序员来说,正则表达式是现代代码编辑器的标配。

接下来,作者在语法着色和编码处理上遇到了瓶颈,@Ever 在思考一种更优的架构。

青铜时代——架构重构

架构重构最重要的变化莫过于将内嵌的脚本语言由 Lua 转为 VBScript,同时对内核 Edit 控件做了必要的调整。

这样子,两年时间很快就过去了,博客社区都在等待他的更新,但架构的调整伤筋动骨,需要经过充分的测试,并不适合冒然发布。

优秀程序员交付的代码,一定会经过了反复测试,这可谓优秀程序员的基本素养。

为满足博客社区的好奇,@Ever 在 2010 年 08 月 03 向更大的群体发出了 MegaxEdit 0.1 版本,一个只含基础功能的版本。

在开发的版本上,又经历了很长时间,经过内核的改进,EverEdit 可以支持超大文件了,在同时代绝对算是创新,同时提升性能的还有,界面从多文档接口模式还原为单文档接口,加入了多线程,这样可省下创建太多窗口和控件的开销。

铁器时代——LotusEditor 面世

这个时期,功能上@Ever 已将 Lua 完全迁移到 VBScript,通过 VBS 实现了配置的脚本化,架构变得更加灵活,并添加了全局热键和快捷键的功能。

在子语言的加亮上,改变了子语言的加亮思路,与之前不同的是,子语言渲染和主语言同等对待,这是典型的递归的思路,相比限制 4 种语法会更加优雅。

这个时期,@Ever 也开始逐步考虑商业化,由于对架构进行了升级,开始几个版本发布并没有沿用 MegaxEdit 的名字,而称其软件为我的编辑器 0.0.1 版……,以下记录几个主要发布:

我的编辑器 0.50 版的更新日志

支持的功能:

  1. 文本编码自动识别
  2. 语法着色(可以着色各种变态的,混合的,嵌入的的语言 )
  3. 随意折叠。对于选择的文本,可以随意折叠起来。自动折叠会和分割窗体在一起实现。
  4. 高亮搜索
  5. 列选。列插入,删除,拷贝,粘贴等。
  6. 支持自动缩进。还没有和 lexer 等联动,只是按照上行进行缩进。但是,它只会在真正输入的时候才会插入空白字符。
  7. 实时自动拼写检查。附加功能有待进一步加强
  8. 还有很多其它的功能,不一一列举

已知重大问题:

  1. 执行大批次替换时候,会死掉。比如执行 50 万次替换,编辑器会假死掉。目前的查找替换是在核心外部实现的,查找效率还不错。替换,因为要构造command,几十万次的替换,仅仅这些 command 本身就要占用很多内存。为此,@Ever 又写了一个专门的操作,叫做 file command,就是可以把一个文件的内容当做输入。这样的话,就可以完美解决掉效率和内存占用的问题,同时还可以 undo 和 redo,但是会失去一些状态信息,比如书签之类的。
  2. Windows 7 的字体绘制发生了一些变化。在第一次启动的时候,使用 Win7 的用户如发现不正常,变更一下字体即可。编辑器是支持任何等宽或不等宽字体的。

这是进步较大的一个版本,修改了很多 bug 和不完善的地方。已知的未实现:

  1. 不支持自右向左书写系统。左右混合的书写系统难以想象。注意这不是像汉语书籍那样的书写。虽然有些汉语书籍是自右向左书写的,但是那只是阅读方向发生了变化。本质上和自左向右没啥太大区别。阿拉伯文等貌似词汇就是自右向左的。所以,因过于麻烦,在可以预见的将来不会支持这个功能。可能彻底放弃这部分的潜在客户群。
  2. 不支持巨长的行,其实内核是支持的。但是编辑器提供给外部接口的渲染函数就是一个简单的形如int render( char* text,int length),这样的接口如果行数巨长,内存占用会飙升。
  3. 其它的功能不是不支持,而是没做。近期的目标就是 notepad2!就这么多了,希望在接下来的日子里,让它更稳健。尽快的 ko 掉 notepad2。
插件架构的调整

在实现编辑器的过程中,会写增加很多附加功能,如果把所有的功能都整合进主程序的话,则非常的臃肿。一般的来说有两种解决方法:

  1. 采用 dll 的方式,dll 是主程序不可或缺的一部分,运行时即全部加载。
  2. 插件的方式。插件也是封装成 dll,但并不是主程序的一部分,第三方可以随意扩充。

@Ever 考究了几种插件架构,参考了架构非常清晰 BVRDE,这样对一些分散的小功能,如 taglist,多文件查找,html toolbar,代码仓库等,由插件来实现比较好。

增加打印和打印预览

在 Windows 编程中,打印和打印预览的映射模式挺麻烦。为 Edit 添加了一个PRINTLINE 接口,这样不仅可以方面的实现打印和打印预览,还可以在给定的 DC和 RECT 上绘制文本。

我的编辑器 0.60 版
  1. 完成了窗体分割(横向和纵向)
  2. 完善了状态栏的控制.动态切换 lexer, encoding, file format, tab size等,均可在状态栏单击右键弹出菜单完成。
  3. 实现了软 Tab, 即用空格填充对齐
  4. 实现覆写模式,快捷键 INS
  5. GOTO LINE
  6. 修正了一部分 Bug
我的编辑器 0.80 版

繁忙之中的更新,增加一部分功能,全面介绍一下,特色如下:

  1. 自动编码探测。支持各种 encoding。
  2. 较低的内存占用。用很少的内存也可以编辑巨大的文件,但是打开可能会耗时一点。
  3. Perl5 兼容正则。支持扩展模式。较好的解决了 ^,$,\n 三个字符出现情况下的匹配。很多编辑器对这三个字符处理的很烂。正则和正常模式均支持向前向后查找。
  4. 可定制 lexer,同时也可以简单的配置语法着色文件。可以参考 syntax 目录下的文件。
  5. 代码折叠。编辑器自带根据缩进折叠。
  6. 代码完成。编辑器自带全文自动完成。快捷键 Alt+ ENTER。在出现候选项的时候,为了缩短键程,可以使用 j 和 k 进行上下选择,j 往上,k 往下。
  7. 缩进显示。
  8. 自动换行。编辑器自带窗口边界换行。
  9. 简易括号匹配。Html tag 匹配开发中。
  10. 列选择、列插入、列剪切、列拷贝。兼容 visual studio 列模式。列模式下backspace 向前删除,delete 删除选区。
  11. 窗口分割。
  12. 打印和打印预览 。
  13. 可调整行高 。
  14. 多标签支持。
  15. 可点状态栏。在状态栏,不仅可以查看,而且可以更改部分常用配置。
  16. 可扩展插件架构。本版本只是一个功能预览版,不可作为日常使用!
我的编辑器正式更名为 LotusEdit

TextMate 的 scope 概念确实很棒,为跟上得为每个字符建立一个 style。接下来作者着重在 lexer.dll 的扩展上工作,希望能够提供 scope 信息,跟上 TextMate

增加 4 个插件:拼写检查,取色器,taglist,和主题制作器。展现扩展的能力。

更新 2011/11/29

  1. 更新 tab 为可完全可控制的 tab。默认绘制系统主题,在无主题的情况下和editplus 的 tab 类似,还未添加 close。
  2. 更新 parser 为完全可自定义的 parser。最大更新莫过于此。你可以用 lua 描述一个变态的 parser 让 edit 来解释。本质上就是分成不同的 region。效率比 vim 差,那是因为 vim 采用了极其复杂的语法,用来提高解析的效率。虽然效率没有 vim 高,但是 14 兆的 c++ 文件大约 1.6 秒解析完毕,一般日常用的程序文件更是不在话下了。这个解析器里面的区域可以嵌套,并且支持正则。足以秒杀editplus, emeditor, ue(仅 parser 上)。
  3. 解析器适当修改的话,就可以提供 scope 信息。不过最近对 scope 的用途反倒有点糊涂了,不如直接定义不同的快捷键来的更直接啊!
  4. 添加了一个 output 窗口。这不仅仅是一个 output,输入 !word 表示直接运行该命令并捕获输出,以后的输入都直接作用于该命令直到退出。输入 word,则winexec 执行。当前行首为 ^ 表示执行,为 $ 表示定位。定位的意思是双击该行,跳转到该文件的指定行。
  5. 名字更改为 LotusEdit
  6. 修正部分 bug.

离1.0越来越近了。接下去完成了宏录制功能。

LotusEdit 0.90

这是一个功能展示版,但离 1.0 已经很接近了(几乎可以实用)。

本次更新带来了比较大的变更:

  1. 完全可自定义的 Parser。Parser是用 vbs 表达的,支持 Region 和 Item,Region里面匹配 Item,Region 还可以嵌套。可以自定义各种复杂语法进行匹配。再也不是单一的注释,字符串啊这样的匹配了。在下一代的编辑器中,我觉得这是一个基本功能。TextMate 和 E 都做到了,不过 E 实现的一般。
  2. 强大的脚本。直接支持运行 vbs,可以使用 msgbox 和 inputbox 等。可以写一些脚本来运行一些常用的格式化。 甚至弹出菜单。
  3. 如果不会写,没关系,你可以录制。录制出来的宏也是 vbs 形式的,可以直接保存。其实这就是脚本形式的 plugin,zencoding 什么的自然不在话下。
  4. 仿 vim 的 tearoff 菜单。主要是防止 Macro 菜单下的项非常多的情况,这样你可以直接 tearoff 出来一个.
  5. 2 级快捷键支持。类似 EMACS 那样,按下一个按键之后,需要再按一个键,才会构成一个命令,目前就支持二级!也可以直接定义脚本为某个快捷键,也就是说你按一下快捷键就可以执行一个脚本命令,比较方便。
  6. 强大的 Output 窗口。Output 不仅可以显示查找信息,还可以直接运行命令:
    !xxxx:带感叹号,直接运行,不带感叹号,表示 CreateProcess
    cls 清屏,内置命令还没来得及完善。
  7. 全屏模式。
  8. WindowList:支持快速模糊查找
  9. 正则添加了汉字支持。\c 表示汉字,\C 表示非汉字
  10. 括号匹配。

总体上 LotusEdit 非常的简洁,但却有强大的可配置型(脚本和 plugin )

LotusEdit 1.00 正式发布

主页:www.lotusedit.com(因更名已关闭)

LotusEdit is a fast, lightweight, extendable text … 感慨万千

LotusEdit 1.03 发布
  • 更多功能
  • 简洁界面+自定义Tab

2012-02-25

Sublime Text 的 MiniMap 实现分析

Sublime Text 有一个让人眼前一亮的所谓 minimap 的功能,能够吸引一些眼球,但说实话,觉得没啥用。还浪费布局空间,浪费内存。但作者在 LotusEdit 中也可以轻松模拟,分割窗体,鼠标滚动,调小字体,一个分割窗体去掉标尺行号当前行)实现方法简直是简单的不能在简单了。绝大多数字体,换行分离的编辑器都是可以实现的。

  1. 首先该编辑器的字体是独立的,就是不同的视窗可以设置不同的字体
  2. 该编辑器的文档是可以被attach的,即多个视图可以 attach 到同一个文档
  3. 该编辑器的换行是独立的,不同的编辑器可以显示不同的折行。那么,就相当于分割一个新的窗口,然后 attach 到该文档上,然后把字体调小,行号标尺统统去掉,加个外罩的 rect!
  4. 大功告成!
LotusEdit 1.12 发布

新特性如下:

  1. 改善了大文件的支持。读取大文件的时候再不会假死了。
  2. 添加自动缩进和反缩进。比如在 c++ 中输入{,然后回车自动缩进;在html 输入自动反缩进一次
  3. 外部工具可以添加分隔符。
  4. 列号起始位 0。
  5. 在状态栏显示被选择的行数。

Bugs:

  1. 用户自定义语法着色 0 匹配导致死循环。
  2. Alt+key 无法弹出主菜单。
  3. 替换查找无法的选项无法同步。
  4. Trim 之后选区消失。
  5. 外部工具的一些 bug。
  6. Theme Maker 的一些不适当的地方。

至此,LotusEdit 几乎实现了市面上常见文本编辑器的所有功能。

白银时代——EverEdit 2-3 的更新

这是一个内核已经稳定,扩充功能,增加接口,持续优化时期,同时也引来源源不断的用户,笔者即是从 EverEdit 2 开始使用的,至今已使用超过 7 年。

这个时期的 EverEdit 更新非常频繁。因此以下不再列举更新日志,感受一下《EverEdit 的版本更新日志

最难得是,数十万行代码,数百个功能,却保持了敏捷小巧。

黄金年代——EverEdit 4.0 的升级

这是最坏的年代,也是最好的年代。

在经历了 3.7 稳定版的持续维护和版本 4 的同步开发的并行期,经过了 2 年的沉淀。

4.0 版本发布,一个现代文本编辑器功能收敛,趋于稳定,开发工作重心发生转移。

在迎接大数据时代来临的背景下, @Ever 下一步计划可能是增加 CSV 文件的支持。以及一些适当的运营。

反观初心,作者以十年时间答复了自己的坚持与匠心,一个稳定小巧,功能丰富的文本编辑器在中国诞生了。

笔者将在后续的文章中详细介绍 EverEdit,预期包括各种功能,基础用法,个性化配置,扩展编写等主题。期待读者反馈。

专栏文章

EverEdit 的版本更新日志

《EverEdit 的初心——the Emacs & Vim Enhanced Reversion Edit》有1个想法

  1. Pingback: 选择文本编辑器 – IT桃花岛

发表评论

电子邮件地址不会被公开。 必填项已用*标注