2012-01-18 18 views
5

Estoy trabajando con un archivo YAML que tiene un número entero como ID que aparece cada 4-6 líneas. Estoy buscando agregar un registro en el medio de este archivo (para legibilidad) que mantenga la numeración secuencial intacta.macro Vim: aumentar números en líneas no consecutivas

Formato de archivo a continuación. ¿Algunas ideas?

- id: 1 
    type: string 
    option: diff_string 
    other: alt_string // note: 'other' option does not appear for all records 

- id: 2 
    type: string 
    option: diff_string 

//new record would go here as id: 3, increasing id: # of all following records by 1 

- id: 3 
    type: string 
    option: diff_string 
    other: alt_string 

Respuesta

5

Creo que se puede lograr lo que quiere con el establecimiento de un contador (en este caso la variable g:I) a 1:

let g:I=1 

y luego ejecutar un cambio en cada línea que coincide con ^- id: \d\+$:

%g/^- id: \d\+$/ s/\d\+/\=g:I/|let g:I=g:I+1 

La substición utiliza la cosita \= (ver :help sub-replace-expression) para sustituir \d\+ con el valor real de g:I. Después de la substición, el contador se incrementa (let g:I=g:I+1).

Con el g/^- id: \d\+$/, asegúrese de que la substición solo se realice en líneas que coincidan con ^- id: \d\+.

Editar Si usted quiere tener un mapa por ello, se puede colocar el siguiente fragmento en su .vimrc:

nnoremap resync :let g:I=1<CR>:%g/^- id: \d\+$/ s/\d\+/\=g:I/\|let g:I=g:I+1<CR> 

que permite resincronización sus identificaciones escribiendo resync en modo normal .

Tenga en cuenta el escape del | con el y el uso de <CR> donde debe presionar Intro.

+0

Esta es otra forma válida, y volverá a numerar cada identificador en el documento comenzando con 1 desde el principio hasta el final. Copie este código en su portapapeles y use ': @ +' para probar (si usa la GUI). – Benoit

+0

¿Qué hace ': @ +' hacer? Veo que imprime las líneas 'id: x' pero no tengo idea de por qué es eso. –

+2

Nyfenegger: ': @' reproduce comandos Ex almacenados en un registro. El registro '+' normalmente está conectado al portapapeles externo. Ver ': ayuda: @'. Esto es muy útil si quieres probar extractos de vimrc: 'yy' luego': @ "'. – Benoit

3

con el fin de incrementar todos los identificadores posteriores de la línea de cursor + 1:

:.+1,$g/^- id: \d\+$/exec 'normal! 0' . nr2char(1) 

(nr2char(1) es como tecleando CTRL-A in).

También puede hacer:

:.+1,$g/^- id: \d\+$/normal! 0^A 

Donde se introducen ^A tecleando CTRL-V a continuación, CTRL-A. Tenga en cuenta que prefiero la primera versión: puede copiarla y pegarla, no hay un carácter de control literal en el código.

Detalle:

  • .+1,$ es el rango de la siguiente línea hasta el final del archivo. :help range.
  • :g comando opera en todas las líneas que obedecen a un patrón. Lo opuesto es :v. :help :g
  • /^- id: \d\+$/ partidos - id: al comienzo de una línea, seguido por 1 o más dígitos y luego final de la línea (:help pattern)
  • :normal! juega comandos normales: 0 para ir al inicio de la línea, CTRL-A para incrementar siguiente número.

Si quieres un mapeo:

nnoremap <F1> :.+1,$g/^- id: \d\+$/exec 'normal! 0' . nr2char(1)<enter> 

poner esto en su vimrc, y ahora disfrutar de la tecla F1 en el modo normal, y ver todos los identificadores por debajo de la línea de incrementación del cursor.

+0

Excelente, aunque prefiero el cambio global personalmente. Gracias, Benoit, por su ayuda en todas las respuestas con esta pregunta. – Lumen

1

Utilizaría el siguiente comando de sustitución breve y directo.

:,$s/^- id: \zs\d\+/\=submatch(0)+1/ 
Cuestiones relacionadas