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?
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. –
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. –