s( SCI_CLEARDOCUMENTSTYLE ); s( SCI_SETCODEPAGE, SC_CP_UTF8 ); // 支持unicode SetAStyle( STYLE_DEFAULT, black, white, 12, "Fixedsys" ); s( SCI_STYLECLEARALL ); // Copies global style to all others // set the number of styling bits to 7 - the asp/html views need a lot of styling - default is 5 // If you leave the default you will see twiggle lines instead of ASP code s( SCI_SETSTYLEBITS, 7 ); // tab宽度 s( SCI_SETTABWIDTH, 4 ); s( SCI_SETFOCUS, true ); // Snooper 语法解析 //SendEditor( SCI_SETLEXER, SCLEX_SNOOPER_APDU_NOCASE ); s( SCI_SETLEXERLANGUAGE, 0, reinterpret_cast( "snooper_apdu_nocase" ) ); s( SCI_SETKEYWORDS, 0, reinterpret_cast( g____apdu_keywords ) );//设置关键字 s( SCI_SETKEYWORDS, 1, reinterpret_cast( g____apdu_pre_keywords ) );//设置关键字 s( SCI_SETKEYWORDS, 2, reinterpret_cast( g____apdu_function_list ) );//设置关键字 SetAStyle( SCE_SS_DEFAULT, RGB( 0x00, 0x00, 0x00 ) ); // 默认 SetAStyle( SCE_SS_COMMENT, RGB( 0x00, 0x80, 0x80 ) ); // 注释 SetAStyle( SCE_SS_LABEL, RGB( 0X00, 0X80, 0X40 ), (~RGB( 0X00, 0X80, 0X40 ) & 0xffffff) ); // 标号 SetAStyle( SCE_SS_HEX_WRONG, RGB( 50, 100, 45 ) ); // 不是偶数个的hex串 // 当前行高亮 s( SCI_SETCARETLINEVISIBLE, TRUE ); //SendEditor( SCI_SETCARETLINEBACK, 0xb0ffff ); s( SCI_SETCARETLINEBACK, RGB( 226, 217, 232 ) ); // 括号匹配颜色 s( SCI_STYLESETBACK, STYLE_BRACELIGHT, RGB( 0x00, 0xFF, 0x00 ) ); //s( SCI_STYLESETBACK, STYLE_BRACEBAD, RGB( 0xFF, 0x00, 0x00 ) ); // 选择背景 s( SCI_SETSELBACK, true, RGB(0x9f,0xbb,0xe8) ); // 设置margin 0 s( SCI_SETMARGINTYPEN, 0, SC_MARGIN_NUMBER ); // 设置margin 1 s( SCI_SETMARGINTYPEN, 1, SC_MARGIN_SYMBOL ); // 掩码 s( SCI_SETMARGINMASKN, 1, 3 ); // bit 0 and bit 1 s( SCI_MARKERSETFORE, 0, RGB( 0xff, 0x00, 0x00 ) ); //1-red s( SCI_MARKERSETFORE, 1, RGB( 0x00, 0xff, 0x00 ) ); //1-绿色 s( SCI_SETMARGINWIDTHN, 1, 9 ); // 接受鼠标点击 //s( SCI_SETMARGINSENSITIVEN, true ); //s( SCI_TEXTWIDTH(STYLE_LINENUMBER, "_99999") ); // 设置mouse hover时间 s( SCI_SETMOUSEDWELLTIME, 500 );


语法高亮之后,就是代码自动提示与自动完成

先用scintilla派生一个类,俺这个类叫editor,再建个view,嵌入这个editor,这样就可以在view中处理editor的大部分事件了。


代码提示,vc用'.'或'->'或'::'来呼叫,俺自己做这个就用.来呼叫函数列表了,在输入'(', ',', ')'是检查函数是否完成,进行参数提示,按F1或鼠标晃过去显示。
俺在UpdateUI中完成的参数提示,只要当前光标左边是一个'.',就显示函数列表

		case SCN_UPDATEUI:
			// 更新界面
			UpdateUI();
			break;
CScriptView::UpdateUI( void )
	long lStart = s(SCI_GETCURRENTPOS, 0, 0);
	int ch = s( SCI_GETCHARAT, lStart - 1 );
	if( '.' == ch )
		s( SCI_AUTOCSHOW, 0, (sptr_t)g____apdu_function_list );

唯一不足的就是前面多了一个'.',俺在自动完成的时候给删掉了。

参数提示是在消息charadded时进行计算的,基本过程就是取得当前行的内容,再取得当前caret的位置,再再取得行首caret的位置,来计算当前caret对应行内的偏移量

snooper的表达式与其他不同,函数可嵌套,并且'(', '<', '{' 都有不同的意义,所以计算流程没有通用性。

CScriptView::GetFunction( int pos_x, char *funpara, int *start, int *end ) int line_num = s( SCI_LINEFROMPOSITION, pos_x ); // 当前行 int line_length = s( SCI_LINELENGTH, line_num ); // 当前行长度
	// 下面几句相当重要噢,取得行内偏移量
	int pos0 = s( SCI_FINDCOLUMN, line_num, 0 );			// 取得当前行的最左边位置的开始pos
	int pos;
	pos = pos_x - pos0;					// 在行内的偏移量,从1开始
                                    参考:http://www.cnblogs.com/superanyi/archive/2011/04/07/2008632.html
环境:xp sp3,vs2008,win32项目,下面主要代码也是从原文复制过来#include 
#include "scintilla/Scintilla.h"
#include "scintilla/SciLexer.h"
LRESULT CALLBAC
                                    Scintilla是一个免费、跨平台、支持语法高亮的编辑控件。它完整支持源代码的编辑和调试,包括语法高亮、错误指示、代码完成(code completion)和调用提示(call tips)。能包含标记(marker)的页边(margin)可用于标记断点、折叠和高亮当前行。
Scintilla是一个免费、跨平台、支持语法高亮的编辑控件。它完整支持源代码的编辑和调试,包括语法高亮、错误指示、代
Scintilla是一个免费、跨平台、支持语法高亮的编辑控件。它完整支持源代码的编辑和调试,包括语法高亮、错误指示、代码完成(code completion)和调用提示(call tips)。能包含标记(marker)的页边(margin)可用于标记断点、折叠和高亮当前行。
Scintilla是一个免费、跨平台、支持语法高亮的编辑控件。它完整支持源代码的编辑和调试,包括语
今年开始,折腾脚本,发现LUA确实能解决大问题,与C++配合起来,天衣无缝的感觉,处理各种业务轻松很多。
用多了,慢慢发觉有些不爽。最大的问题是,脚本没有编译过程,所有问题得等到运行时才能显现,从而导致脚本调试过程比较低效。
那就做一个IDE,先给自己用。
基本编辑...
QScintillaScintilla 在 Qt 上的移植,Scintilla 是一个免费的源代码编辑控件。它完全开放源代码,功能强大,包括:代码高亮、代码补全、代码折叠、自动缩进、代码提示等。支持非常多的语言,可以轻松实现显示断点,显示运行行等,定义各种样式都很轻松方便。著名的开源编辑器 SciTE 就是 Scintil...
Scintilla是一个开源的源代码编辑组件。在这里记录下它在WTL中的简易使用。
在 WTL 中使用 Scintilla 的一个比较成功的案例是pnotepadProgrammer's Notepad Development
大家可以访问 http://code.google.com/p/pnotepad/ ,不过其现在代码庞大,阅读有一定难度。
Scintilla是一个免费、跨平台、支持语法高亮的编辑控件。它完整支持源代码的编辑和调试,包括语法高亮、错误指示、代码完成(code completion)和调用提示(call tips)。能包含标记(marker)的页边(margin)
 Scintilla是一个开源的源代码编辑组件。在这里记录下它在MFC中的简易使用。
Scintilla 3.24在MFC中的使用(动态、静态) 一文使用的别人封装过的类。至于怎样去封装,没有详细说明。
下面将简单介绍在MFCSDI框架下如何封装Scintilla,提供一个玩具级的演示示例。本文使用的是Scintil
                                    上一篇文章介绍了Scintilla的基本应用,这里继续学习Scintilla更多的控制命令和实现细节,完善我们的编辑器;
页边(Margins)和标记(Markers)
代码折叠是现代IDE和代码编辑器的必备功能,如果现在推出一个不支持折叠的编辑器,那是要被BS地~~。为了不被BS,很有必要先“研究”一下Scintilla的页边(Margins)和标记(Markers)功能。
页 边(M...
                                    根据类的继承关系,我们能直接使用的信号在 QsciScintillaBase 和 QsciScintilla(是对前面的这个基类的进一步封装而已) 这个类里。