之前介绍了开发的起因, 目标, 下面将转入实际的设计过程.
初始架构
设计一个可移植的插件引擎, 有一个思路比较好:
预先定义一个抽象的目标环境(IVimHost), 这个环境中包含了一组行为明确的操作接口(即 API).
引擎通过访问这些接口与外界环境交互, 从而避免对某个具体环境的依赖.
LibNVim 的整体架构, 即是按照这个原则组织.
模块划分
程序目前有 2 个模块, 一个是 LibNVim 引擎(LibNVim), 另一个是引擎在 VS 2010 中的宿主(VsNVim, 很可耻的抄袭了一下 VsVim ;).
从道理上来讲, 设计一个跨平台系统, 在开始时就针对 2 个或更多平台同时开发比较好, 这样可以及早纠正设计中的错误, 保证设计的质量.
但是因为精力有限, 现在只能以自己常用的 VS 2010 作为目标模型.
因此必须在设计时必须小心, 尽量保证抽象的通用性, 而不要依赖某些 VS 特有的东西, 机制, 以免之后移植其他平台出现问题.
输入的解析
Vim 接收的键盘输入种类繁多, 规则也比较复杂.
所以, 把输入的解析独立出来, 交给状态机(VimKeyInputEvaluation)去处理, 是个不错的选择.
插入时输入的文本如何重现?
插入模式(ModeInsert)时的文本输入的重现, 即 '.', 如果要精确重现所有键盘动作, 不仅实现起来麻烦, 从概念模型上来说也很复杂: 比如光标跳转(如上下左右)导致编辑区域的变化, 区域内删除操作的记录, 区域边界处删除操作的处理...如此等等
没有必要做一个精确, 但是复杂, 难