一个简单的 .Net Vim 引擎 LibNVim 开发记录 (三)

    技术2022-07-06  247

    几个问题:

    Edition 对 Motion 类型的依赖通过接口来识别是否多此一举?

    'f' 类的移动与 'j', 'w' 的移动是否需要区分开来?

     

    状态机越来越复杂, 怎么维护?

    尽量用 if { } else if { } else { } 结构, 提供清晰的逻辑划分, 当然, 层数多了, 阅读与查找会不方便,  需要权量一下(这个时候, LibNVim 体现了它的价值 ;)

     

    项目改名

    还是尊重人家的命名权, 把 "VsNVim" 改为了 "NVimVS", 避免与 "VsVim" 混淆

     

    单词搜索的方案

    目前先提供 '*', '#', 'n', 'N' 的搜索支持

    1) 使用系统提供的方法

    粗略看了下 VsVim 的代码, 搜索部分的代码有点乱, 没有能整理出与 VS 系统交互部分的代码.

    试着直接使用 "Edit.Find" 方法, 但是可控性存在问题, 控制粒度不够, 反馈也不足, 于是考虑放弃, 打算自己实现一套.

    但仍有点不甘心, 认为 VS 应该有提供搜索的调用接口, 于是 google 试了几个关键字, 无意中找到了 ITextSearchService 接口, 试着用了下, 顺利解决问题.

    这个接口本不是这么难发现, 只是一开始思路受限, 总习惯通过 VsVim 学习与 VS 的交互, 遇到卡后, 就没有走下去, 而是尝试别的办法.

    二来对 .Net Framework 的使用还不够熟悉, 经常碰到想要找一个类, 但不知从何找起.

    就这个接口来说, 出现这样的错误有点不应该, 因为在 namespace 的限制下, 想要了解 VS 对外提供的服务还是很容易办到的.

     

    2) 自己实现文本搜索

    能利用已有的资源, 何必自己费力呢?

     

    小结

    预想的目标差不多达到了, 整个设计过程基本符合当初的设想, 虽然 VS 对键盘输入的处理机制有点出乎我的意料, 但还算在掌控中, 原始的设计思路没有什么大的问题, 后面会试着往其他 IDE 移植, 验证下引擎的移植性怎么样

     

    最后附上功能状态列表, 欢迎感兴趣的同学试用 ;)

     

    Implementation Status: No plans for ":w", ":q", have no ideas on the need of Visual Mode Modes supported: Normal, Insert Motions supported: 'h', 'H', 'j', 'k', 'l', 'L', '0', '^', '$', 'G', 'w', 'W', 'e', 'E', 'b', 'B', '%', "gg", "zz", "[{", "]}" Simple Editions supported: '.', 'u', 'U', 'x', 'X', 'i', 'I', 'a', 'A', 's', 'S', 'o', 'O', 'C', 'D', 'J' Range Editions supported: 'cX', 'dX', '=X' Copy & Paste supported: "yX", 'p', 'P' Simple Search supported: 'f', 'F', 't', 'T', '*', '#', 'n', 'N', "/xxx"(a simple dialect, ignorecase default, and no regex)


    最新回复(0)