> Is VIM capable of replacing matching text with a number that
> increments with each match?
>
> For instance:
>
> case %match:
> case %match:
> case %match:
> case %match:
>
> Becomes:
>
> case 1:
> case 2:
> case 3:
> case 4:
> case 5:
with a little bit of vim magic it can do most of that, but it
won't add a 5th "case" statement without a better heuristic ;-)
First, define a function Next()
function! Next(sname)
if exists('b:'.(a:sname))
let b:{a:sname} += 1
else
let b:{a:sname} = 1
endif
return b:{a:sname}
endfunction
that will take a variable-name to use, and then start
incrementing it each time. To watch it in process, execute the
following several times:
:echo Next('bar')
Then, do a substitute, using "\=" to do evaluation in the
replacement:
:%s/%\(match\)/\=Next(submatch(1))/g
This is also smart enough to handle the interlacing of multiple
counters, turning something like
case %match:
case %match:
case %foo:
case %foo:
case %match:
case %match:
case %foo: case %foo:
into
case 1:
case 2:
case 1:
case 2:
case 3:
case 4:
case 3: case 4:
using
:%s/%\(match\|foo\)/\=Next(submatch(1))
You can reset the counter(s) with
:unlet b:match
:unlet b:foo
or set the starting number with
:let b:match=42
(making the next number for replacement "43")
It uses several obscure corners of vim:
:help curly-brace-names
:help sub-replace-special
and a function that has side-effects.
Hope this helps, and if you have questions, just ask and I'll try
to unwrap some of the scarier bits :)
-tim
--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_use" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---