2012-05-04 14 views
5

voglio fare quanto segue per più file con Vim:Vim: Per di più file: Copia tutto il testo, Sostituisci e incollare

  1. Copiare tutto il testo in ogni file
  2. Sostituire un testo
  3. Incolla il testo copiato alla fine del ogni file
  4. Sostituire qualche altro testo

Qui sono i miei comandi per un file:

:%y 
:%s/old1/new1/g 
:G 
:P 
:%s/old2/new2/g 

Qualcuno può dirmi la sintassi per farlo? Soprattutto che sono nuovo di Vim!

Ho scoperto che argdo può eseguire comandi su più file. Ho trovato molti esempi per usare argdo nella sostituzione del testo, ma non ho trovato la sintassi per usare argdo con:% y,: G, o: P

Grazie.

risposta

4

Come @ib detto, mi piacerebbe fare questo con comandi ex

:argdo %y | %s/old1/new1/g | $pu | %s/old2/new2/g 

C'è anche una buona probabilità che si potrebbe desiderare di operare su linee esclusive (fare il suo primo cambio solo sulla prima parte, e la seconda solo al secondo):

:argdo $mark a | %co$ | 1,'a s/old1/new1/g | 'a,$s/old2/new2/g 

per consentire sostituzioni non corrispondenti, aggiungere s///e e aggiungere silent! per rendere il funzionamento più veloce nel caso di molti file.

:silent! argdo $mark a | %co$ | 1,'a s/old1/new1/ge | 'a,$s/old2/new2/ge 

(notare che argdo aspetta un elenco Ex comandi per impostazione predefinita. Si potrebbe usare, ad esempio argdo norm! ggyG di utilizzare la modalità normale comandi)

+0

Che bello! Funziona Ho appena aggiunto | w al primo comando : argdo% y | % s/old1/new1/g | $ pu | % s/old2/new2/g | w – Pansy

+1

@ Pansy. Giusto. Buona chiamata Ho sempre ": autowrite autoread' abilitato (ho comunque un annullamento persistente e il controllo della versione per il resto) – sehe

+1

In caso di necessità di eseguire ognuna delle due sostituzioni solo su una copia del testo originale, si può evitare di impostare un segno manualmente: ': argdo% y |% s/o1/n1/g | $ pu | '[, $ s/o2/n2/g'. –

3

UPD: il mio Vim-fu non è forte come quelli di @ ib o di @ sehe, quindi potresti voler usare le soluzioni suggerite al posto del mio.

Tuttavia, la mia soluzione è più facile da modificare e eseguire il debug personalmente per me (come un apprendista Vim), quindi lascia che sia qui comunque.


È possibile aggiungere la seguente funzione temporanea nel vimrc:

function! MyTmpFunc() 
    :%y 
    :%s/old1/new1/g 
    normal! G 
    normal! P 
    :%s/old2/new2/g 
endfunction 

quindi riavviare Vim con i file necessari per influenzare (qualcosa come vim myfile1.txt myfile2.txt myfile3.txt), ed eseguire il seguente comando:

:argdo call MyTmpFunc()

Questo è quello che hai descritto nella tua domanda: funzione MyTmpFunc() w essere chiamato per ogni argomento dato a Vim.

Ora è possibile eliminare MyTmpFunc() da vimrc.

Si noti inoltre con :bufdo - chiama un comando per ciascun buffer aperto. C'è anche :windo, che esegue il comando per ogni finestra, ma personalmente ho trovato il :bufdo il più utile.

Inoltre, non è necessario creare una funzione temporanea se è necessario eseguire un solo comando in ciascun buffer. Dire, se è necessario solo per sostituire "old1" a "new1" in ogni buffer, quindi è possibile eseguire il seguente comando:

:bufdo %s/old1/new1/g

e il gioco è fatto.

+4

Uno non deve creare la funzione temporanea per eseguire diversi comandi Ex: ': argdo% y |% s/o1/n1/g | $ pu |% s/o2/n2/g'. –

+0

@ib come sempre ib, che meritava di essere una risposta. Ho aggiunto qualche altra idea nel mio – sehe

+0

@ib. si, il mio Vim-Fu non è così forte, mio ​​cattivo. Ma, il modo in cui ho suggerito è più facile da modificare e fare il debug di me personalmente (come un apprendista Vim), quindi lascia che sia qui comunque. (Ho aggiornato anche la mia risposta) –

Problemi correlati