• Login
Community
  • Login

Perl language syntax highlighting troubles (bug or limitation ?)

Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
112 Posts 6 Posters 44.1k Views
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • G
    Gilles Maisonneuve
    last edited by Mar 19, 2019, 8:39 PM

    1. restarted NPP, only one instance: checked

    2. 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.

    3. 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?

    4. Opened a new window, made it Perl syntaxing. See screen copy for colors. 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; executed EnhanceBuiltinLexer, 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 ?

    E 2 Replies Last reply Mar 19, 2019, 8:44 PM Reply Quote 2
    • E
      Ekopalypse @Gilles Maisonneuve
      last edited by Mar 19, 2019, 8:44 PM

      @Gilles-Maisonneuve

      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.

      G 1 Reply Last reply Mar 19, 2019, 8:56 PM Reply Quote 2
      • E
        Ekopalypse @Gilles Maisonneuve
        last edited by Mar 19, 2019, 8:53 PM

        @Gilles-Maisonneuve

        I get 1 returned if the language is set to Normal Text.
        Sorry for asking, but sure you have set the language to Perl?

        1 Reply Last reply Reply Quote 1
        • G
          Gilles Maisonneuve @Ekopalypse
          last edited by Gilles Maisonneuve Mar 19, 2019, 8:58 PM Mar 19, 2019, 8:56 PM

          @Ekopalypse

          >>> editor.getLexerLanguage()
          'perl'
          

          Would it be (more) convenient for you to connect directly on my machine ? (DWservice) ?

          E 1 Reply Last reply Mar 19, 2019, 8:58 PM Reply Quote 0
          • E
            Ekopalypse @Gilles Maisonneuve
            last edited by Mar 19, 2019, 8:58 PM

            @Gilles-Maisonneuve

            Could it be that you have two views open, one with a perl document and one with a normal text document?

            1 Reply Last reply Reply Quote 0
            • G
              Gilles Maisonneuve
              last edited by Gilles Maisonneuve Mar 19, 2019, 9:01 PM Mar 19, 2019, 9:00 PM

              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.

              E 1 Reply Last reply Mar 19, 2019, 9:07 PM Reply Quote 1
              • E
                Ekopalypse @Gilles Maisonneuve
                last edited by Mar 19, 2019, 9:07 PM

                @Gilles-Maisonneuve

                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 use editor.getLexerLanguage() instead.

                1 Reply Last reply Reply Quote 2
                • G
                  Gilles Maisonneuve
                  last edited by Gilles Maisonneuve Mar 19, 2019, 9:09 PM Mar 19, 2019, 9:08 PM

                  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.

                  E 1 Reply Last reply Mar 19, 2019, 9:22 PM Reply Quote 0
                  • E
                    Ekopalypse @Gilles Maisonneuve
                    last edited by Mar 19, 2019, 9:22 PM

                    @Gilles-Maisonneuve

                    I’m living in DE but have to admit, that I haven’t heard of DWservice before, shame on me :-)

                    Changes
                    line 9 to BUILTIN_LEXER = 'perl'
                    line 111 self.lexer_name = BUILTIN_LEXER.lower()
                    line 219 to self.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)

                    G 1 Reply Last reply Mar 19, 2019, 9:55 PM Reply Quote 2
                    • G
                      Gilles Maisonneuve @Ekopalypse
                      last edited by Gilles Maisonneuve Mar 19, 2019, 9:57 PM Mar 19, 2019, 9:55 PM

                      @Ekopalypse

                      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.

                      E 1 Reply Last reply Mar 19, 2019, 9:57 PM Reply Quote 1
                      • E
                        Ekopalypse @Gilles Maisonneuve
                        last edited by Mar 19, 2019, 9:57 PM

                        @Gilles-Maisonneuve

                        check line 111 - it defines the lexer_name

                        G 1 Reply Last reply Mar 19, 2019, 10:28 PM Reply Quote 2
                        • G
                          Gilles Maisonneuve
                          last edited by Mar 19, 2019, 10:02 PM

                          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.

                          1 Reply Last reply Reply Quote 2
                          • G
                            Gilles Maisonneuve @Ekopalypse
                            last edited by Gilles Maisonneuve Mar 19, 2019, 10:30 PM Mar 19, 2019, 10:28 PM

                            @Ekopalypse

                            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 OK, here docs no

                            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.

                            E 1 Reply Last reply Mar 19, 2019, 10:35 PM Reply Quote 2
                            • E
                              Ekopalypse @Gilles Maisonneuve
                              last edited by Mar 19, 2019, 10:35 PM

                              @Gilles-Maisonneuve

                              the regexes assumes double quotes and semicolon directly attached to EOT.
                              Like

                              print << "EOT";
                              
                              --------------------- separation line ------------------
                              
                              EOT
                              

                              Is there a rule how this is specified?

                              1 Reply Last reply Reply Quote 2
                              • G
                                Gilles Maisonneuve
                                last edited by Gilles Maisonneuve Mar 19, 2019, 10:38 PM Mar 19, 2019, 10:36 PM

                                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

                                1. <<TEXT,
                                2. << TEXT
                                3. <<‘TEXT’ / << ‘TEXT’
                                4. <<“TEXT” / << “TEXT”

                                meanings differ in each case…

                                1 Reply Last reply Reply Quote 2
                                • E
                                  Ekopalypse
                                  last edited by Mar 19, 2019, 10:39 PM

                                  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 :-)

                                  G 1 Reply Last reply Mar 19, 2019, 10:42 PM Reply Quote 1
                                  • G
                                    Gilles Maisonneuve @Ekopalypse
                                    last edited by Mar 19, 2019, 10:42 PM

                                    @Ekopalypse

                                    In your Python regexp, what’s the meaning of:

                                    1. “\3”
                                    2. “, [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).

                                    1 Reply Last reply Reply Quote 0
                                    • E
                                      Ekopalypse
                                      last edited by Mar 19, 2019, 10:42 PM

                                      What about using this
                                      (?s)((<<)\h+(["|'])(\w+?)\3\h*;.*?\4)

                                      G 1 Reply Last reply Mar 19, 2019, 10:48 PM Reply Quote 0
                                      • E
                                        Ekopalypse
                                        last edited by Mar 19, 2019, 10:48 PM

                                        1. is the boost:regex convention to denote match group 3
                                          and
                                        2. 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 specify

                                        r'(word1)(word2)(word3)', [0]
                                        

                                        everything would be colored.

                                        Does this makes sense to you?

                                        G 1 Reply Last reply Mar 19, 2019, 10:55 PM Reply Quote 0
                                        • G
                                          Gilles Maisonneuve @Ekopalypse
                                          last edited by Mar 19, 2019, 10:48 PM

                                          @Ekopalypse

                                          I don’t understand your regexp syntax. Perhaps too ‘pythonized’ for me.

                                          (?s) : what does it mean ? is it ‘s///’ ? or really a non capturing group of ‘s’ ???
                                          \3 \4 : are they $3 $4, I don’t think as I can’t see a 4th accumulator

                                          1 Reply Last reply Reply Quote 0
                                          53 out of 112
                                          • First post
                                            53/112
                                            Last post
                                          The Community of users of the Notepad++ text editor.
                                          Powered by NodeBB | Contributors