DEV Community

Igor Irianto
Igor Irianto

Posted on • Edited on • Originally published at irian.to

Quick vim tips to generate and increment numbers

There are times when I need to either increment or generate a column of numbers quickly in vim. Vim 8/ neovim comes with useful number tricks.

magician

I will share two of them here.

Quickly generate numbers with put and range

You can quickly generate ascending numbers by

:put=range(1,5)
Enter fullscreen mode Exit fullscreen mode

This will give you:

1
2
3
4
5
Enter fullscreen mode Exit fullscreen mode

We can also control the increments. If we want to quickly generate descending number, we do:

:put=range(10,0,-1)
Enter fullscreen mode Exit fullscreen mode

Some other variations:

:put=range(0,10,2) // increments by 2 from 0 to 10 
:put=range(5)      // start at 0, go up 5 times
Enter fullscreen mode Exit fullscreen mode

This trick might be helpful to generate a list when taking notes. In vim, display current line, we can use line('.'). This can be combined with put/range. Let's say you are currently on line # 40. To generate numbers to line 50, you do:

:put=range(line(','),50)
Enter fullscreen mode Exit fullscreen mode

And you'll get:

40 // prints at line 41.
41
42
43
44
45
46
47
48
49
50
Enter fullscreen mode Exit fullscreen mode

To adjust line number above, you change it to be :put=range(line('.')+1,50) to show the correct line number.

Quickly increment column of numbers

Suppose we have a column of numbers, like the 0's in HTML below:

<div class="test">0</div>
<div class="test">0</div>
<div class="test">0</div>
<div class="test">0</div>
<div class="test">0</div>
<div class="test">0</div>
<div class="test">0</div>
<div class="test">0</div>
<div class="test">0</div>
Enter fullscreen mode Exit fullscreen mode

If we want to increment all the zeroes (1, 2, 3, ...), we can quickly do that. Here is how:

First, move cursor to top 0 (I use [] to signify cursor location).

<div class="test">[0]</div>
<div class="test">0</div>
<div class="test">0</div>
<div class="test">0</div>
<div class="test">0</div>
<div class="test">0</div>
<div class="test">0</div>
<div class="test">0</div>
<div class="test">0</div>
Enter fullscreen mode Exit fullscreen mode

Using VISUAL BLOCK mode (<C-v>), go down 8 times (<C-v>8j) to visually select all 0's.

<div class="test">[0]</div>
<div class="test">[0]</div>
<div class="test">[0]</div>
<div class="test">[0]</div>
<div class="test">[0]</div>
<div class="test">[0]</div>
<div class="test">[0]</div>
<div class="test">[0]</div>
<div class="test">[0]</div>
Enter fullscreen mode Exit fullscreen mode

Now type g <C-a>. Voila!

<div class="test">1</div>
<div class="test">2</div>
<div class="test">3</div>
<div class="test">4</div>
<div class="test">5</div>
<div class="test">6</div>
<div class="test">7</div>
<div class="test">8</div>
<div class="test">9</div>
Enter fullscreen mode Exit fullscreen mode

shocked

Wait a minute... what just happened?

Vim 8 and neovim has a feature that automatically increment numbers with <C-a> (and decrement with <C-x>). You can check it out by going to :help CTRL-A.

We can also change the increments by inserting a number ahead. If we want to have 10,20,30,... instead of 1,2,3,..., do 10g<C-a> instead.

Btw, one super-cool-tips with <C-a> and <C-x> - you can increment not only numbers, but octal, hex, bin, and alpha! For me, I don't really use the first three, but I sure use alpha a lot. Alpha is fancy word for *alpha*betical characters. If we do set nformats=alpha, we can increments alphabets like we do numbers.

Isn't that cool or what? Please feel free to share any other number tricks with Vim in comment below. Thanks for reading! Happy vimming!

Top comments (0)