`

支持代码完成和函数提示

阅读更多

支持代码完成和函数提示

来自http://www.cppprog.com/2009/1111/176_4.html

VS的代码完成和函数提示功能是很值得称道的,它们可以极大地提高我们的编程效率(造成我现在写代码时往往只记住前四个字母,如果在对象后面点了小数点后不出现提示就会心慌意乱的说-_-),尽管有时也会失效。

做为IDE这个功能是绝对不能少D。即使你只打算做个编辑器,如果有这个功能那也是一大亮点啊~~(目前很多代码编辑器都没这个功能的说)。

关于函数提示的几个命令以SCI_CALLTIP作为前缀,这里只介绍我们即将使用的几个命令(更多命令见:http://scintilla.sourceforge.net/ScintillaDoc.html#CallTips

  • SCI_CALLTIPSHOW(int posStart, const char *definition) 显示提示。posStart表示显示位置,definition是显示的内容
  • SCI_CALLTIPCANCEL 取消提示
  • SCI_CALLTIPACTIVE 如果当前编辑器中有提示信息,返回1,否则返回0
  • SCI_CALLTIPSETHLT(int highlightStart, int highlightEnd) 设置提示中的高亮位置,在VS里我们输入函数实参时函数提示会高亮当前输入的参数名。

在我们程序中加入提示的最佳时机是SCN_CHARADDED(见上一节)事件。当用户输入左圆括号'('时,取得括号左边的函数名,然后显示出该函数的完整定义。

下面的代码实现了CreateWindow和MoveWindow两个API的函数提示

  1. //我们要高亮的两个函数
  2. const size_t FUNCSIZE=2;
  3. char* g_szFuncList[FUNCSIZE]={ //函数名
  4.     "CreateWindow(",
  5.     "MoveWindow("
  6. };
  7. char* g_szFuncDesc[FUNCSIZE]={ //函数信息
  8.     "HWND CreateWindow("
  9.     "LPCTSTR lpClassName,"
  10.     " LPCTSTR lpWindowName,"
  11.     " DWORD dwStyle, "
  12.     " int x,"
  13.     " int y,"
  14.     " int nWidth,"
  15.     " int nHeight, "
  16.     " HWND hWndParent,"
  17.     " HMENU hMenu,"
  18.     " HANDLE hInstance,"
  19.     " PVOID lpParam"
  20.     ")",
  21.     "BOOL MoveWindow("
  22.     "HWND hWnd,"
  23.     " int X,"
  24.     " int Y,"
  25.     " int nWidth,"
  26.     " int nHeight,"
  27.     " BOOL bRepaint"
  28.     ")"
  29. };
  30. void __fastcall TForm1::WndProc(Messages::TMessage &Message)
  31. {
  32.     TForm::WndProc(Message);
  33.     if(Message.Msg == WM_NOTIFY)
  34.     {
  35.         SCNotification* notify = (SCNotification*)Message.LParam;
  36.         ...
  37.         if(notify->nmhdr.code == SCN_CHARADDED)
  38.         {
  39.             ...
  40.             // 函数提示功能
  41.             static const char* pCallTipNextWord = NULL;//下一个高亮位置
  42.             static const char* pCallTipCurDesc = NULL;//当前提示的函数信息
  43.             if(notify->ch == '('//如果输入了左括号,显示函数提示
  44.             {
  45.                 char word[1000]; //保存当前光标下的单词(函数名)
  46.                 TextRange tr;    //用于SCI_GETTEXTRANGE命令
  47.                 int pos = SendEditor(SCI_GETCURRENTPOS); //取得当前位置(括号的位置)
  48.                 int startpos = SendEditor(SCI_WORDSTARTPOSITION,pos-1);//当前单词起始位置
  49.                 int endpos = SendEditor(SCI_WORDENDPOSITION,pos-1);//当前单词终止位置
  50.                 tr.chrg.cpMin = startpos;  //设定单词区间,取出单词
  51.                 tr.chrg.cpMax = endpos;
  52.                 tr.lpstrText = word;
  53.                 SendEditor(SCI_GETTEXTRANGE,0, sptr_t(&tr));
  54.                 
  55.                 for(size_t i=0; i<FUNCSIZE; i++) //找找有没有我们认识的函数?
  56.                 {
  57.                     if(memcmp(g_szFuncList[i],word,sizeof(g_szFuncList[i])) == 0)
  58.                     {     //找到啦,那么显示提示吧
  59.                         pCallTipCurDesc = g_szFuncDesc[i]; //当前提示的函数信息
  60.                         SendEditor(SCI_CALLTIPSHOW,pos,sptr_t(pCallTipCurDesc));//显示这个提示
  61.                         const char *pStart = strchr(pCallTipCurDesc,'(')+1; //高亮第一个参数
  62.                         const char *pEnd = strchr(pStart,',');//参数列表以逗号分隔
  63.                         if(pEnd == NULL) pEnd = strchr(pStart,')');//若是最后一个参数,后面是右括号
  64.                         SendEditor(SCI_CALLTIPSETHLT,
  65.                             pStart-pCallTipCurDesc, pEnd-pCallTipCurDesc);
  66.                         pCallTipNextWord = pEnd+1;//指向下一参数位置
  67.                         break;
  68.                     }
  69.                 }
  70.             }
  71.             else if(notify->ch == ')'//如果输入右括号,就关闭函数提示
  72.             {
  73.                 SendEditor(SCI_CALLTIPCANCEL);
  74.                 pCallTipCurDesc = NULL;
  75.                 pCallTipNextWord = NULL;                
  76.             }
  77.             else if(notify->ch == ',' && SendEditor(SCI_CALLTIPACTIVE) && pCallTipCurDesc)
  78.             {
  79.                 //输入的是逗号,高亮下一个参数
  80.                 const char *pStart = pCallTipNextWord;
  81.                 const char *pEnd = strchr(pStart,',');
  82.                 if(pEnd == NULL) pEnd = strchr(pStart,')');
  83.                 if(pEnd == NULL) //没有下一个参数啦,关闭提示
  84.                     SendEditor(SCI_CALLTIPCANCEL);
  85.                 else
  86.                 {
  87.                     SendEditor(SCI_CALLTIPSETHLT,pStart-pCallTipCurDesc, pEnd-pCallTipCurDesc);
  88.                     pCallTipNextWord = pEnd+1;
  89.                 }
  90.             }
  91.         }//if(notify->nmhdr.code == SCN_CHARADDED)
  92.         ...
  93.     }//if(Message.Msg == WM_NOTIFY)
  94. }

当然,这个提示功能相当山寨啦。比如函数名和括号之间有空格提示就不出来了,函数嵌套调用时只会提示最后一个函数的参数。关于如果改进,大家各显神通吧。

另外,还有一个提外话,在实际的使用中,我们的函数信息不可能象这里一样是写死的,而是依据用户的输入动态生成的函数名及信息列表。这就涉及到一个C++代码解析的问题(还好,只要解析函数声明就行了),对于这一点,牛X的同学可以自己写解析代码;次牛X的可以考虑用WAVE,Spirit,Regex等库帮助解析;象偶这种不牛的同学,则可以考虑利用CTAGS工具在后台线程中生成tag文件,我们从tag文件里取就可以了(当然,效率嘛~~可以参考C++Builder的函数提示效率-_-)。

代码完成和函数提示的用法类似,前缀是SCI_AUTOC,具体命令见:http://scintilla.sourceforge.net/ScintillaDoc.html#Autocompletion

直接上代码:

  1. void __fastcall TForm1::WndProc(Messages::TMessage &Message)
  2. {
  3.     TForm::WndProc(Message);
  4.     if(Message.Msg == WM_NOTIFY)
  5.     {
  6.         ...
  7.         if(notify->nmhdr.code == SCN_CHARADDED)
  8.         {
  9.             ...
  10.             if(notify->ch == '.')
  11.             {
  12.                 char word[1000]; //保存当前光标下的单词
  13.                 TextRange tr;    //用于SCI_GETTEXTRANGE命令
  14.                 int pos = SendEditor(SCI_GETCURRENTPOS); //取得当前位置
  15.                 int startpos = SendEditor(SCI_WORDSTARTPOSITION,pos-1);//当前单词起始位置
  16.                 int endpos = SendEditor(SCI_WORDENDPOSITION,pos-1);//当前单词终止位置
  17.                 tr.chrg.cpMin = startpos;  //设定单词区间,取出单词
  18.                 tr.chrg.cpMax = endpos;
  19.                 tr.lpstrText = word;
  20.                 SendEditor(SCI_GETTEXTRANGE,0, sptr_t(&tr));
  21.                 if(strcmp(word,"file.") == 0) //输入file.后提示file对象的几个方法
  22.                 {
  23.                     SendEditor(SCI_AUTOCSHOW,0,
  24.                         sptr_t(
  25.                             "close "
  26.                             "eof "
  27.                             "good "
  28.                             "open "
  29.                             "rdbuf "
  30.                             "size"
  31.                         ));
  32.                 }
  33.             }
  34.             ...

SCI_AUTOCSHOW命令的第一个参数表示已经输入了多少个字符。这对于代码自动完成是很有帮助的,比如我们可以用它帮助用户输入长串的单词,如:

  1. if(strcmp(word,"Create") == 0)
  2. {
  3.     SendEditor(SCI_AUTOCSHOW,6,//已经输入了6位字符
  4.         sptr_t(
  5.             "CreateBitmap "
  6.             "CreateDC "
  7.             "CreateHandle "
  8.             "CreateWindow "
  9.             "CreateWindowEx"
  10.         ));
  11. }

 

分享到:
评论

相关推荐

    代码编辑器(支持自动缩进,语法高亮,代码折叠,函数提示,行号显示)

    2.支持代码折叠功能,如下 void f() { } 3.支持自动代码缩进 int main() { while(true) { printf("great"); } } 4.支持行号显示,如程序左显示 5.支持函数参数自动提示功能,...

    快写代码编辑器 v2.0.4.zip

    快写代码编辑器是一款中文代码编辑器,支持中文编写PHP、HTML、CSS,支持多种编程语言的语法高亮、拥有优秀的代码自动完成功能。 快写代码编辑器主要功能: 1、简洁的界面 2、用中文编写代码 3、中英代码互转 ...

    WindowsSource Insight代码阅读工具.rar

    3.自动完成:Source Insight 提供了自动完成功能,可以根据上下文提供代码片段和函数名的自动补全提示,提高编码效率。 4.代码分析:它能够对代码进行静态分析,检查语法错误、未使用的变量、函数调用关系等,并且...

    支持语法高亮的SciTE简单小巧的文本编辑器

    可以为各种语言添加API,使其有和vc vs一样的下拉菜单提示及自动完成API函数名,关键字等等。 其下载地址为 http://groups.google.com/group/scite-interest/web/extras 还可以自己定义语言,并为自己的语言设置语法...

    LINQPad 5.25.00 高级版(自动完成,代码格式化)

    LINQPad 也是一个很好的学习LINQ的工具,包含《C# 3.0 in a Nutshell》一书中200个示例,可以使用LINQPad感受LINQ的超酷功能和函数编程。 编写一条简单的查询语句,可以立即看到查询的结果,在此测试是编写的LINQ...

    Sublime Text 3

    -语法高亮、代码提示补全、代码折叠、自定义皮肤/配色方案、多便签 -代码地图、多种界面布局与全屏免打扰模式 -完全开放的用户自定义配置与神奇实用的编辑状态恢复功能 -强大的多行选择和多行编辑 -雷电般快速的文件...

    DEVCPP智能开发平台(支持画图,win10系统支持语音)

    12.代码提示及代码自动完成功能【快捷键:Alt+Backspace】 13.代码自动格式化【保存及编译运行时】 14.支持导入STL格式的3D打印文件 15.支持用户自定义源代码模板 16.支持高精度运算和进制转换 17.自带C++函数...

    《编译原理》课程设计- 类C语言编译器+源代码+文档说明

    程序可以对类C语言代码编译,支持函数过程调用和数组。编译完成后会在原文件路径下生成汇编语言代码文件并在运行日志中输出对应的编译信息或者发生编译错误时的错误提示信息。此时用户可以查看详细的编译过程和结果...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

     李文娟,中国石油大学(华东)硕士,现供职于国家行政学院,工作后一直从事软件开发和软件项目管理工作,对计算机语言、计算机体系结构、操作系统都非常熟悉,尤其是精通C和C++编程技术. 目录 封面 -19 封底 -18 扉页...

    C-Free好用的C/C++语言开发工具

    7. 代码完成功能和函数参数提示功能;(5)(6) 8. 能够列出代码文件中包含的所有符号(函数、类/结构、变量等);(7) 9. 大量可定制的功能 可定制快捷键 可定制外部工具 可定制帮助(可支持Windows帮助、Html帮助和在线...

    ShaderlabVSCode 1.3.0.unitypackage.7z

    :: 代码完成和基础的智能感应 :: 提示信息 :: 函数帮助 :: 代码片段 :: 跳转到定义 :: 文档格式化和选中 :: 文档代码符号 :: 支持 SRP ShaderlabVSCode 有免费的功能受限的版本可以从 这里 获得。 支持平台: 1. ...

    luacodeEditor

    增强如下: 1、增加自定义API的...2、对自动完成和函数提示作了较多的增强;加了少量语义分析,以便于智能提示; 3、关闭了调试信息窗口,改善了工程列表的显示; 主要因为我不用此工具来调试,纯粹编写lua代码;

    扫码点餐小程序+cms网页后台+管理员+厨师端小程序代码+云开发+云函数+云数据库+完整源码+讲解视频+知识点笔记

    一,技术选型 1,前端 微信小程序原生框架 css JavaScript 2,管理后台 云开发Cms内容管理系统 web网页 3,数据后台 小程序云开发 云函数 ...9,搜索结果,支持模糊查询 ...3,订单完成 ...5,管理后厨和排号管理

    NovalIDE是一款开源,跨平台,而且免费的国产Python IDE 有出色的语法高亮功能, 支持多种语言

    有出色的语法高亮功能, 支持多种语言,python,c/c++,html,javascript,xml,css等,能够自动检测,并加载Python解释器, 允许用户自由添加删除解释器,并选择相应的解释器运行脚本,支持函数智能提示和代码自动完成, ...

    【亲测可用】dbForge Studio 2022 for SQL Server Enterprise 6.3.9【官网最新版】

    截止到目前(2022-09-29)官网最新版本 老规矩,先安装,再覆盖。 本版本更新内容如下 ...在完成列表、快速信息和参数信息中添加了对 DATE_BUCKET 函数的支持 改进了源代码管理中刷新操作的性能 等等等…………

    C-free专业版

    代码完成功能和函数参数提示功能; 能够列出代码文件中包含的所有符号 函数 类 结构 变量等 ; 大量可定制的功能: 可定制快捷键 可定制外部工具 可定制帮助 可支持Windows帮助 Html帮助和在线帮助 ; 彩色 带语法加...

    超实用的jQuery代码段

    《超实用的jQuery代码段》从jQuery框架的使用原理与应用场景出发,对最实用的jQuery代码段进行了全方位的介绍和演示。全书分为11章,包含网页效果、DOM元素与属性、HTML事件、CSS样式、用户输入自动完成、拖放、图形...

    jQuery 表单验证插件

    支持函数和正则表达式的扩展。提供扩展库formValidatorReg.js,你可以自由的添加、修改里面的内容。 支持2种校验模式。第一种:文字提示(showword模式);第二种:弹出窗口提示(showalert模式) 支持多个校验组。...

    jQuery formValidator表单验证插件示例源码

    支持函数和正则表达式的扩展。提供扩展库formValidatorReg.js,你可以自由的添加、修改里面的内容。 支持2种校验模式。第一种:文字提示(showword模式);第二种:弹出窗口提示(showalert模式) 支持多个校验组。...

    神级代码编辑软件(Sublime Text 3) 3083 汉化 绿色 注册版

    -语法高亮、代码提示补全、代码折叠、自定义皮肤/配色方案、多便签 -代码地图、多种界面布局与全屏免打扰模式 -完全开放的用户自定义配置与神奇实用的编辑状态恢复功能 -强大的多行选择和多行编辑 -雷电般快速的文件...

Global site tag (gtag.js) - Google Analytics