QScintilla: how to create a new lexer or modify an existing one?
I find the default lexer for C++ highlighting not very specific enough.
I want to at least be able to specify a different color for:
type keyword (void, int, float etc) instruction keyword (if while do return for etc) class-related keyword (template class virtual friend) type modifiers keywords (static const extern unsigned etc)
I found this in the LexerCPP source:
const char *QsciLexerCPX::keywords(int set) const
{
if (set == 1)
return
"and and_eq asm auto bitand bitor bool break case "
"catch char class compl const const_cast continue "
"default delete do double dynamic_cast else enum "
"explicit export extern false float for friend goto if "
"inline int long mutable namespace new not not_eq "
"operator or or_eq private protected public register "
"reinterpret_cast 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 xor xor_eq";
if (set == 3)
return
"a addindex addtogroup anchor arg attention author b "
"brief bug c class code date def defgroup deprecated "
"dontinclude e em endcode endhtmlonly end开发者_如何学编程if "
"endlatexonly endlink endverbatim enum example "
"exception f$ f[ f] file fn hideinitializer "
"htmlinclude htmlonly if image include ingroup "
"internal invariant interface latexonly li line link "
"mainpage name namespace nosubgrouping note overload "
"p page par param post pre ref relates remarks return "
"retval sa section see showinitializer since skip "
"skipline struct subsection test throw todo typedef "
"union until var verbatim verbinclude version warning "
"weakgroup $ @ \\ & < > # { }";
etc
I tried this - Copy/paste the qscilexercpp.cpp to a new file name qscilexercxx.cpp - replace the code above by a switch with an appropriate switch:
switch(set)
{
case Oper:
//operators
return
"and and_eq bitand bitor "
"catch compl const_cast "
"delete dynamic_cast "
"new not not_eq "
"operator or or_eq "
"reinterpret_cast sizeof "
"static_cast throw "
"try typeid typename "
"xor xor_eq";
case BaseType:
// basic types
return
"bool char double enum float int long "
"short struct union void wchar_t";
case ClassRelated:
// class/template-related
return
"class inline friend private protected public "
"template this virtual";
case Misc:
// misc
return
"asm namespace typedef using";
case Modifiers:
// type modifiers
return
"auto const explicit extern mutable register "
"signed static unsigned volatile";
case Instruct:
return
"break case continue default do else "
"for goto if return switch while";
}
After creating the appropriate enum:
Oper = 20,
BaseType = 21,
ClassRelated = 22,
Misc = 23,
Modifiers = 24,
Instruct = 25
At the end of the existing ones.
Now most of my text is black, and I'm pretty sure I missed something about the link between the enum and the char array of keywords returned...
Can somebody direct me to something or help me ?
精彩评论