2013-08-29 10 views
5

Conservo un diario degli incontri a cui ho preso parte.Come eliminare tutti i paragrafi in cui non è presente un motivo?

Ogni incontro:

  • è separato da una riga vuota (-> ogni incontro è un paragrafo)
  • è ripiegato grazie ad un'espressione
  • contiene una linea con i corrispondenti tag: ACME, GMBH, SARL, ecc ...

Quando voglio fare una revisione di tutti gli incontri che ho avuto con, ad esempio, ACME,

  • Creo un buffer scratch (:% y, seguito da: tabnew, seguito da incolla)
  • e desidero eliminare tutti i paragrafi in cui ACME non figura.

Questo è dove ho un problema.

so come cercare/cancellare da linee:

:v/ACME/d 

Ma come faccio a fare che dal paragrafo (in modo da mantenere l'intero paragrafo in cui le figure ACME, e non l'unica linea di tag)?

NB: il modello ACME può figurare più di una volta in questi paragrafi.

risposta

6

Questo funziona:

let @r="" | execute("g/acme/ normal \"Rdap") | %d | put r 

Va a ogni paragrafo contenente "acme", ed eliminarlo aggiungendo registrare r. Quindi cancella tutto e mette il registro r.

Come si vede, il trucco base è l'utilizzo del registro maiuscolo per aggiungerlo, invece di sostituirlo. Ciò richiede anche la reimpostazione del registro all'inizio, per eliminare i contenuti del registro precedente.

Questo funziona correttamente per i paragrafi con più occorrenze di "acme", in quanto l'intero paragrafo viene eliminato dopo la prima corrispondenza e, quindi, non viene nuovamente associato.

+0

Wow, davvero sorpreso che 'esegui' con parentesi non dà un errore di sintassi. Non l'ho mai visto prima, normalmente è scritto "esegui" ... "". – glts

+0

@glts stesso qui! ;) Ho anche cercato ': h execute()' per vedere se c'è una funzione .. comunque, questo fa il lavoro +1 !!e sarebbe meglio se all'inizio si salvi il valore di '@ r' e alla fine lo si ripristini. – Kent

+1

@glts Ho provato 'echo (" foobar ")' e 'echo (" foo "). (" Barra ")' funziona anche. sembra che finché l'espressione tra '()' restituisce una stringa valida (o potrebbe essere convertita in str), funzionerebbe. il '(e)' ha migliorato la leggibilità. :) – Kent

3

lo farei con awk, in vim si potrebbe:

%!awk -v RS="" -v ORS="\n\n" '/ACME/' 

poi rimarranno solo i paragrafi che contengono ACME.

+0

Grazie per la risposta, ma non ho awk sul mio dispositivo Android (solo sul mio computer). È impossibile in Vim da solo? – ThG

+0

@ThG beh è sicuramente possibile, ma non sarà più un lavoro da tastiera ... – Kent

+0

Ho provato: v/'{ACME'}/d ... e ho cancellato tutto (ancora non capisco perché) . Grazie ancora. – ThG

Problemi correlati