• Login
Community
  • Login

Copy with line numbers

Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
6 Posts 3 Posters 2.9k 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.
  • M
    Michael Vincent
    last edited by Jan 4, 2020, 3:36 PM

    I think TextFX plugin had a “copy with line numbers” option, but I’ve long since stopped using TextFX and moved to N++ 64-bit where there is no TextFX option. Most of it’s features are available anyway. But “copy with line numbers” is very useful for the few and far between times I do need to use it.

    I’m pretty good with NppExec, so here’s a little script I whipped up to do “copy with line numbers”:

    SCI_SENDMSG SCI_GETSELECTIONSTART
    SCI_SENDMSG SCI_LINEFROMPOSITION $(MSG_RESULT)
    SET LOCAL START = $(MSG_RESULT)
    
    SCI_SENDMSG SCI_GETSELECTIONEND
    SCI_SENDMSG SCI_LINEFROMPOSITION $(MSG_RESULT)
    SET LOCAL END = $(MSG_RESULT)
    
    SCI_SENDMSG SCI_GETCURRENTPOS 
    SCI_SENDMSG SCI_GETCOLUMN $(MSG_RESULT)
    SET LOCAL COLUMNEND = $(MSG_RESULT)
    
    :LOOP
    IF $(START)==$(END) THEN
        IF $(COLUMNEND)==0 GOTO END
        ENDIF
    ENDIF
    SCI_SENDMSG SCI_GETLINE $(START) @""
    SET LOCAL LINE ~ $(START) + 1
    ECHO $(LINE):	$(MSG_LPARAM)
    IF $(START)==$(END) GOTO END
    SET LOCAL START ~ $(START) + 1
    GOTO LOOP
    
    :END
    

    Note the “space” between the colon and dollar sign in the `ECHO $(LINE): $(MSG_LPARAM)" line is actually a TAB which makes the output look better. Of course, this only outputs to the NppExec Console; you need to then highlight it and copy to be able to paste it somewhere.

    NppExec has a “clip_settext” command which can set the clipboard text, but you can see the problem in my loop is that i output the text rather than concatenate it to a variable.

    QUESTION:
    It seems NppExec doesn’t have a way to do “string addition” or string concatenation? Unless I’m missing something?

    I’m sure this is pretty trivial in [Python|Lua]Script plugins.

    Cheers.

    D 1 Reply Last reply Jan 4, 2020, 4:46 PM Reply Quote 3
    • D
      dinkumoil @Michael Vincent
      last edited by Jan 4, 2020, 4:46 PM

      @Michael-Vincent said in Copy with line numbers:

      It seems NppExec doesn’t have a way to do “string addition” or string concatenation?

      No, it has.

      Please remind: NppExec works like a console script language, not like a normal programming language.

      Type the following commands into a NppExec console window or add them as a script to the npes_saved.txt file:

      set local Foo = Bar
      echo $(Foo)
      set local Foo = $(Foo) Bar
      echo $(Foo)
      set local Foo = $(Foo) $(Foo)
      echo $(Foo)
      

      You can also use the following notation:

      set local $(Foo) = Bar
      echo $(Foo)
      set local $(Foo) = $(Foo) Bar
      ...
      
      M 1 Reply Last reply Jan 4, 2020, 5:42 PM Reply Quote 3
      • M
        Michael Vincent @dinkumoil
        last edited by Jan 4, 2020, 5:42 PM

        @dinkumoil said in Copy with line numbers:

        No, it has.

        I’m embarrassed to say I didn’t even try that and of course it “works” but it’s not preserving the line endings so it’s just adding one big line of text. Partial success.

        my first line
        my second line
        my third line

        Output should be:

        1 my first line
        2 my second line
        3 my third line

        but instead is:

        1 my first line2 my second line3 my third line

        I think the ECHO in my first “solution” is helping by adding in that carriage return / line feed which I was assuming should be part of the captured text from the SCI_GETLINE call.

        Cheers.

        M 1 Reply Last reply Jan 4, 2020, 5:55 PM Reply Quote 0
        • M
          Michael Vincent @Michael Vincent
          last edited by Jan 4, 2020, 5:55 PM

          @Michael-Vincent

          OK - weird workaround, but pasting a unix line ending into Windows Notepad results in a zero-length character that you can actually “highlight” (it doesn’t look like anything highlights) and then copy and paste it into the script:

          ECHO $(LINE):	$(MSG_LPARAM)
          

          becomes:

          SET LOCAL OUTTEXT = $(OUTTEXT)$(LINE):	$(MSG_LPARAM)
          

          where the zero-length carriage return is between …EXT)[HERE]$(LIN…

          And then after :END, use:

          CLIP_SETTEXT $(OUTTEXT)
          

          Cheers.

          M 1 Reply Last reply Jan 6, 2020, 1:37 PM Reply Quote 1
          • A
            Alan Kilborn
            last edited by Alan Kilborn Jan 6, 2020, 2:10 AM Jan 6, 2020, 2:09 AM

            @Michael-Vincent said in Copy with line numbers:

            I’m sure this is pretty trivial in [Python|Lua]Script plugins.

            Yep, the following Pythonscript will copy to the clipboard the lines touched by the currently active selection, prepended with their line numbers:

            # -*- coding: utf-8 -*-
            
            from Npp import editor, notepad, NOTIFICATION
            import math
            
            def main():
                start_line = editor.lineFromPosition(editor.getSelectionStart())
                sel_end = editor.getSelectionEnd()
                end_line = editor.lineFromPosition(sel_end)
                if editor.positionFromLine(end_line) == sel_end: end_line -= 1
                field_width_for_line_number = int(math.log(end_line + 1, 10)) + 1
                accum = ''
                for line_number in range(start_line, end_line + 1):
                    accum += '{ln:{width}}:{contents}'.format(ln=line_number+1, width=field_width_for_line_number, contents=editor.getLine(line_number))
                editor.copyText(accum)
            
            main()
            

            Example output:

             8:    sel_end = editor.getSelectionEnd()
             9:    end_line = editor.lineFromPosition(sel_end)
            10:    if editor.positionFromLine(end_line) == sel_end: end_line -= 1
            
            1 Reply Last reply Reply Quote 1
            • M
              Michael Vincent @Michael Vincent
              last edited by Jan 6, 2020, 1:37 PM

              @Michael-Vincent said in Copy with line numbers:

              OK - weird workaround

              Much better:

              ::copylinenums
              NPP_CONSOLE keep
              
              SET LOCAL CR ~ STRFROMHEX 0xd
              SET LOCAL LF ~ STRFROMHEX 0xa
              
              SCI_SENDMSG SCI_GETSELECTIONSTART
              SCI_SENDMSG SCI_LINEFROMPOSITION $(MSG_RESULT)
              SET LOCAL START = $(MSG_RESULT)
              
              SCI_SENDMSG SCI_GETSELECTIONEND
              SCI_SENDMSG SCI_LINEFROMPOSITION $(MSG_RESULT)
              SET LOCAL END = $(MSG_RESULT)
              
              SCI_SENDMSG SCI_GETCURRENTPOS
              SCI_SENDMSG SCI_GETCOLUMN $(MSG_RESULT)
              SET LOCAL COLUMNEND = $(MSG_RESULT)
              
              :LOOP
              IF $(START)==$(END) THEN
                  IF $(COLUMNEND)==0 GOTO END
                  ENDIF
              ENDIF
              SCI_SENDMSG SCI_GETLINE $(START) @""
              SET LOCAL LINE ~ $(START) + 1
              // ECHO $(LINE):	$(MSG_LPARAM)
              SET LOCAL OUTTEXT = $(OUTTEXT)$(LINE):	$(MSG_LPARAM)$(CR)$(LF)
              IF $(START)==$(END) GOTO END
              SET LOCAL START ~ $(START) + 1
              GOTO LOOP
              
              :END
              CLIP_SETTEXT $(OUTTEXT)
              

              Cheers.

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