2009-09-25 13 views
38

Come si fanno scorrere tutte le linee corrispondenti in un buffer?Come faccio a trascinare tutte le linee corrispondenti in un buffer?

Dato un file, come:

match 1 
skip 
skip 
match 2 
match 3 
skip 

voglio essere problema in grado un comando per tirare tutte le righe che corrispondono a un modello (/^partita/per questo esempio) in un unico buffer in modo che posso mettere in un altro documento, o in un sommario o altro.

Il comando deve finire con questo in un buffer:

match 1 
match 2 
match 3 

Il mio primo pensiero è stato quello di provare:

:g/^match/y 

Ma ottengo solo l'ultima partita. Questo ha senso, perché il comando: g sta ripetendo efficacemente lo y per ogni riga corrispondente.

Forse c'è un modo per aggiungere uno strattone al buffer, piuttosto che sovrascriverlo. Non riuscivo a trovarlo.

+1

Ho fatto questo genere di cose tutto il giorno e ho trovato la soluzione per essere meno che mi piacerebbe. Faccio 'qaq' seguito da': g/pattern/normal "AY' (non ho notato il comando: yank prima) poi vado nel mio buffer e lo incollo Non c'è un modo diretto per reindirizzare direttamente in un buffer? (In precedenza avevo fatto ': redir @ a':: g/pattern /' ': redir END', quindi questo è certamente un passo nella giusta direzione, ma voglio solo uno .più passo ...) :-) Suppongo di poter scrivere una funzione abbastanza facilmente ... –

+0

Ho entrambi sviato questa domanda perché mi è stato utile e ho votato per chiuderla perché è l'unico modo che vedo per dire "questo dovrebbe essere su superuser.com "È una bella domanda, ma penso che sia il posto giusto per questo.Spiace che un voto" vicino "sia l'unico modo per votare per spostare –

+0

@NathanLong, credo che questa domanda sia precedente al superutente. – daotoad

risposta

14
:help registers 
:help quote_alpha 

Specificare una lettera maiuscola, come il nome del registro in modo da aggiungere ad esso, come :yank A.

67

:g/^match/yank A

Questo esegue il comando globale per tirare qualsiasi linea che corrisponde ^match e metterlo nel registro a. Poiché a è in maiuscolo, anziché impostare semplicemente il registro sul valore, verrà aggiunto ad esso. Dato che il comando globale esegue il comando su tutte le linee corrispondenti, come risultato si otterranno tutte le linee unite tra loro.

Ciò significa che probabilmente si desidera ripristinare il registro su una stringa vuota prima di iniziare: :let @a="".

E naturalmente, è possibile utilizzare lo stesso con qualsiasi registro denominato.

+22

Ciò che è implicito qui è che non si può aggiungere al buffer senza nome, almeno non in un singolo comando. Potrebbe anche essere necessario cancellare prima il buffer: : let @ a = "" –

+8

Solo un suggerimento se si ottimizzano i tratti dei tasti. La cancellazione del registro può essere eseguita più rapidamente, registrando la macro qaq vuota. – slawek

+0

@ J.A.Faucett senza nome * register *, non buffer. Inoltre, è possibile farlo ([basato su questa risposta] (http://stackoverflow.com/a/18536633/210945)): ':% g/regexp/let @" = @ ". Getline ('. ') '. Unisce le linee insieme, anche se potrebbe esserci un modo per aggirarle. – naught101

7

Oh ho capito dopo aver commentato in precedenza che è facile dare uno strattone le linee corrispondenti in un buffer temporaneo ...

:r !grep "pattern" file.txt

Le soluzioni più semplici vengono una volta che hai rinunciato a trovare loro. :)

+1

': call setreg ('a', system ('grep" modello "file.txt'))' o semplicemente ': let @ a = system ('grep" modello "file.txt')' se lo si desidera un registro. – sabgenton

+2

Una soluzione più generale può usare 'expand ('%')' per il nome file del buffer corrente, ad es. ': let @ a = system ('grep" modello "' .expand ('%'))' –

Problemi correlati