2010-02-01 5 views
7

tarea de fondo

para eliminar los problemas XY Voy a decir lo que estoy haciendo: Estoy tratando de utilizar :perldo en VIM 7.2 para completar dos tareas:VIM 7.2 problema de secuencias de comandos con `: perldo` y múltiples expresiones

  • Borrar todos los espacios en blanco de salida, incluyendo (compensador no borrar) líneas que solamente tienen espacios en blanco
    • s/\s+$//;
  • Quitar espacios en blanco no pestaña que existe antes del carácter de primera no espacio
    • s/^ (\s*) (?=\S)/s#[^\t]##g;$_ /xe;

me gustaría hacer todo esto con una sola pasada. Actualmente, usando :perldo, puedo hacer que funcione con dos pases. (Mediante el uso de: perldo dos veces)

El comando debe tener este aspecto:

:perldo s/\s+$//; s/^ (\s*) (?=\S)/s#[^\t]##g;$_ /xe; 

Perl fondo

Para entender este problema, debe saber un poco sobre Perl s/// une automágicamente a la variable predeterminada $_ que la expresión regular es libre de modificar. La mayoría de las funciones principales funcionan en $_ de forma predeterminada.

perl -e'$_="foo"; s/foo/bar/; s/bar/baz/; print' # imprimirá baz

La suposición es que se puede expresiones de cadena usando :perldo en VIM y que se ponga a funcionar lógicamente.

VIM no ser agradable

Ahora mi problema VIM se demuestra mejor con código - He reducido a una simple prueba. Abrir un nuevo lugar búfer el texto siguiente en él:

aa bb 
aa 
bb 

Ahora ejecutar este :perldo s/a/z/; s/b/z/; El tampón tiene ahora:

za zb 
aa 
zb 

¿Por qué fue la primera expresión regular sin éxito en la segunda fila, y sin embargo, la segunda expresión regular fue exitoso por sí mismo, y en la primera fila?

Respuesta

6

Parece que toda la expresión de Perl que pase a :perldo debe devolver un valor verdadero/definido, o los resultados se descartan, por línea.

probar esto, no pasa nada en cualquier línea:

:perldo s/a/z/; s/b/z/; 0 

probar esto, funciona en las 3 líneas como se esperaba:

:perldo s/a/z/; s/b/z; 1 

Un ejemplo en la documentación :perldo alude a esto:

:perldo $_ = reverse($_);1 

pero desafortunadamente no dice explícitamente lo que está pasando.

+1

Sí, eso explicaría los resultados del OP: La última declaración en el' perldo' debe devolver un valor verdadero, o el resultado completo de 'perldo' se descarta. –

+0

He cambiado esto a mi respuesta, porque tiene sentido. Imagino que la otra respuesta explotaba que '0 + 0 = 0 (sin reemplazo)', y 1 + 0 o 0 + 1 daría como resultado un reemplazo. Esto es una tontería bastante para no haber documentado. –

0

Me parece que solo el último comando se ejecuta en todas las líneas en [rango].

5

no sabe lo que está haciendo exactamente :perldo, pero si se ejecuta algo así como

:perldo s/a/z/+s/b/z/ 

continuación, se obtiene algo más como era de esperar.

+0

Gracias !!! No estoy seguro de cómo lo hace, pero lo hace. –

+0

Todavía no sé cómo funciona, pero sospeché que se comportaría mejor con una sola expresión. – mob

+0

probablemente debería agregarse a la regla ': él' –

Cuestiones relacionadas