Scinilla相关的库下载,比如wxScintilla, Code::Blocks 也为此底此

http://www.cnblogs.com/superanyi/archive/2011/04/07/2008632.html

Scintilla开源库使用指南(一)

Scintilla是一个免费、跨平台、支持语法高
亮的编纂控件。它完全支持源代码的编撰和调试,包括语法高亮、错误指示、代码完成(code completion)和调用提示(call tips)。
能包含标记(marker)的页边(margin)可用于标记断点、折叠和高亮时行。

Scintilla是一个免费、跨平台、支持语法高亮的编写控件。它整体支持源代码的编制和调剂,包括语法高亮、错误指示、代码完成
(code completion)和调用提示(call
tips)。能包含标记(marker)的页边(margin)可用来标记断点、折叠和高亮时推行。

足于这边下载Scintilla库:http://scintilla.sourceforge.net/ScintillaDownload.html

这里产生Scinilla相关的库下载,比如wxScintilla就是Scintilla的wxWidgets移植版。http://www.scintilla.org/ScintillaRelated.html

另外,Scintilla的撰稿人为演示这个东东底效应,编写了一个被SciTE的以身作则程序。不过此顺序的意义就强大到可当自己
们的常用代码编辑器,很值得下载下来读深造。

常规,还是打编译说由

偶只在Windows下编译过,所以只好说说Windows环境下的编译方法。对于Linux,没试了(丢人-_-)

下载、解压略过不取

率先登scintilla的win32目:

cd scintilla\win32
  • 对于mingw,输入:

    mingw32-make
    
  • 于VC6以上版本,输入:

    nmake -f scintilla.mak
    
  • 对于VC6(没尝试过,从Readme里看来的),输入:

    nmake -f scintilla_vc6.mak
    
  • 对于C++Builder,输入:

    make -fscintilla.mak
    

编译完成后,在bin目录里会落Scintilla.dll和SciLexer.dll文件,SciLexer.dll是带有了语法解析器
(Lexer)的Scintilla控件,一般的话我们只要用它们便可以了。

要验证的凡,不管是为此啊编译器生成的DLL文件,都好供其它编译器使用(就象系统DLL一样,任何编译器都能够利用),所以并非也各种编译器都编译
一份。

设若当变化的SciLexer.dll太要命的言辞,可以考虑去自带的一部分语法解析器。比如你打算只所以她来高亮C++代码的话,可以:

  1. 向前到src目录里,移除除LexCPP.cxx以外的享有Lex*.cxx文件
  2. 实践LexGen.py重建make文件与KeyWords.cxx文件(需要装Python)。
  3. 再次以前面的法门编译,这样很成的SciLexer.dll就单纯包含C++语法解析器了,体积也大小减多少了(我VC编译的结果是从1.4M减小到
    206K)。

启用Scintilla作为编纂控件

使启用Scintilla,首先当然是一旦加载之前编译的DLL文件啦~~

::LoadLibrary(_T("SciLexer.dll"));

SciLexer.dll加载后会活动为”Scintilla”作为类名注册一个窗体类,我们设直接用之类名建立窗体就可了:

::CreateWindow(_T("Scintilla"),...);

演示(在C++Builder下编写)

由Scintilla主要是窗体操作,为了减小非必要之窗体代码(主要是偷懒外加推广一下C++Builder,呵呵),这里用C++Builder
来形容演示程序。对于有C++Builder的VCL库特有的东东,后面会有讲的。

首先新建一个窗体应用程序,

然后在WinMain里载入SciLexer.dll:

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    LoadLibrary(_T("SciLexer.dll"));
    ...

终极,在TForm1的组织里成立Scintilla窗体:

#define SCINT_ID 1010

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    ::CreateWindow(_T("Scintilla"),
        NULL, WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_VISIBLE,
        0,0,ClientWidth,ClientHeight,
        Handle,
        (HMENU)SCINT_ID, HInstance, NULL);
}

挺粗略,是吧?对于Scintilla来说,没什么好讲的了。

此间根本让莫了解C++Builder的童鞋介绍一下VCL的东东,以便让对接下的教学与代码阅读(以及移植到任何编译器中)。

  • TForm1是一个C++Builder自动生成的窗体类,它继续自TForm,可以将她看做是WS_OVERLAPPEDWINDOW风格的HWND的
    封装。
  • ClientWidth和ClientHeight是TForm的性,看名字就是了解它是客户区(ClientRect)的丰厚和强
  • Handle也是TForm的特性,就是欠窗体的HWND
  • HInstance不用解释了咔嚓,这是VCL的一个全局变量。

本,我们的收获是如此的:

C++ 1

今日,看上去还比土,接下我们开始部署它,为而其成可及VS媲美的代码编程器而战!

安排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:    // IDE-managed Components
private:    // User declarations
    SciFnDirect m_fnDirect;
    sptr_t m_ptrDirect;
public:        // User declarations
    __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);
}

 

于Scintilla支持语法高亮

出矣前头的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); //C++ 语法解析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用于指定要字C++路,可以是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 //把所有文本元素设置成与STYLE_DEFAULT相同的风格

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);
    //C++语法解析
    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);

当今,我们的结晶是这么的:

C++ 2