Community
    • Login

    Python Script plugin: script to tell the cursor to highlight the result and everything before it up to ">"

    Scheduled Pinned Locked Moved Notepad++ & Plugin Development
    15 Posts 5 Posters 5.0k Views 2 Watching
    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.
    • .jean luc borla. Offline
      .jean luc borla @PeterJones
      last edited by .jean luc borla

      @PeterJones said
      "Unless you mean you want to select from the > on one line to the 585543 that comes next, something like this:
      491c8c52-53be-43ab-ba75-bcdbf28651ac-image.png

      Yes it’s that
      culd you provide the complete code to do that ?

      1 Reply Last reply Reply Quote 0
      • .jean luc borla. Offline
        .jean luc borla @PeterJones
        last edited by

        @PeterJones

        Thanks,

        I have tried but there is an error

        File “<console>”, line 1
        z = editor.findText(FINDOPTION.REGEXP, 0, editor.getLength(), r’ (?s)>.*585543’) if Z is not None: editor.setSel(*z)
        ^
        SyntaxError: invalid syntax

        1 Reply Last reply Reply Quote 0
        • .jean luc borla. Offline
          .jean luc borla @Alan Kilborn
          last edited by

          @Alan-Kilborn

          I tried but there is an error:

          File “<console>”, line 1
          z = editor.findText(FINDOPTION.REGEXP, 0, editor.getLength(), r’ (?s)>.*585543’) if Z is not None: editor.setSel(*z)
          ^
          SyntaxError: invalid syntax

          PeterJonesP 1 Reply Last reply Reply Quote 0
          • PeterJonesP Offline
            PeterJones @.jean luc borla
            last edited by

            @jean-luc-borla said,

            SyntaxError: invalid syntax

            You put both commands on the same line. Python (and thus the PythonScript plugin) doesn’t work that way.

            z = editor.findText(FINDOPTION.REGEXP, 0, editor.getLength(), r'(?s)>.*585543')
            if z is not None: editor.setSel(*z)
            

            This works. Well, mostly. The regex is too greedy.
            470b3d1d-a338-4ac3-9221-a2998a412f88-image.png

            Change it to be less greedy:

            z = editor.findText(FINDOPTION.REGEXP, 0, editor.getLength(), r'(?s)>.*?585543')
            if z is not None: editor.setSel(*z)
            

            1eb0be69-4525-4842-931b-7901cd3bcb30-image.png

            Alan KilbornA 4SHAKEN4 2 Replies Last reply Reply Quote 0
            • Alan KilbornA Offline
              Alan Kilborn @PeterJones
              last edited by

              My response was going to be: “We can’t teach basic Python here”

              1 Reply Last reply Reply Quote 2
              • 4SHAKEN4 Offline
                4SHAKEN @PeterJones
                last edited by PeterJones

                @PeterJones

                Hello!
                This thread has been very helpful and got me out of a rut I was in, so thank you very much!

                How would you determine how many “matches” are in z? I like to output it to console as shown below…

                console.write('Searching for matches...\n')
                z = editor.findText(FINDOPTION.REGEXP, 0, editor.getLength(), my_search_variable)
                if z is not None:
                    editor.gotoLine(editor.lineFromPosition(z[0])+20)    
                    editor.setSel(*z)
                    console.write('Search Completed - found XXX matches which are highlighted\n')
                else:
                    console.write('Search Completed.  No matches found.\n')
                

                -–

                moderator added code markdown around text; please don’t forget to use the </> button to mark example text as “code” so that characters don’t get changed by the forum

                Alan KilbornA 1 Reply Last reply Reply Quote 0
                • Alan KilbornA Offline
                  Alan Kilborn @4SHAKEN
                  last edited by Alan Kilborn

                  @4SHAKEN said :

                  z = editor.findText(FINDOPTION.REGEXP, 0, editor.getLength(), my_search_variable)

                  How would you determine how many “matches” are in z?

                  Um…well, one, at most. The documentation for editor.findText() in PythonScript is lacking, unfortunately; here’s what I’ve discovered about it over time:

                  Here’s how to interpret the return value from z = editor.findText(...):

                  Result Meaning
                  z is None no match was found
                  z is a 2-tuple where z[0] == -2 regular expression in my_search_variable is either invalid or the regex engine had a failure in conducting the search
                  z is a 2-tuple where z[0] != -2 one match, at the position range indicated by the tuple, i.e., at positions z[0] through z[1] in the document

                  Bonus (because it came to mind based on what you’re asking about, and what I’ve said above):

                  If you need to validate the regex in my_search_variable, here’s a (Python3) function that will do that for you:

                  def regex_is_valid(test_regex):
                      return (tup2 := editor.findText(FINDOPTION.REGEXP, 0, 0, test_regex)) is None or tup2[0] != -2
                  
                  

                  It really seems like you need to use editor.research() rather than editor.findText(), if you want to find multiple matches with a single call to a searching function, e.g.:

                  matches = []
                  editor.research(search_variable, lambda m: matches.append(m.span(0)))
                  num_matches = len(matches)
                  
                  4SHAKEN4 1 Reply Last reply Reply Quote 1
                  • 4SHAKEN4 Offline
                    4SHAKEN @Alan Kilborn
                    last edited by PeterJones

                    @Alan-Kilborn thanks for the suggestion on editor.research! I’m now able to get num of matches. I haven’t found a replacement for editor.setSel (using match) so I’m having to do the search twice. I’m sure its a rookie mistake on my part.

                    console.write('Searching for matches...\n')
                    matches = []
                    editor.research(my_search_variable, lambda m: matches.append(m.span(0)))
                    num_matches = len(matches)
                    z = editor.findText(FINDOPTION.REGEXP, 0, editor.getLength(), mrn_acc_search)
                    if matches:
                        editor.gotoLine(editor.lineFromPosition(matches[0][0])+20)
                        editor.setSel(*z)
                        console.write('Search Completed - found ' + str(num_matches) + ' which are highlighted.\n')
                    if not matches:
                        console.write('Search Completed.  No matches found.\n')
                    

                    -–

                    moderator added code markdown around text; please don’t forget to use the </> button to mark example text as “code” so that characters don’t get changed by the forum

                    Alan KilbornA 1 Reply Last reply Reply Quote 0
                    • Alan KilbornA Offline
                      Alan Kilborn @4SHAKEN
                      last edited by

                      @4SHAKEN said:

                      I haven’t found a replacement for editor.setSel (using match)

                      Note, the following is untested, but it or something very similar, should work, if I’m understanding what you want:

                      editor.setSel(*matches[0])

                      4SHAKEN4 1 Reply Last reply Reply Quote 0
                      • 4SHAKEN4 Offline
                        4SHAKEN @Alan Kilborn
                        last edited by PeterJones

                        @Alan-Kilborn Confirmed it works, thanks so much! My updated code is below in case it helps others.

                        console.write('Searching for matches...\n')
                        matches = []
                        editor.research(my_search_variable, lambda m: matches.append(m.span(0)))
                        num_matches = len(matches)
                        if matches:
                            editor.gotoLine(editor.lineFromPosition(matches[0][0])+20)
                            editor.setSel(*matches[0])
                            console.write('Search completed at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S') + '. ' + str(num_matches) + ' matches found.\n')
                        if not matches:
                            console.write('Search completed at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S') + '.  No matches found.\n')
                        

                        -–

                        moderator added code markdown around text; please don’t forget to use the </> button to mark example text as “code” so that characters don’t get changed by the forum

                        Mark OlsonM 1 Reply Last reply Reply Quote 2
                        • Mark OlsonM Offline
                          Mark Olson @4SHAKEN
                          last edited by

                          @4SHAKEN
                          In the future you should wrap your code snippets in ``` blocks.

                          if foo:
                              blah = -3
                              return bar() # notice syntax highlighting, indentation preserved
                          else:
                              return zut()
                          
                          1 Reply Last reply Reply Quote 0

                          Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                          Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                          With your input, this post could be even better 💗

                          Register Login
                          • First post
                            Last post
                          The Community of users of the Notepad++ text editor.
                          Powered by NodeBB | Contributors