QsciScintilla自动代码完成实现原理

时间:2022-12-10 07:58:26


//自带代码完成工作原理是这样的:lexer负责词法分析,就是一个状态机 //词法分析器里有个关键字keyword数组可以设置,但是这个是给词法分析器分析的时候识别单词用的,上色用的 //不会反映在代码智能提示里的 //自动代码完成的源头有两个:本文档字符串(这个应该是词法分析器完成的),还有 QsciAPIs //qsci编辑器负责结果项的展示,主要是从qsci的头文件里关于Completion这个关键词搜索一下入手 //可以知道如何做代码提示。估计是,自己增加QsciAPIs, //然后还有个showUserList()函数可以用,这个直接强行指定编辑器提示框显示的内容了


因为 QsciAPIs 能提供一些高级的功能,比如能自动逐个提示函数的形参列表,加入一个图标等功能,所以这个是专门为代码智能提示而设计的功能类,所以实现代码智能提示,主要是操作这个类。

看看它的头文件或者下载源码就能知道,它的 原理就是把我们添加的字符串转为有功能性的提示字符串了,这个是通过内部新建的 worker线程实现的,具体用法,读读源码就很清楚了。但是他写得逻辑有问题,比如取消preparation的时候,它直接删除了这个线程,而不管该线程是否正在运行,这是有问题的。这个需要我们避免去用它有坑的用法,要么修改它的源码,要么自己关联他的信号函数来实现正确的功能。

主要参考一下这个博客吧,就很清楚了:​​https://qscintilla.com/#autocompletion/general_autocompletion​

 一个编辑器用于提示的符号库更新方法:

切换到了当前编辑器,让当前编辑器异步调gcc获取依赖头文件(这里必须要动态获取,当然如果知道从上次获取到现在以来没有任何文件发生或修改,那这里倒是也不用重复获取了),然后拿到这些头文件所有的符号,加入当前编辑器符号库。