类库大魔王
类库大魔王 多年C++、Go项目经验,长期从事跨平台(Windows/macOS/iOS/Android)应用架构设计与开发。

增强Code Snippet


  本来这是打算在上周五完成的,结果上周五又开小差搞界面去了,周六周日又跑去魔都了,于是就拖到这周了。今天刚开始的时候还有点惧怕的,怕是实现难点有点高,甚至又冒出过放弃的念头的。后来还是硬着头皮做一点是一点,结果还不错,比想像的要容易一些,已经能达到90%的计划中的程度了,剩下的10%么,从个人感情上还是从策略上,都应该放到后面的版本中实现了。
  下面先说一下最终的表现吧。
  前一个版本,code snippet使用的展开缩写的快捷键是Ctrl+,,这次把这个快捷键换到Ctrl+;了,那是因为另外又增加了两个操作,这两个操作是正反对应的,于是分别占用了Ctrl+,和Ctrl+.。正常的操作方法是,假设在编辑Lua源代码时,输入for,这时光标停在最后一个字母r的后面,按快捷键Ctrl+,,会自动将for展开为比较完整的for i = 1,10 do…(省略号表示后面还有些内容,这里不影响说明,就不列出来了)并选中for后面的循环变量i。到这步为止,相比上个版本的实现,只是增加了选中循环变量i的这步操作,但也已经方便了用户可以不再手动移动光标位置来修改变量名称。接下了,就是新增的两个占用了快捷键的操作,即Ctrl+,和Ctrl+.,分别是向左或向右跳动选中1和10。也就是说,在这次for展开后,共有3处可能被自动选中,即i、1、10,至于每次选中哪处,可以通过快捷键Ctrl+,和Ctrl+.来修改。这是基于这样的应用场景:在for循环中,基本的循环结构是自动补完了,但实际上循环变量和变量的初始值和终结值是最可能需要根据情况修改的,于是编辑器就可以通过快捷键快速选中这些部分,而不用再通过鼠标或方向键等常规方法移动输入光标进行修改。这就是最终的表现。
  接着简单记一下实现的过程。
  因为从整个程序的实现架构上的原因,此功能的实现一部分由Lua脚本完成,一部分由C++完成。首先是修改了code snippet的模板,如上例中的for,在模板中的定义是for ${1:i} = ${2:1}, ${3:10} do…(省略号表示后面还有些内容,这里不影响说明,就不列出来了)可以看到有3处用${}包括的内容,这些内容的都用一个冒号分隔,冒号前面是一个编号,冒号后面是最终展开后填入到编辑器中的内容。编号用于按快捷键Ctrl+,和Ctrl+.时进行排序,Ctrl+,则从大到小跳转,Ctrl+.从小大到跳转,初始状态时选中编号为1的部分。在for后展开snippet,是用Lua脚本完成的,那会先从模板配置文件中找到缩写对应的模板,然后将${}部分全都提取出来并替换成冒号后面的部分内容,并根据当前编辑器的插入位置重新计算和修正每个${}的位置信息。这些位置信息用于后面的选中功能。然后把所有这些信息都存入C++实现的编辑器对象中,在C++实现的编辑器类中会有几处事件通知处理。一处是刷新UI时,更新当前光标位置,如果当前光标位置已经不在任何一个${}的范围内,那么本次code snippet展开就算完成任务了。另一处是编辑器内的文本修改,如果有新增或减少文本,那么要修改当前光标所在的${}的长度(这个长度在选中文本时需要用到),并修改该${}位置后面的所有其他${}的起始位置。只有这样,才能在修改了一处${}后,仍能继续正常地在各处${}间来回跳转。好了,基本的思路就是这样了。
  题外话,想说一下,在文本处理方面,脚本语言确实比C++要方便一些,比如查找替换${}部分,在Lua中实现的模式匹配就很好用。

感觉本文不错,不妨小额鼓励我一下!
如果你有Visa、MasterCard之类的国际银行卡,也可以考虑以下选项:
如果你看不到评论框,说明Disqus被墙了。