Community
    • Login

    Insert sequential numbers at start of lines

    Scheduled Pinned Locked Moved General Discussion
    26 Posts 5 Posters 6.7k 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.
    • deleeleeD
      deleelee @Simran Kaur
      last edited by

      @Simran-Kaur said in Insert sequential numbers at start of lines:

      Follow this tutorial: https://community.notepad-plus-plus.org/topic/16311/how-to-add-numbers-to-a-text-with-notepad

      I don’t think you read my post because I’ve already said I know how to do that.

      1 Reply Last reply Reply Quote 0
      • deleeleeD
        deleelee @Alan Kilborn
        last edited by

        @Alan-Kilborn said in Insert sequential numbers at start of lines:

        @deleelee

        While it may not be possible as a macro, it could certainly be “scripted” if you are interested in that type of solution.

        Yes I would be interested in that type of solution. Do you have a script in mind?

        Alan KilbornA 1 Reply Last reply Reply Quote 0
        • Alan KilbornA
          Alan Kilborn @deleelee
          last edited by Alan Kilborn

          @deleelee

          You didn’t really say a whole lot about what you want to end up with, but here’s a script that demos some capability. I call it InsertLineNumbersOnLines.py:

          # -*- coding: utf-8 -*-
          from __future__ import print_function
          
          from Npp import *
          import math
          
          #-------------------------------------------------------------------------------
          
          class ILNOL(object):
          
              def __init__(self):
                  num_digits_in_line_num = int(math.log(editor.getLineCount(), 10)) + 1
                  line_list = editor.getText().splitlines()
                  line_list2 = []
                  for (line_nbr, line_content) in enumerate(line_list):
                      line_list2.append('{n:>{d}}:{c}'.format(n=line_nbr+1, c=line_content, d=num_digits_in_line_num))
                  eol = ['\r\n', '\r', '\n'][editor.getEOLMode()]
                  editor.setText(eol.join(line_list2))
          
          #-------------------------------------------------------------------------------
          
          if __name__ == '__main__': ILNOL()
          
          

          The script will put line numbers at the start of every line, example:

          9ad2d72d-ec3d-4394-b6f0-2878cdc1800e-image.png

          1 Reply Last reply Reply Quote 1
          • Alan KilbornA
            Alan Kilborn
            last edited by Alan Kilborn

            It may be worth noting that the script above is similar to the functionality of the deprecated TextFX plugin’s function: TextFX > TextFX Tools > Insert Line Numbers.

            Here’s a slightly modified version that is even more similar, I call this one TextFxInsertLineNumbers.py:

            # -*- coding: utf-8 -*-
            from __future__ import print_function
            
            from Npp import *
            import inspect
            import os
            
            #-------------------------------------------------------------------------------
            
            class TFILN(object):
            
                def __init__(self):
                    self.this_script_name = inspect.getframeinfo(inspect.currentframe()).filename.split(os.sep)[-1].rsplit('.', 1)[0]
                    if editor.getSelectionEmpty():
                        self.mb('No text selected')
                        return
                    (start_line, end_line) = editor.getUserLineSelection()
                    start_pos = editor.positionFromLine(start_line)
                    end_pos = editor.getLineEndPosition(end_line)
                    line_list = editor.getRangePointer(start_pos, end_pos - start_pos).splitlines()
                    line_list2 = []
                    for (line_nbr, line_content) in enumerate(line_list):
                        line_list2.append('{n:08} {c}'.format(n=line_nbr+1, c=line_content))
                    eol = ['\r\n', '\r', '\n'][editor.getEOLMode()]
                    editor.setTarget(start_pos, end_pos)
                    editor.beginUndoAction()
                    editor.replaceTarget(eol.join(line_list2))
                    editor.endUndoAction()
            
                def mb(self, msg, flags=0, title=''):  # a message-box function
                    return notepad.messageBox(msg, title if title else self.this_script_name, flags)
            
            #-------------------------------------------------------------------------------
            
            if __name__ == '__main__': TFILN()
            
            deleeleeD Ionut DorinI 2 Replies Last reply Reply Quote 0
            • deleeleeD
              deleelee @Alan Kilborn
              last edited by

              @Alan-Kilborn said in Insert sequential numbers at start of lines:

              It may be worth noting that the script above is similar to the functionality of the deprecated TextFX plugin’s function: TextFX > TextFX Tools > Insert Line Numbers.

              Here’s a slightly modified version that is even more similar, I call this one TextFxInsertLineNumbers.py:

              # -*- coding: utf-8 -*-
              from __future__ import print_function
              
              from Npp import *
              import inspect
              import os
              
              #-------------------------------------------------------------------------------
              
              class TFILN(object):
              
                  def __init__(self):
                      self.this_script_name = inspect.getframeinfo(inspect.currentframe()).filename.split(os.sep)[-1].rsplit('.', 1)[0]
                      if editor.getSelectionEmpty():
                          self.mb('No text selected')
                          return
                      (start_line, end_line) = editor.getUserLineSelection()
                      start_pos = editor.positionFromLine(start_line)
                      end_pos = editor.getLineEndPosition(end_line)
                      line_list = editor.getRangePointer(start_pos, end_pos - start_pos).splitlines()
                      line_list2 = []
                      for (line_nbr, line_content) in enumerate(line_list):
                          line_list2.append('{n:08} {c}'.format(n=line_nbr+1, c=line_content))
                      eol = ['\r\n', '\r', '\n'][editor.getEOLMode()]
                      editor.setTarget(start_pos, end_pos)
                      editor.beginUndoAction()
                      editor.replaceTarget(eol.join(line_list2))
                      editor.endUndoAction()
              
                  def mb(self, msg, flags=0, title=''):  # a message-box function
                      return notepad.messageBox(msg, title if title else self.this_script_name, flags)
              
              #-------------------------------------------------------------------------------
              
              if __name__ == '__main__': TFILN()
              

              Thanks for both of these. Sorry I wasn’t more specific. What would be great would be a script where I just select the lines I want numbered and insert sequential numbers starting from one followed by a closing parentheses ie: 1) 2) 3)

              Now I’m not exactly a coding newbie but I’ve not really dealt with Python before. If I have Python installed on my PC do I just run the script or do I load it into Npp (as a macro or some other method)?

              PeterJonesP deleeleeD 2 Replies Last reply Reply Quote 0
              • PeterJonesP
                PeterJones @deleelee
                last edited by

                @deleelee said in Insert sequential numbers at start of lines:

                f I have Python installed on my PC do I just run the script or do I load it into Npp

                No. You install the PythonScript plugin, which comes with an embedded Python interpreter, and follow the instructions in the FAQ on how to run a script using PythonScript

                deleeleeD 1 Reply Last reply Reply Quote 0
                • deleeleeD
                  deleelee @PeterJones
                  last edited by

                  @PeterJones said in Insert sequential numbers at start of lines:

                  No. You install the PythonScript plugin, which comes with an embedded Python interpreter, and follow the instructions in the FAQ on how to run a script using PythonScript

                  Thank you so much, Peter! :-D

                  1 Reply Last reply Reply Quote 0
                  • PeterJonesP PeterJones referenced this topic on
                  • deleeleeD
                    deleelee @deleelee
                    last edited by

                    @deleelee said in Insert sequential numbers at start of lines:

                    Here’s a slightly modified version

                    Sorry it’s taken me so long to check your scripts out. Thank you so much, they’re great but I’d like a kind of hybrid of them both.

                    InsertLineNumbersOnLines - Inserts numbers on all lines with the numbers followed by a colon.

                    TextFxInsertLineNumbers - Inserts numbers only on selected lines but with leading zeros.

                    I’d like to insert numbers only on selected lines, with no leading zeros, and numbers followed by a colon or a closing parentheses.

                    deleeleeD 1 Reply Last reply Reply Quote 0
                    • deleeleeD
                      deleelee @deleelee
                      last edited by

                      @deleelee said in Insert sequential numbers at start of lines:

                      @deleelee said in Insert sequential numbers at start of lines:
                      I’d like a kind of hybrid of them both.

                      UPDATE: I managed to figure it out myself and modified your TextFxInsertLineNumbers script. I now have it inserting numbers with no leading zeros followed by a closing parentheses. Thank you so much for your help.

                      However, is it possible to have it insert numbers only for selected lines but exclude any selected lines that are empty?

                      Alan KilbornA 1 Reply Last reply Reply Quote 0
                      • Alan KilbornA
                        Alan Kilborn @deleelee
                        last edited by

                        @deleelee said in Insert sequential numbers at start of lines:

                        but exclude any selected lines that are empty?

                        Sure, most anything is possible with programming.
                        You’d want to look for a line-length of zero (e.g. len(line_content) == 0) and then NOT insert a line number at the start of such lines, by appending only the content to the second list. Of course, this would cause gaps in your line numbering any time a blank line occurs, so you might need to maintain the line number counter yourself.

                        Since you’ve already made changes to the script, go ahead and make some more! :-)

                        deleeleeD 2 Replies Last reply Reply Quote 0
                        • deleeleeD
                          deleelee @Alan Kilborn
                          last edited by

                          @Alan-Kilborn said in Insert sequential numbers at start of lines:

                          You’d want to look for a line-length of zero (e.g. len(line_content) == 0) and then NOT insert a line number at the start of such lines, by appending only the content to the second list. Of course, this would cause gaps in your line numbering any time a blank line occurs, so you might need to maintain the line number counter yourself.

                          Thanks yet again. I’ll check it out :-D

                          1 Reply Last reply Reply Quote 1
                          • Ionut DorinI
                            Ionut Dorin @Alan Kilborn
                            last edited by

                            @Alan-Kilborn I know it’s years later, but i found myself using your script. I’m a total noob when it comes to programming, all i could do is modify what goes after the numbers.
                            Now, how could i delete what the script just did (i.e delete the numbers, but leave the lines like they were before the script ran) ? I know i can use Undo to do it on the spot, but let’s say i wanna undo the numbering a day after.

                            Alan KilbornA 1 Reply Last reply Reply Quote 0
                            • Alan KilbornA
                              Alan Kilborn @Ionut Dorin
                              last edited by

                              @Ionut-Dorin

                              You don’t need programming to delete the line numbers that were inserted.

                              Here’s how to do it:

                              • Move the caret to line 1 and column 1
                              • Press Shift+Alt+b to Begin Select in Column mode
                              • Move the caret to the last line and put it right after the last digit of the line number (previously added by the script)
                              • Press Shift+Alt+b again to End Select in Column mode

                              At this point you should have the line numbers selected in a rectangular block so simply pressing Delete should eliminate them.

                              Ionut DorinI 1 Reply Last reply Reply Quote 0
                              • Ionut DorinI
                                Ionut Dorin @Alan Kilborn
                                last edited by

                                @Alan-Kilborn Okay, i knew how to do that, but it does not help me.
                                First, i’d have to do it twice, because i set the script up to put a number, then :, then a space (5: ), so till 9 its 3 characters long and after is 4 characters long.
                                And again, i have to do this multiple times in a document, every day and using the column mode is a bit tedious. I was hoping that i could do it with a script.
                                Now, i select the text i need, press a key and your script instantly does its job. I’d like to have the same thing with deleting, but i don’t know if it’s possible or not. :)

                                Alan KilbornA 1 Reply Last reply Reply Quote 0
                                • Alan KilbornA
                                  Alan Kilborn @Ionut Dorin
                                  last edited by

                                  @Ionut-Dorin said in Insert sequential numbers at start of lines:

                                  i set the script up to put a number, then :, then a space (5: ), so till 9 its 3 characters long and after is 4 characters long

                                  It would have been better to just show some of this text rather than describing it…

                                  But I think if you do a replacement operation it will be good?:

                                  Find: ^\d+:
                                  Replace: set to nothing
                                  Search mode: Regular expression
                                  Options: Wrap around
                                  Action: Replace all

                                  You can record this replacement op as a macro.

                                  Ionut DorinI 1 Reply Last reply Reply Quote 1
                                  • Ionut DorinI
                                    Ionut Dorin @Alan Kilborn
                                    last edited by Ionut Dorin

                                    @Alan-Kilborn
                                    1: Line content
                                    2: Line content
                                    3: Line content
                                    4: Line content
                                    5: Line content
                                    6: Line content
                                    7: Line content
                                    8: Line content
                                    9: Line content
                                    10: Line content
                                    11: Line content
                                    12: Line content
                                    … and to become
                                    Line content
                                    Line content
                                    Line content
                                    Line content
                                    etc.
                                    Find: ^\d+: doesn’t work and plus, i don’t need it for the whole document, just for the lines i select.

                                    Alan KilbornA 1 Reply Last reply Reply Quote 0
                                    • Alan KilbornA
                                      Alan Kilborn @Ionut Dorin
                                      last edited by

                                      @Ionut-Dorin said in Insert sequential numbers at start of lines:

                                      Find: ^\d+: doesn’t work

                                      If you did exactly what I said to do, I see no reason why it wouldn’t work on your sample data.

                                      i don’t need it for the whole document, just for the lines i select.

                                      Ok, so don’t checkmark Wrap around but make your selection first and then checkmark In selection.

                                      Ionut DorinI 1 Reply Last reply Reply Quote 2
                                      • Ionut DorinI
                                        Ionut Dorin @Alan Kilborn
                                        last edited by Ionut Dorin

                                        @Alan-Kilborn Yes, that did it, I think i read too fast and didn’t see that you said “Search mode: Regular expression” and i didn’t check that, so maybe that’s why it didnt work.
                                        Also, i turned it into a macro for ease of use.
                                        Thank you so much for your help and patience, you’re a lifesaver.

                                        1 Reply Last reply Reply Quote 2
                                        • deleeleeD
                                          deleelee @Alan Kilborn
                                          last edited by

                                          @Alan-Kilborn said in Insert sequential numbers at start of lines:

                                          Sure, most anything is possible with programming.

                                          Hi Alan, the scripts have been working really well, thank you so much for your help. One thing I’ve noticed is that, when using the script for selected lines, it has to be a block selection for the script to work. I can’t select individual lines (eg: line 1, line 4, line 7) and insert numbers at that the start of only those lines.

                                          I’ve tried:

                                          1. Multi-selection using Ctrl + single-click at the start of each line.
                                          2. Multi-selection using Ctrl + single-click at the start and end of each line.
                                          3. Multi-selection using Ctrl + double-click to select the first word of each line.

                                          Numbers 1 & 2 don’t actually select any text so when I run the script I get a “No text selected” message.
                                          Number 3 only places a number at the start of the line for the last word I select.

                                          Is it possible or am I expecting more than the script can achieve?

                                          Alan KilbornA 1 Reply Last reply Reply Quote 0
                                          • Alan KilbornA
                                            Alan Kilborn @deleelee
                                            last edited by Alan Kilborn

                                            @deleelee

                                            You must be referring to the TextFxInsertLineNumbers.py script, because the other script discussed in this topic, InsertLineNumbersOnLines.py, doesn’t deal with any selected text at all.

                                            Here’s a modified version of the script I’m calling TextFxInsertLineNumbers2.py :

                                            # -*- coding: utf-8 -*-
                                            from __future__ import print_function
                                            
                                            # references:
                                            #  https://community.notepad-plus-plus.org/topic/23206/insert-sequential-numbers-at-start-of-lines
                                            #  https://community.notepad-plus-plus.org/topic/23166/faq-desk-how-do-i-replicate-the-features-of-textfx
                                            
                                            from Npp import *
                                            
                                            #-------------------------------------------------------------------------------
                                            
                                            class TFILN2(object):
                                            
                                                def __init__(self):
                                                    handled_line_nbr_list = []
                                                    running_line_nbr = 1
                                                    line_tup_list = []
                                                    for s in range(editor.getSelections()):
                                                        start_line = editor.lineFromPosition(editor.getSelectionNStart(s))
                                                        end_line = editor.lineFromPosition(editor.getSelectionNEnd(s))
                                                        line_tup_list.append((start_line, end_line))
                                                        line_tup_list.sort()
                                                    for (start_line, end_line) in line_tup_list:
                                                        for line_nbr in range(start_line, end_line + 1):
                                                            if line_nbr not in handled_line_nbr_list:
                                                                line_content = editor.getLine(line_nbr).rstrip('\n\r')
                                                                editor.replaceLine(line_nbr, '{n:08} {c}'.format(n=running_line_nbr, c=line_content))
                                                                running_line_nbr += 1
                                                                handled_line_nbr_list.append(line_nbr)
                                                    editor.setSel(editor.getCurrentPos(), editor.getCurrentPos())
                                            
                                            #-------------------------------------------------------------------------------
                                            
                                            if __name__ == '__main__': TFILN2()
                                            

                                            This version handles all types of selections.

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