Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Suppose that I have a number into register r.

How could I use this value with CTRLA and CTRLX

Here's an example to make it clearer:

Suppose that I have this text file:

10
13
15

I want to to increase those numbers with the value in register r to obtain (if it contains 5)

15
18
20

Why I'm asking it ? Because I want to use CTRLA into a macro but the number of time that I need to apply CTRLA is only know at "run time".

In a more general way, how could I execute a command a number of times stored in a register ?

All of these questions and answers where interesting but they don't answer my question:
http://stackoverflow.com/questions/1497958/how-to-use-vim-registers
http://stackoverflow.com/questions/2405952/vim-register-use-in-ex-mode

share|improve this question
add comment

1 Answer

up vote 2 down vote accepted

You could make a mapping like this:

noremap <Leader><C-A> :<C-U>execute 'normal!' str2nr(getreg('r')) . '<C-A>'<CR>

It maps \Control-A (<Leader> defaults to \, see :help leader) to run the usual Control-A the number of times specified in the r register. You could even use this to rebind the default Control-A (leave out <Leader>), but that seems like it could lead to confusion later if you ever forget about the mapping.

When the r register contains 5, it works like this (switched to double-quote notation since it is impossible to represent Control-A in a single-quoted string literal):

The getreg() and str2nr() functions are evaluated, resulting in this Ex command:

:execute 'normal!' 5 . "\<C-A>"

This results in another Ex command:

:normal! "5\<C-A>"

This executes a normal-mode command:

5Control-A

Which uses the prefix count before the usual Control-A (non-mapped, due do the ! in :normal!).

This version always uses the value in the r register; it explicitly ignores any prefixed count (unlike the usual Control-A). Alternate implementations are possible (e.g. where a prefixed count overrides or multiplies the value in the r register), but they would be a bit more complex.


You could also put the command directly in your macro instead of using a mapping:

qq…:execute 'normal!' str2nr(getreg('r')) . 'Control-A'Return

You have to type the actual Control-A and Return instead of their <> equivalents because this is no longer part of a mapping where Vim will automatically make the translation. Also, the Control-U is dropped, since it was only there to guard against a possible prefix count before the initial : (you can protect against this in the macro content itself).

share|improve this answer
    
Wow! Thank you very much! –  Luc M Jun 12 '12 at 13:05
    
I realize that your answer deserves thousand of votes. –  Luc M Jun 16 '12 at 4:39
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.