Perl language syntax highlighting troubles (bug or limitation ?)
-
Don’t bother too much w/ my pb, concentrate on your job
:-) That’s for sure - we are allowed to surf the web as long as work related stuff is
priority 1 and we take this very seriously.bit confused.
Actually me too.
If you don’t mind - would you try to do the following.- Restart npp (Only one single instance should run)
- Click Plugins->PythonScript->Show Console
- Click Plugins->PythonScript->Scripts->NAME_OF_YOUR_SCRIPT
-> check if there is an error reported in the console, if so - stop here and post it
If no error has been written to console - Open a perl file or a new file and change the language to PERL and put some code in it
-> check if there is an error reported in the console, if so - stop here and post it
If no error has been written to console
execute the following in the console run edit box
editor.getLexer()
Does it return 6 as specified in the script (
BUILTIN_LEXER_ID = 6
)?
If it does, execute the following in the console run edit boxEnhanceBuiltinLexer
What does it return?
-
-
restarted NPP, only one instance: checked
-
python console:
Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)]
Initialisation took 109ms
Ready. -
Plugins/PythonScript/Scripts->EnhancePerlLexer.py: checked. Result: NOTHING in the console, no error but no confirmation that the py script as run either, is it normal?
-
Opened a new window, made it Perl syntaxing. . Did not do it. Here is the code for the colors in your script that I modified:
regexes[(1, 5)] = (r’\bq[rwqx]{0,1}\b([^\h]).?\1|(\bq[rwqx]{0,1}\b\h+(\w).?\3)', [0])
regexes[(2, 5)] = (r’\bq[rwqx]{0,1}\b\h*((.+?)|[.+?]|{.+?})', [0])
own defined color and non-default match group(s) used
regexes[(1, (0,0,0))] = (r’\bq[rwqx]{0,1}\b([^\h]).?\1|(\bq[rwqx]{0,1}\b\h+(\w).?\3)‘, [0])
regexes[(2, (0,0,0))] = (r’\bq[rwqx]{0,1}\b\h*((.+?)|[.+?]|{.+?})‘, [0])
regexes[(3, (0,0,0))] = (r’(?s)((<<)"(\w+?)";.?\3)‘, [2])
regexes[(4, (128,128,128))] = (r’(?s)((<<)\h+“(\w+?)”;.?\3)', [2,3])
Executed
editor.getLexer()
, got a return of 1; executedEnhanceBuiltinLexer
, results:Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)] Initialisation took 125ms Ready. >>> editor.getLexer() 1 >>> EnhanceBuiltinLexer <class '__main__.EnhanceBuiltinLexer'>
Seems that I get the wrong return code… don’t I ?
-
-
Seems that I get the wrong return code… don’t I ?
Indeed - would you mind executing the following in the console run edit box?
editor.getLexerLanguage()
no error but no confirmation that the py script as run either, is it normal?
yes.
-
I get 1 returned if the language is set to Normal Text.
Sorry for asking, but sure you have set the language to Perl? -
>>> editor.getLexerLanguage() 'perl'
Would it be (more) convenient for you to connect directly on my machine ? (DWservice) ?
-
Could it be that you have two views open, one with a perl document and one with a normal text document?
-
I have many documents opened in different Windows ([edited]TABS). Is this what you mean by “views” ?
No double Windows at a time like in “compare” or so.
-
No double Windows at a time like in “compare” or so.
Ok, then it seems we have learned that the id is not always the same.
Gimme a second to see what needs to be changed to useeditor.getLexerLanguage()
instead. -
all right, take your time.
i’ll be there late tonight.about DWservice, it’s GNU, hosted in DE I guess, not smthg like Teamviewer. But perhaps you are right, one should always be paranoiac.
-
I’m living in DE but have to admit, that I haven’t heard of DWservice before, shame on me :-)
Changes
line 9 toBUILTIN_LEXER = 'perl'
line 111self.lexer_name = BUILTIN_LEXER.lower()
line 219 toself.doc_is_of_interest = True if editor.getLexerLanguage().lower() == self.lexer_name else False
As python is very picky about whitespaces make sure that you either use
spaces or tabs for indentation only. Best python practice is to set
Settings->Preferences->Language->TabSettings->Python
Tab size = 4 and check replace by space checkbox
(if this isn’t your default setting, of course) -
Oops, I must have made some mistakes but can’t find where… Here is the console log:
Traceback (most recent call last): File "C:\Users\gm\AppData\Roaming\Notepad++\plugins\Config\PythonScript\scripts\startup.py", line 1, in <module> import EnhancePerlLexer File "C:\Users\gm\AppData\Roaming\Notepad++\plugins\Config\PythonScript\scripts\EnhancePerlLexer.py", line 283, in <module> EnhanceBuiltinLexer().main() File "C:\Users\gm\AppData\Roaming\Notepad++\plugins\Config\PythonScript\scripts\EnhancePerlLexer.py", line 280, in main self.on_bufferactivated(None) File "C:\Users\gm\AppData\Roaming\Notepad++\plugins\Config\PythonScript\scripts\EnhancePerlLexer.py", line 237, in on_bufferactivated self.check_lexer() File "C:\Users\gm\AppData\Roaming\Notepad++\plugins\Config\PythonScript\scripts\EnhancePerlLexer.py", line 224, in check_lexer self.doc_is_of_interest = True if editor.getLexerLanguage().lower() == self.lexer_name else False AttributeError: 'EnhanceBuiltinLexer' object has no attribute 'lexer_name' Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)] Initialisation took 343ms Ready. Traceback (most recent call last): File "C:\Users\gm\AppData\Roaming\Notepad++\plugins\Config\PythonScript\scripts\EnhancePerlLexer.py", line 73, in <module> EnhanceBuiltinLexer().main() File "C:\Users\gm\AppData\Roaming\Notepad++\plugins\Config\PythonScript\scripts\EnhancePerlLexer.py", line 280, in main self.on_bufferactivated(None) File "C:\Users\gm\AppData\Roaming\Notepad++\plugins\Config\PythonScript\scripts\EnhancePerlLexer.py", line 237, in on_bufferactivated self.check_lexer() File "C:\Users\gm\AppData\Roaming\Notepad++\plugins\Config\PythonScript\scripts\EnhancePerlLexer.py", line 224, in check_lexer self.doc_is_of_interest = True if editor.getLexerLanguage().lower() == self.lexer_name else False AttributeError: 'EnhanceBuiltinLexer' object has no attribute 'lexer_name'
Line numbers don’t match because I already commented out some of your lines but kept them in the file, and duplicated them with my own changes. But I did do the changes at the places you told me to do them.
-
check line 111 - it defines the lexer_name
-
OOPS, yours :== self.lexer_name, mine :== self_lexer_name, I am really a dumb when dealing with OO programming, can’t realize that ‘self’ is the current object and of course separated by a dot.
Colour has changed for q* keywords and there text (black on dark blue, can’t read but now just need to ajust the colors).
No change for here docs, but don’t know if I properly set the colors, have to check.Send you a screen copy in a few minutes.
-
All right, nearly done: with the following regexp in your python code:
regexes[(1, (255,0,128))] = (r'\bq[rwqx]{0,1}\b([^\h]).*?\1|(\bq[rwqx]{0,1}\b\h+(\w).*?\3)', [0]) regexes[(2, (255,0,128))] = (r'\bq[rwqx]{0,1}\b\h*(\(.+?\)|\[.+?\]|\{.+?\})', [0]) regexes[(3, (0,0,0))] = (r'(?s)((<<)"*(\w+?)"*;.*?\3)', [2]) regexes[(4, (0,0,0))] = (r'(?s)((<<)\h+"(\w+?)";.*?\3)', [2,3])
I get the following colors:
Q* colors are good {well I might have an uggly taste in colors but at least they match ;-)) }
Would you have any clue about why the here docs= are still not handled properly ? They should be black, I think.
-
the regexes assumes double quotes and semicolon directly attached to EOT.
Likeprint << "EOT"; --------------------- separation line ------------------ EOT
Is there a rule how this is specified?
-
I think I found why.
Your regexp says :
r'(?s)((<<)"*(\w+?)"*;.*?\3)'
would not it be better if :
r'(?s)(\h*(<<)\h*"*(\w+?)"*\h*;.*?\3)'
???
To answer your question:
Perl allows
- <<TEXT,
- << TEXT
- <<‘TEXT’ / << ‘TEXT’
- <<“TEXT” / << “TEXT”
meanings differ in each case…
-
To be honest - I’m not a regex expert at all :-D
If you, as a perl developer, say so I would absolutely believe it is :-) -
In your Python regexp, what’s the meaning of:
- “\3”
- “, [2]” and “[2,3]” ?
If I can understand what I think I could translate a Perl regex code into python (for this case at least).
-
What about using this
(?s)((<<)\h+(["|'])(\w+?)\3\h*;.*?\4)
-
- is the boost:regex convention to denote match group 3
and - defines which match group actually should be painted
Like if you have:
r'(word1)(word2)(word3)', [2,3]
would mean that only word2 and word3 would be painted
whereas if you would specifyr'(word1)(word2)(word3)', [0]
everything would be colored.
Does this makes sense to you?
- is the boost:regex convention to denote match group 3