Random Tech Thoughts

The title above is not random

写文本编辑器的收获

好久没有写东西了,因为这次开学以后实在是有太多的事情要做,到今天为止几乎每天都要写程序。没有想到一年三个学期会这么累,但是每天都有明确的事情要做总比漫无目的自己瞎找事情做要好一些。

寒假写终端下的文本编辑器用的是 C,在 20 号的时候终于提交了。虽然最后还是有一个比较重要的功能没有实现,但是这次用 C 写程序的经历倒是终于让我对 C 比较熟悉了。收获不少,主要的有两个,一个是了解 Unicode 了,也知道怎样让自己的程序支持 Unicode 从而支持中文的处理;另外一个就是对 C 的指针使用更熟练了。另外因为是写文本编辑器,所以对字符串的处理是少不了的,加上 C 里面字符串都是通过字符指针来处理,所以不光是指针,对 C 的字符串处理现在也是很习惯了。(反倒是有点不习惯 C++ 的 string 了。)

在开始写的时候从来没有想到过文本编辑器的缓冲区内容和屏幕光标位置的维护工作有那么麻烦,主要的问题都出在边界上,每一种特殊情况都要处理。而 Vi 在不同模式下光标的移动、删除操作等实际上都有一些小的区别的,我模仿 Vi 来写所以这些模式之间的差别也增加了我写编辑器时的负担。有时间的话倒是想看看 Vim 是如何维护缓冲区和光标的位置的,也想看看它是怎样解析命令的。

这次还用到一个很不错的技巧:用 struct 数组来初始化 hash table。比如用一个 struct command,成员是命令名字和对应的操作的函数指针,然后定义一个 struct command 的数组,里面把所有的命令和函数指针放进去,这样就可以很容易的在程序初始化的时候把把数组里面的内容全部放入 hash table。而且以后要添加命令的话也只需要在 struct command 的数组里面添加一项就可以了。

最后一点值得说的就是用函数指针实现了一个类似 state 模式的东西。我用一个整数表示编辑器的状态,另外有一个函数指针数组。程序处理用户输入的主循环中,利用状态作为下标从函数指针数组中得到状态对应的函数指针,然后调用这个函数。函数指针真的是好东西!终于喜欢上指针了 :–)

Comments