2011-12-10 11 views
5

esto está relacionado con esta pregunta: How to redirect ex command output into current buffer or file?¿Cómo capturo la salida de un comando vim en un registro, sin las nuevas líneas?

Sin embargo, el problema con el uso :redir es que hace 3 o 4 nuevas líneas adicionales en frente de la salida, y que parecen ser difíciles de eliminar mediante la función de sustituto.

Por ejemplo, si hago lo siguiente:

:redir @a 
:pwd 
:redir END 

El contenido de @a constan de tres líneas en blanco y entonces la salida esperada normal.

Me trataron de publicar proceso con algo como esto:

:let @b = substitute(@a, '\s*\(.\{-}\)\s*', '\1', '') 

Pero el resultado es que @b tiene el mismo contenido que @a.

¿Alguien conoce una manera más efectiva (es decir, de trabajo) para posprocesar, o un reemplazo para :redir que no tiene esas líneas adicionales?

+3

¿Has probado con ': let @b = substitute (@a, '\ n', '', 'g')'? – Raimondi

+0

Acabo de intentarlo. ¡Eso funcionó increíblemente bien! Ahora me siento estúpido. = P – merlin2011

Respuesta

4

El valor en el registro b es igual a la del valor en el un registro porque su expresión regular está fallando para que coincida.

  1. Debe escribir agrupando paréntesis y la llave de repetición de apertura con barras invertidas.
    Ver :help /magic; efectivamente, la opción magic está siempre activa para substitute() regexps.
  2. \s only matches SP and TAB (no LF); pero \_s does include LF (alternativamente, puede usar \n para que coincida con LF).
  3. Debe anclar el final de la expresión para que \{-} no se "rinda" sin hacer coincidir nada (todo excepto las líneas nuevas iniciales no coincidentes, y por lo tanto no reemplazado de la cadena de entrada).

Aquí es una versión modificada de su substitución:

:let @b = substitute(@a,'\_s*\(.\{-}\)\_s*$','\1','') 

Puede ser más fácil de sólo pensar en la eliminación de espacio inicial y final en lugar de hacer coincidir todo en el medio. Esto se puede hacer en una única sustitución utilizando el modificador de sustitución g (sustituciones repetidas) con una expresión regular que utiliza el alternation operator donde una alternativa está anclada al inicio de la cadena (%^) y la otra está anclada al final de la cadena (%$).

substitute(@a,'\v%^\_s+|\_s+%$','','g') 

Esta expresión regular utiliza \v para evitar tener que añadir barras invertidas para %^, +, | y %$.

Cambie las dos apariciones de \_s a \n si solo desea recortar nuevas líneas finales/finales (en lugar de SP, TAB o NL).

+0

De acuerdo con el documento, 'substitute()' siempre actúa como si se hubiera configurado 'magic'. – ZyX

+0

@ZyX: Buen punto; actualizado a en consecuencia. –

Cuestiones relacionadas