2009-07-23 4 views
87

Dire che ho dieci righe e voglio anteporre il testo a qualche parola che si verifica in quelle righe? Non deve essere all'inizio della linea.Come posso anteporre il testo nel mezzo della linea a più righe in Vim?

Da:

sdfsd foo sdfsd 
sfsd foo fsdf 
sdfsdf foo sdfsdf 

a:

sdfsd bar(foo sdfsd 
sfsd bar(foo fsdf 
sdfsdf bar(foo sdfsdf 

E 'anche possibile non solo anteporre il bar( ma in realtà circondano foo con bar(foo)?

Vorrei anche un modo rapido per aggiungere i commenti // a più righe (commenti in stile C).

Uso Vim/GVim 7.2.

+1

C sono commenti in stile/* */ BCPL sono // –

+0

Correlati: [Come commentare una serie di linee che vengono selezionati in modalità visiva? ] (http://vi.stackexchange.com/q/130/467) su Vim SE – kenorb

risposta

163

Vai alla prima foo, premere Ctrl - v per attivare la modalità blocco visiva e premere verso il basso fino a quando tutte le linee con foo sono contrassegnati. Quindi premere Shift - i da inserire all'inizio (del blocco). Al termine e premere Esc, i caratteri inseriti verranno aggiunti a ciascuna riga alla sinistra del blocco contrassegnato.

Per inserire alla fine, premere nuovamente Ctrl - v, spostare su/giù per contrassegnare tutte le linee interessate e quindi premere Fine o $ per estendere la selezione fino alla fine delle linee. Ora è possibile premere Maiusc - un per aggiungere alla fine di tutte le linee, proprio come in precedenza con Maiusc - i.

La selezione visiva può essere eseguita anche con i normali comandi di movimento.Quindi, per commentare un intero isolato in C si potrebbe passare alla parentesi graffa di apertura e digitare Ctrl - v%Maiusc - i//Esc.

+5

Solo un'aggiunta: se Ctrl-V non avvia la modalità di blocco visivo in Vim su Windows, si dovrebbe usare invece Ctrl-Q. – Paul

+3

Una variazione di allora rispondere è quello di marcare blocco visivo con shift + V thenalter il blocco in modalità es: : '<,'> s/^/prexix_text/ :' <,'> s/$/suffix_text/ nota che "' <,'>" è stampato automaticamente da vim quando si preme ":". – dimba

+1

Per i commenti usare il blocco visivo (segnare con Ctrl + V). Una colonna con il segno di commento "//" è marcata premere "d" per rimuovere i commenti. non dimenticare i commenti C++ (/ ** /) troppo :) – dimba

44

Per rispondere alla tua prima domanda, il sotto

:%s/foo/bar(&)/g 

cercherà foo, e circondano il modello abbinato con bar(). Lo /g lo farà più volte in una riga.

Dato che si sta verificando l'abbinamento con foo, è possibile eseguire un semplice :s/foo/bar(foo)/g. Quanto sopra funzionerà, tuttavia, se decidi di far corrispondere un'espressione regolare piuttosto che una semplice parola (ad esempio f[a-z][a-z]). Lo '&' in quanto sopra rappresenta ciò che hai abbinato.

+0

Ho avuto una lunga risposta lunga con i macro. Questo è molto più semplice :-) –

+0

funziona su più righe? – maxwellb

+0

Come si fa per più linee? Un caso pratico è quando hai un blocco di codice costituito da linee simili che richiedono questa sostituzione. –

0

Per i commenti in stile C, utilizzare la risposta regexp di Brian e corrispondere alla riga che termina $ e inserire.

16

come prefisso un insieme di linee che uso uno dei due diversi approcci:

Un approccio è il blocco di selezione (menzionato da STH). In generale, è possibile selezionare un'area rettangolare con ctrl-V seguito dal movimento del cursore. Dopo aver evidenziato un rettangolo, premendo shift-I verranno inseriti caratteri sul lato sinistro del rettangolo oppure shift-A li aggiungerà sul lato destro del rettangolo. Quindi puoi usare questa tecnica per creare un rettangolo che includa la colonna più a sinistra delle linee che vuoi prefisso, premere shift-I, digitare il prefisso, quindi premere escape.

L'altro approccio è utilizzare una sostituzione (come menzionato da Brian Agnew). La sostituzione di Brian interesserà l'intero file (la% nel comando significa "tutte le linee"). Per influire su poche righe, l'approccio più semplice è quello di premere shift-V (che abilita la modalità visual-line) mentre si è sulla prima/ultima riga, quindi spostarsi sull'ultima/prima riga. Quindi digitare:

:s/^/YOUR PREFIX/ 

Il^è una regex (in questo caso, l'inizio della riga). Digitando questo in modalità linea visiva vedrai '<,'> inserito prima della s automaticamente. Ciò significa che la gamma della sostituzione sarà la selezione visiva.

Suggerimento extra: se il prefisso contiene barre, è possibile evitarli con il backslash oppure utilizzare un carattere di punteggiatura diverso come separatore nel comando. Ad esempio, per aggiungere commenti linea C++, io di solito scrivo:

:s:^:// : 

Per aggiungere un suffisso il metodo della sostituzione è generalmente più facile a meno che tutte le linee sono esattamente la stessa lunghezza. Basta usare $ per il pattern invece di^e la tua stringa verrà aggiunta anziché pre-pesa.

Se si desidera aggiungere un prefisso e un suffisso contemporaneamente, è possibile fare qualcosa di simile:

:s/.*/PREFIX & SUFFIX/ 

Il * corrisponde a tutta la linea.. Lo & nella sostituzione riporta il testo corrispondente (l'intera riga), ma ora avrà aggiunto il prefisso e il suffisso.

BTW: quando si commenta il codice probabilmente si vorrebbe decommentarlo in un secondo momento. È possibile utilizzare il blocco visivo (ctrl-V) per selezionare le barre e quindi premere d per eliminarle oppure è possibile utilizzare una sostituzione (probabilmente con una selezione della linea visiva, effettuata con shift-V) per rimuovere il leader barre come questo:

:s:// :: 
2

ancora un'altra possibilità (probabilmente non-così-utili nel vostro caso di test, ma a portata di mano in altre situazioni) è quello di delimitare l'area che si desidera modificare con i contrassegni.

  • posizionare il cursore in qualsiasi punto della riga superiore e premere 'un
  • posizionare il cursore in qualsiasi punto nell'ultima riga e premere ' il comandob
  • Problema :'a,'b s/foo/bar(&)/

Normalmente mi piace la modalità di blocco visivo se tutto è visibile su t lui schermo, e di solito preferisco segni se l'avvio e l'arresto sono separati da molti schermi.

+0

Dovrebbe essere 'm' invece di' ''per impostare un nuovo marker. ''' è per saltare alla linea di un marcatore esistente. '\' 'salta alla linea e alla colonna di quel marcatore. – tiktak

6

: normale per il salvataggio!

:%norm Wibar(

:%norm WEa)

: Norma (al) riproduce i comandi come se fossero stati digitati:

W - va alla successiva parola

i - inizia la modalità di inserimento

bar (- tipi sequenza 'bar ('

O in una sola riga:

:%norm Wibar(ctrlvCESEa)

Se si' ri eseguendo Windows quindi digitare ct rlq anziché ctrlv.

1

Un altro semplice espressione regolare è: commenti in stile

%s/^/<text you want to prepend>/