2011-09-07 26 views
8

Tengo una expresión regular para reemplazar un cierto patrón con una determinada cadena, pero quiero que sea más dinámico que eso.Vim regex reemplazar con n caracteres

Por ejemplo, decir que tengo esta expresión regular:

%s/hello/-----/g

Quisiera, sin embargo, como para hacer algo como esto en su lugar:

%s/hello/-{5}/g

que significa reemplazar hola con 5 guiones.

¿Hay alguna manera de hacerlo?

En última instancia, me gustaría hacer algo como esto:

%s/(hello)*/-{\=strlen(\0)}/g

que sustituiría a cualquier instancia de una cadena de sólo hello s con guiones cuya longitud es igual a la longitud de la cadena coincidente .

Respuesta

19
%s/\v(hello)*/\=repeat('-',strlen(submatch(0)))/g 
+0

¡Trabajos! Gracias. ¿Sabes dónde puedo encontrar todas las funciones disponibles (como strlen y repeat)? – tjameson

+3

': h functions' hará el truco –

+3

O' function-list'. A veces es más útil. – sidyll

5

En lugar de utilizar comandos sustituto, se puede automatizar los comandos de edición de realizar la sustitución. La forma más sencilla de sobreescribir ocurrencias de el patrón de búsqueda con carácter particular a mano es la siguiente.

  1. Busque el comienzo de la próxima aparición.

    /\(hello\)\+ 
    
  2. Seleccionar texto que coincida hasta el final.

    v//e 
    
  3. Reemplazar el texto seleccionado.

    r- 
    
  4. Repita desde el paso 1.

Así, para automatizar esta rutina de ejecución del comando

:let[@/,@s]=['\(hello\)\+',"//\rv//e\[email protected]"] 

y ejecutar el contenido de ese registro s A partir del comienzo de el búfer (o desde otro lugar apropiado):

[email protected] 
+0

+1 para macro recursiva y usando '// e' –