[PyKDE] QScintilla Lexers

Phil Thompson phil at riverbankcomputing.co.uk
Tue Jan 11 09:22:21 GMT 2005


> Thanks for your reply.
>
> On Monday 10 Jan 2005 10:27, you wrote:
>> QScintilla is a port of Scintilla, not an enhancement of it. If there
>> are
>> issues with how well lexers work (or if you want a new lexer) then these
>> should be fixed in Scintilla itself and they will then appear in
>> QScintilla.
>
> Okay - I'll try the Scintilla mailing list on these issues.
>
>> > The real point of all this is to introduce a couple proposals for
>> > improving the lexers in QScintilla. The first one is obvious: make
>> > QextScintillaLexer Python-friendly so it can be fully sub-classed.
>>
>> It's not clear from your explanation exactly what the problem is. Can
>> you
>> give some specific examples?
>>
>> Phil
>
> If I was writing a Qt app in C++ which used QScintilla, I could just go
> ahead
> and sub-class QextScintillaLexer without any problems. But because I'm a
> Python programmer using QScintilla via PyQt, I can't.

Call me stupid, but I still don't understand the problem.

> To make the Python problems explicit in code, here's how I might set a
> lexer
> language using QScintilla's low-level API:
>
> 	qsb.SendScintilla(qsb.SCI_SETLEXERLANGUAGE, QString('perl').latin1())
>
> This works because QString can pass a const char* to the function even
> though
> Python can't do it itself.

Pardon? What's wrong with...

    qsb.SendScintilla(qsb.SCI_SETLEXERLANGUAGE, 'perl')

...?

> Here's the same thing from the C++ source code for
> QextScintilla.setLexer():
>
> 	SendScintilla(SCI_SETLEXERLANGUAGE, lex -> lexer());
>
> Now if 'lex' is a Python sub-class of QextScintillaLexer that I have
> passed to
> setLexer(), I can't pull the QString trick any more. And since Python
> functions can't return const char*, whenever lex.lexer() gets called all
> I'll
> see is a segmentation fault.

You mean you actually see a segmentation fault, or your understanding
suggests that you will get a segmentation fault?

> There are two reasons why I'm bothering with any of this. The first is
> because
> I want to set custom keyword lists. This would allow me to, say, provide
> HTML
> syntax highlighting to suit different browsers or different versions of
> the
> w3c standards. The second is to access more of Scintilla's 60 lexers by
> creating my own lexer classes. (I assume QScintilla won't be implementing
> classes for all 50 of the remaining lexers any time soon...)

Implementations of lexers in the high-level API are added on request. Let
me know which ones you need.

> I can partially achieve both these things using the low-level API, but
> this
> entails needlessly duplicating a whole load of code which has already been
> done better by QScintilla. As I say, if I could only sub-class
> QextScintillaLexer in Python, all these problems would go away.

If you are expecting to change the behaviour of the underlying Scintilla
lexer by subclassing then you are going to be disappointed - Scintilla
just isn't designed like that. (Scintilla is really a C program written in
C++.)

Phil




More information about the PyQt mailing list