luaforwindows/SciTE/docs/SciTEExternalLexer.html

48 lines
2.6 KiB
HTML
Executable File

<body bgcolor="#FFFFFF" text="#000000">
<table bgcolor="#000000" width="100%" cellspacing="0" cellpadding="0" border="0" id="table1">
<tr>
<td>
<img src="SciTEIco.png" border="3" height="64" width="64" alt="Scintilla icon" />
</td>
<td>
<a href="index.html" style="color:white;text-decoration:none"><font size="5">
Add an external lexer to SciTE</font></a>
</td>
</tr>
</table>
<h2>
Lexer addition.
</h2>
<p>This document assumes you know how to create a lexer.&nbsp; It only
covers information specific to making the changes necessary for that
lexer to work as an external lexer.</p>
<p>The lexer must export 4 functions (On Windows, it is necessary to create a
module definition file to export the symbols correctly).&nbsp; Below are the
proto-types for those functions (ExternalLexer.h must be included so that
EXT_LEXER_DECL can be resolved):</p>
<p>void EXT_LEXER_DECL Lex(unsigned int lexer, unsigned int startPos, int
length, int initStyle, char *words[],<br>
&nbsp;&nbsp;&nbsp; WindowID window, char *props);<br>
int EXT_LEXER_DECL GetLexerCount();<br>
void EXT_LEXER_DECL GetLexerName(unsigned int Index, char *name, int buflength);<br>
void EXT_LEXER_DECL Fold(unsigned int lexer, unsigned int startPos, int length,
int initStyle, char *words[],<br>
&nbsp;&nbsp;&nbsp; WindowID window, char *props);</p>
<p>Lex - This function is called whenever lexing needs to be done.&nbsp; The
first thing you may notice is the lack of an Accessor object to style with.&nbsp;
A WindowAccessor object can be created from the WindowID and props objects.&nbsp;
A PropSet object must be created from props, first, then that PropSet and the
WindowID are used to create a WindowAccessor.&nbsp; You will also need to create
your own WordList.&nbsp; (The last row in the words array is a NULL pointer, so
you can safely read 1 past the last row to determine how many rows there are).&nbsp;
Once you have the WordList and Accessor, you can pass them to your lexing
function just like using a built-in lexer.&nbsp; The only other difference is
you need to call Accessor::Flush() sometime before Lex returns, or not all text
may be updated.&nbsp; This is due to Scintilla's buffering.</p>
<p>GetLexerCount - This returns the number of individual lexers you want to
export from your module.</p>
<p>GetLexerName - Fill in the name field with the name of the lexer.&nbsp; This
is how it is later identified in SciTE properties.</p>
<p>Fold - The function called whenever SciTE requests folding be performed.&nbsp;
The same information found in Lex for creating a WindowAccessor apply here, too.</p>