欢迎光临散文网 会员登陆 & 注册

对于编辑器的一些思考

2022-05-27 01:21 作者:clerk_ma  | 我要投稿

打开手机或者电脑的时候,都会碰到编辑器。能输入文本的地方,表现可能是框或是线,就是编辑器。输入法也是一种编辑器,即input method editor。

然而用是容易的,创造一个新的编辑器却不是太容易的。这个容易,指的是使用API就能实现出一个编辑器的容易度。

我一直试图把TeX迁移到移动平台,但是难度不低。这个编辑器就是困扰我很久的事情。我之前做的Android版TeX编辑器,用的是WebView中使用CodeMirror的实现,出效果很快,但是问题也有,就是WebView中的操作是异步的,发送编辑命令和预览命令给别的UI组件就略微有些麻烦。再加上这些年Android的安全政策更新,我还得重新编译一套动态库版的TeX组件。所以啊,越不想弄的东西,越不想看见的问题,越会在之后重新出现。

编译的事,简单。编辑器的事,复杂。

所以我在前几天开始重新思考编辑器的实现。能参考的东西不少,比如CodeMirror,比如Scintilla,也比如Qt中的QTextEdit。

所有的GUI都是在画图。但是怎么画图,这是得琢磨的。因为很少有书讲怎么去实现GUI框架以及具体的GUI组件。我琢磨了几天,就突然发现这事的好玩之处:能不能实现一个编辑器,基本上能够验证掌握了多少相关的知识。比如:设计模式(尤其是事件驱动),多线程编程,文本处理支持(Unicode和相关编码),排版知识(字体等)。

文本处理和排版,对我来说并不困难。设计模式和多线程编程也不麻烦。

麻烦的反而是文档。Android的一些API的文档,写的极为精简,想要知道使用场景和具体含义,都得看AOSP的源码。这对我来说,就得看源码之后不断的测试。这其中最让我头痛的是输入法的交互:实体键盘和软键盘的处理,按键事件的处理,快捷键的处理。

输入法的处理结束之后,基本上就是花活了,按部就班,能参考的就很多。

比如说,Android的View在Canvas上绘制。文本是不是要渲染成一行?如果过长,一行太长要拆开,要怎么分割文本?文本的拖选高亮怎么实现?文本的语法高亮怎么实现?暗色模式怎么做?光标和光标闪烁是如何现实的?标尺(如行号,顶栏标尺)是怎么实现的?Bidirectional文本是如何控制的(如光标移动)?

我之前写的proto.py其实是个基于伪终端的最简单的文本编辑器。和Android这种基于View的实现,实在是太简单了(所以讲解的部分,基本停了,准备在这个Android的搞定了之后,加大篇幅写)。文本编辑器的门路大概是摸清楚了,我另外想搞懂的,其实是字体编辑器。这事好玩啊,足够打发很长一段时间。虽然大部分公司都不会从头搞这些东西。

对于编辑器的一些思考的评论 (共 条)

分享到微博请遵守国家法律