2010-01-14 12 views
17

En el modo normal (en Vim) si el cursor se encuentra en un número, Golpear Ctrl - Un incrementa el número en 1. Ahora quiero hacer lo Lo mismo, pero desde la línea de comando. En concreto, quiero ir a ciertas líneas cuyo primer carácter es un número, y se incrementará, es decir, quiero ejecutar el siguiente comando:El uso de Ctrl-A en la línea de comandos Vim para incrementar un número

:g/searchString/ Ctrl-A 

Traté de almacenar Ctrl - Un en una macro (por ejemplo a), y el uso de :g/searchString/ @a, pero me da un error:

E492: Not an editor command ^A

¿Alguna sugerencia?

Respuesta

22

usted tiene que utilizar normal para ejecutar modo normal comandos en modo de comando:

:g/searchString/ normal ^A 

Tenga en cuenta que usted tiene que presionar Ctrl - VCtrl - Un a obtener el carácter ^A.

+0

estado usando vim durante años y nunca se consideraba "normal" - Kool –

+0

@ James: la belleza de lo desconocido :) Vim sorprende l ¡No tengo otro software! –

+1

Prueba las esquinas oscuras de la pregunta de vim para descubrir más de lo desconocido: http://stackoverflow.com/questions/726894/what-are-the-dark-corners-of-vim-your-mom-never-told-you -sobre – idbrii

0

estoy seguro de que puede hacerlo con vim en la línea de comandos. Pero aquí es una alternativa,

$ cat file 
one 
2two 
three 

$ awk '/two/{x=substr($0,1,1);x++;$0=x substr($0,2)}1' file #search for "two" and increment 
one 
3two 
three 
9

Así como el :g//normal truco publicado por CMS, si es necesario hacerlo con una búsqueda más complicado que simplemente encontrar un número al comienzo de la línea, se puede hacer algo como esto:

:%s/^prefix pattern\zs\d\+\zepostfix pattern/\=(submatch(0)+1) 

a modo de explicación:

:%s/X/Y   " Replace X with Y on all lines in a file 
" Where X is a regexp: 
^     " Start of line (optional) 
prefix pattern  " Exactly what it says: find this before the number 
\zs    " Make the match start here 
\d\+    " One or more digits 
\ze    " Make the match end here 
postfix pattern " Something to check for after the number (optional) 

" Y is: 
\=     " Make the output the result of the following expression 
(
    submatch(0) " The complete match (which, because of \zs and \ze, is whatever was matched by \d\+) 
    + 1   " Add one to the existing number 
) 
+1

¡Muy útil! Y me gusta cómo lo explicaste también. Gracias. – romar

Cuestiones relacionadas