Scintilla是一个免费、跨平台、支持语法高亮的编辑控件。它完整支持源代码的编辑和调试,包括语法高亮、错误指示、代码完成(code completion)和调用提示(call tips)。能包含标记(marker)的页边(margin)可用于标记断点、折叠和高亮当前行。
配置Scintilla的两种方法
配置Scintilla控件是通过向该控件发送配置命令实现的,各种配置命令可以在doc目录下找到(或者是这里http://scintilla.sourceforge.net/ScintillaDoc.html),后面的大部分事情都是在介绍这些配置命令。
有两种方法来发送配置命令,一种是直接使用SendMessage API。另一种是取得直接控制函数,通过函数来执行配置命令。
在Windows下,第二种方法要比第一种快得多。
直接控制函数的定义为:
typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, sptr_t lParam);
后三个参数和SendMessage的后三个参数一样。
SciFnDirect的第一个参数用于指定具体的Scintilla窗体,它类似于窗体的HWND又不完全相同,姑且也称之为句柄吧。它是用一个配置命 令取得的,下面马上就要讲到。
取得直接控制函数和句柄的方法是:
SciFnDirect fnDirect = (SciFnDirect)SendMessage(hwndEditor,SCI_GETDIRECTFUNCTION,0,0);
sptr_t ptrDirect = (sptr_t)SendMessage(hwndEditor,SCI_GETDIRECTPOINTER,0,0);
取得这两样东西以后,就可以直接执行配置命令了,如:
m_fnDirect(fnDirect, SCI_CLEARALL, 0, 0);
演示代码:编写成员函数SendEditor,用于配置之前建立的Scintilla控件。
- #include <Scintilla.h>
- #include <SciLexer.h>
-
- class TForm1 : public TForm
- {
- __published:
- private:
- SciFnDirect m_fnDirect;
- sptr_t m_ptrDirect;
- public:
- __fastcall TForm1(TComponent* Owner);
- sptr_t SendEditor(unsigned int iMessage, uptr_t wParam = 0, sptr_t lParam = 0)
- {
- return m_fnDirect(m_ptrDirect, iMessage, wParam, lParam);
- }
- };
-
- #define SCINT_ID 1010
- __fastcall TForm1::TForm1(TComponent* Owner)
- : TForm(Owner)
- {
- HWND hwndEditor = ::CreateWindow(_T("Scintilla"),
- NULL, WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_VISIBLE,
- 0,0,ClientWidth,ClientHeight,
- Handle,
- (HMENU)SCINT_ID, HInstance, NULL);
- m_fnDirect = (SciFnDirect)SendMessage(hwndEditor,SCI_GETDIRECTFUNCTION,0,0);
- m_ptrDirect = (sptr_t)SendMessage(hwndEditor,SCI_GETDIRECTPOINTER,0,0);
- }
有了前面的SendEditor控制函数,我们就可以配置语法高亮了,下面这段代码可以使我们的Scintilla控件显示C++语法高亮代码:
const char* g_szKeywords=
"asm auto bool break case catch char class const "
"const_cast continue default delete do double "
"dynamic_cast else enum explicit extern false finally "
"float for friend goto if inline int long mutable "
"namespace new operator private protected public "
"register reinterpret_cast register return short signed "
"sizeof static static_cast struct switch template "
"this throw true try typedef typeid typename "
"union unsigned using virtual void volatile "
"wchar_t while";
...
SendEditor(SCI_SETLEXER, SCLEX_CPP); SendEditor(SCI_SETKEYWORDS, 0, (sptr_t)g_szKeywords);SendEditor(SCI_STYLESETFORE, SCE_C_WORD, 0x00FF0000); SendEditor(SCI_STYLESETFORE, SCE_C_STRING, 0x001515A3); SendEditor(SCI_STYLESETFORE, SCE_C_CHARACTER, 0x001515A3); SendEditor(SCI_STYLESETFORE, SCE_C_PREPROCESSOR, 0x00808080);SendEditor(SCI_STYLESETFORE, SCE_C_COMMENT, 0x00008000);SendEditor(SCI_STYLESETFORE, SCE_C_COMMENTLINE, 0x00008000);SendEditor(SCI_STYLESETFORE, SCE_C_COMMENTDOC, 0x00008000);
要支持语法高亮,要做三件事:
一、选定语法解析器
语法解析器用于把一大段代码分解成一个个的单词(token),另外还用于代码折叠的控制(后面会说到)。
选定语法解析器的命令是SCI_SETLEXER,如:
SendEditor(SCI_SETLEXER, SCLEX_CPP);
除了SCLEX_CPP以外,还有SCLEX_HTML、SCLEX_PERL、SCLEX_SQL、SCLEX_VB等一大堆,定 义在SciLexer.h里。现代的IDE应该可以定位SCLEX_CPP定义,它周围的SCLEX_XXX就是其它的语法解析器。
另外,也可以用SCI_SETLEXERLANGUAGE命令,如:
SendEditor(SCI_SETLEXERLANGUAGE, 0, (sptr_t)"cpp");
SCI_SETLEXERLANGUAGE接受的是一个字符串参数,这个字符串定义于代码解析器源代码(src\lex*.cxx) 最后面LexerModule开头的那行代码,那里的第三个参数就是。
二、设置关键字
语法解析只负责把代码拆分开,至于哪些是关键字,还得我们来指定。
这种方式带来了些许的灵活性,比如我们要高亮一种自定义的语言,这种语言的风格与C++类似(如Java、C#、php等),我们也 可以选定SCLEX_CPP作为语法解析器,然后定义自己的关键字。(所以不需要把各种解析器都编译进DLL文件里)
设置关键字的命令是SCI_SETKEYWORDS。它的wParam用于指定关键字种类,可以是0~8即9种类型,这样我们可以做 更细致的区分,如把关键字for if和int bool区分显示。lParam指定关键字,以空格分隔。
三、设置文本元素对应的字体风格
即字体、前景色、背景色、斜体粗体等
设置字体风格的命令以SCI_STYLE作为前缀,这组命令比较多,为了不浪费篇幅,偶这里只列举几个,其它的可以参考这里 (http://scintilla.sourceforge.net/ScintillaDoc.html#StyleDefinition)。
SCI_STYLESETBACK(int styleNumber, int colour) SCI_STYLESETFORE(int styleNumber, int colour) SCI_STYLESETFONT(int styleNumber, char *fontName) SCI_STYLESETSIZE(int styleNumber, int sizeInPoints)SCI_STYLESETBOLD(int styleNumber, bool bold)
这里的styleNumber是指文本元素,如关键字、行号、控制字串等。前面代码中的SCE_C_XXXX是C++解析器分解出的 语法相关的元素。另外还有STYLE_DEFAULT(默认)、STYLE_LINENUMBER(行号)、STYLE_BRACELIGHT(括号匹 配)、STYLE_BRACEBAD(括号失配)、STYLE_CONTROLCHAR(控制字符)、STYLE_INDENTGUIDE(缩进线)、 STYLE_CALLTIP(调用提示)。
SCI_STYLECLEARALL
Scintilla文档建议的顺序是先向STYLE_DEFAULT设置一些通用风格,然后再用SCI_STYLECLEARALL 把所有元素风格重置成与STYLE_DEFAULT一致,最后单独设置其它元素。
演示,我们的编辑器支持C++高亮啦!
- #include <Scintilla.h>
- #include <SciLexer.h>
- ...
- void TForm1::setCppStyle()
- {
- const char* szKeywords1=
- "asm auto break case catch class const "
- "const_cast continue default delete do double "
- "dynamic_cast else enum explicit extern false "
- "for friend goto if inline mutable "
- "namespace new operator private protected public "
- "register reinterpret_cast return signed "
- "sizeof static static_cast struct switch template "
- "this throw true try typedef typeid typename "
- "union unsigned using virtual volatile while";
- const char* szKeywords2=
- "bool char float int long short void wchar_t";
-
- SendEditor(SCI_STYLESETFONT, STYLE_DEFAULT,(sptr_t)"Courier New");
- SendEditor(SCI_STYLESETSIZE, STYLE_DEFAULT,10);
- SendEditor(SCI_STYLECLEARALL);
-
- SendEditor(SCI_SETLEXER, SCLEX_CPP);
- SendEditor(SCI_SETKEYWORDS, 0, (sptr_t)szKeywords1);
- SendEditor(SCI_SETKEYWORDS, 1, (sptr_t)szKeywords2);
-
- SendEditor(SCI_STYLESETFORE, SCE_C_WORD, 0x00FF0000);
- SendEditor(SCI_STYLESETFORE, SCE_C_WORD2, 0x00800080);
- SendEditor(SCI_STYLESETBOLD, SCE_C_WORD2, TRUE);
- SendEditor(SCI_STYLESETFORE, SCE_C_STRING, 0x001515A3);
- SendEditor(SCI_STYLESETFORE, SCE_C_CHARACTER, 0x001515A3);
- SendEditor(SCI_STYLESETFORE, SCE_C_PREPROCESSOR, 0x00808080);
- SendEditor(SCI_STYLESETFORE, SCE_C_COMMENT, 0x00008000);
- SendEditor(SCI_STYLESETFORE, SCE_C_COMMENTLINE, 0x00008000);
- SendEditor(SCI_STYLESETFORE, SCE_C_COMMENTDOC, 0x00008000);
-
- SendEditor(SCI_SETCARETLINEVISIBLE, TRUE);
- SendEditor(SCI_SETCARETLINEBACK, 0xb0ffff);
- }
-
- __fastcall TForm1::TForm1(TComponent* Owner)
- : TForm(Owner)
- {
- ...
- setCppStyle();
- }
看上去不错,如果你愿意,还可以加上当前行高亮功能:
SendEditor(SCI_SETCARETLINEVISIBLE, TRUE);
SendEditor(SCI_SETCARETLINEBACK, 0xb0ffff);
最后,建议把TAB宽度由默认的8改为4(依个人习惯~~)
SendEditor(SCI_SETTABWIDTH, 4);
现在,我们的成果是这样的:
相关推荐
一个超强大的源程序编辑器控件,支持多种平台,支持语法高亮,著名的NotePad++就是基于这个编辑器控件开发的。 你也想让自己的程序拥有一个强大的编辑器么? 那么试试这个吧,绝对不会让你失望。
包括语法高亮显示,错误指示,代码自动完成以及代码提示等。而且在左边的空白处(margin),可以显示调试代码中非常有用的显示断点以及显示当前运行行等功能。而且,自定义风格的功能比其他大部分编辑器控件都开放,它...
License for Scintilla and SciTE Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org> All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation ...
SciTE 是个开源的优秀且小巧功能强大的编辑器!它支持代码高亮、自动完成、代码折叠、括号匹配、自定义模块等!...还可以自己定义语言,并为自己的语言设置语法高亮。 像vc vs中的代码折叠也是支持的。
是源代码,使用请参考: http://blog.chinaunix.net/uid-24517893-id-3014393.html
支持语法高亮显示、代码折叠、括号匹配、自动换行、行数标记、搜索替换、缩放字体、设置语法高亮规则,它可以同时编辑多种文件类型,多个文档该程序是基于MFC开发的多文档应用程序,使用了开源控件Scintilla。
多文档语法高亮编辑器[MDIEditorusingScintilla.rar]-精品源代码
scintilla 1.77的MFC封装源码,含实例Demo,附带VC8的工程。
文本编辑器的 AutoHotkey 语法高亮 一组链接和脚本,用于为各种文本编辑器设置。 此 GitHub 存储库尝试维护 AutoHotkey“基本”安装程序中曾经包含的关键字、函数、变量、指令、命令和键的当前版本。 通过让安装...
包括语法高亮显示,错误指示,代码自动完成以及代码提示等。而且在左边的空白处(margin),可以显示调试代码中非常有用的显示断点以及显示当前运行行等功能。而且,自定义风格的功能比其他大部分编辑器控件都开放,它...
使 Scintilla 项目(语法高亮编辑器控件)与 Delphi/C++ Builder 一起使用变得容易的组件,定义您自己的语言,包括基于 SciLexer.Dll 中的(50 多个)词法分析器的样式/关键字等。 自动完成等
wSciTe 编辑器,支持语法高亮,标签折叠,GBK+UTF
mod相比的变化: 支持书签标记一个词或选择的所有出现的选项,并显示匹配的计数增强了单词和函数的自动完成功能某些单词的基于上下文的自动完成增强的自动缩进大括号、方括号和引号的自动完成语法高亮、代码折叠和 ...
SciTE 绿色小巧,多标签界面,支持40多种语法高亮及高亮导出、代码折叠、自动完成、编译运行等功能,高度可定制性,很好用。 缺点是,SciTE 在设置好中文编码后的 Tab 距离无法精确等于两个汉字的间距;打开大型文件...
Scintilla是一个免费、跨平台、支持语法高亮的编辑控件。它完整支持源代码的编辑和调试,包括语法高亮、错误指示、代码完成(code completion)和调用提示(call tips)。能包含标记(marker)的页边(margin)可用于...
Scintilla是一个免费、跨平台、支持语法高亮的编辑控件。它完整支持源代码的编辑和调试,包括语法高亮、错误指示、代码完成(code completion)和调用提示(call tips)。能包含标记(marker)的页边(margin)可用于...
Notepad3是一个免费的高级文本编辑器,它是基于著名的Scintilla开发的,拥有语法高亮,支持大小写转换,高亮显示选中的行等额外功能,支持多种不同格式的文本编码,包括UTF-8、UTF-16、ansi等。
语法高亮显示,代码折叠和API列表(请参见内置): 纯文本 适用于ActionScript 3和4。 Android Smali, Java程序 茉莉 ANSI艺术 参数化设计语言 汇编器 MASM GNU汇编器 美国宇航局 渐近线矢量图形语言 AutoIt脚本 ,...
一款很好用的编辑器,支持众多的脚本,比如C、C++、...较其它同重量级软件,最耀眼的就是导出功能,可以导出PDF/HTML/RTF/XML/LaTex类型的文件,直接就能将语法高亮的内容导出。 官方网址:http://www.scintilla.org