2011-12-10 9 views
5

questo è legato a questa domanda: How to redirect ex command output into current buffer or file?Come posso acquisire l'output di un comando vim in un registro, senza le nuove righe?

Tuttavia, il problema con l'utilizzo :redir è che provoca 3 o 4 newlines supplementari davanti della produzione, e sembrano essere difficili da rimuovere utilizzando la funzione sostitutiva.

Ad esempio, se faccio la seguente:

:redir @a 
:pwd 
:redir END 

Il contenuto di @a costituiti da tre righe vuote e poi il normale output previsto.

ho cercato di inserire processo con qualcosa di simile:

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

Ma il risultato è che @b ha lo stesso contenuto @a.

Qualcuno sa un modo più efficace (cioè di lavoro) di postelaborazione, o una sostituzione per :redir che non ha quelle linee extra?

+3

Hai provato con ': let @b = sostituto (@a, '\ n', '', 'g')'? – Raimondi

+0

Ho appena provato. Ha funzionato incredibilmente bene! Ora mi sento stupido. = P – merlin2011

risposta

4

Il valore nel registro b è invariato rispetto al valore in un registro perché la vostra espressione regolare non riesce a corrispondere.

  1. è necessario scrivere parentesi di raggruppamento e la parentesi graffa di apertura ripetizione con con il backslash.
    Vedi :help /magic; efficacemente, l'opzione magic è sempre attiva per substitute() espressioni regolari.
  2. \s only matches SP and TAB (non LF); ma \_s does include LF (in alternativa, è possibile utilizzare \n per corrispondere semplicemente a LF).
  3. È necessario ancorare la fine dell'espressione in modo che lo \{-} non "si arrenda" senza corrispondere a nulla (tutto tranne le nuove righe iniziali non corrispondenti e quindi non rimodulate dalla stringa di input).

Ecco una versione modificata della sostituzione:

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

Potrebbe essere più semplice di pensare solo sull'eliminazione spazi iniziali e finali, invece di corrispondenza tutto il resto. Questo può essere fatto in una singola sostituzione usando il modificatore di sostituzione g (sostituzioni ripetute) con un'espressione regolare che utilizza lo alternation operator dove un nodo alternativo è ancorato all'inizio della stringa (%^) e l'altro è ancorato alla fine della stringa (%$).

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

Questa espressione regolare utilizza \v per evitare di dover aggiungere backslash per %^, +, | e %$.

Modificare entrambe le occorrenze di \_s a \n se si desidera solo tagliare le nuove righe iniziali/finali (anziché SP, TAB o NL).

+0

Secondo il documento, 'sostituto()' agisce sempre come se fosse stato impostato 'magico'. – ZyX

+0

@ZyX: buon punto; aggiornato di conseguenza. –

Problemi correlati