Insert sequential numbers at start of lines
-
@Alan-Kilborn said in Insert sequential numbers at start of lines:
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?
-
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:
-
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()
-
@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)?
-
@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
-
@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
-
-
@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.
-
@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?
-
@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! :-)
-
@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
-
@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. -
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.
-
@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. :) -
@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 allYou can record this replacement op as a macro.
-
@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. -
@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.
-
@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.