Come posso inserire del testo al centro della riga su più righe in Vim?


91

Diciamo che ho dieci righe e voglio anteporre il testo a una parola che compare in quelle righe? Non deve essere all'inizio della riga.

A partire dal:

sdfsd   foo sdfsd
sfsd    foo fsdf
sdfsdf  foo  sdfsdf

per:

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

È anche possibile non solo anteporre bar(ma circondare foocon bar(foo)?

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

Uso Vim / GVim 7.2.


1
I commenti in stile C sono / * * / I commenti in stile BCPL sono //
William Pursell

Risposte:


169

Andare al primo foo, premere Ctrl- vper accedere alla modalità blocco visivo e premere fino a quando tutte le linee con foosono contrassegnate. Quindi premere Shift- iper inserire all'inizio (del blocco). Quando hai finito e premi Esc, i caratteri inseriti verranno aggiunti a ciascuna riga a sinistra del blocco contrassegnato.

Per inserire alla fine, premere di nuovo Ctrl- v, spostarsi su / giù per contrassegnare tutte le righe interessate e quindi premere Endo $per estendere la selezione fino alla fine delle righe. Ora puoi premere Shift- aper aggiungere alla fine di tutte le righe, proprio come in precedenza con Shift- i.

La selezione visiva può essere effettuata anche con normali comandi di movimento. Quindi, per commentare un intero blocco in C, puoi spostarti sulla parentesi graffa di apertura e digitare Ctrl- v % Shift- i // Esc.


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

3
Una variazione della risposta è contrassegnare il blocco visivo con MAIUSC + V quindi modificare il blocco in modalità Ex:: '<,'> s / ^ / prexix_text /: '<,'> s / $ / suffix_text / Nota di "'< , '> "viene stampato automaticamente da vim quando si preme": ".
dimba

1
Per rimuovere i commenti utilizzare il blocco visivo (contrassegnare con Ctrl + V). Una delle colonne con il segno di commento "//" è contrassegnata, premere "d" per rimuovere i commenti. non dimenticare anche i commenti C ++ (/ ** /) :)
dimba

9
Vale la pena notare che in Linux dovevo uscire dalla modalità di inserimento prima che il prefisso fosse applicato a tutte le righe, ed è una maiuscola di cui avevo bisogno per entrare in modalità di inserimento dalla modalità visuale - cioè Maiusc + I, digita prefisso, Escape, Escape.
Joshua Enfield

6
Questo non funziona con lo stucco. Quando premo inon succede niente. Quando premo shift+ila selezione scompare ma riesco a inserire il testo (nel punto corrente in cui si trova solo il cursore).
Jürgen Paul

44

Per rispondere alla tua prima domanda, la sotto

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

cercherà fooe circonderà il modello abbinato con bar(). Lo /gfaranno più volte in una riga.

Dato che stai solo abbinando foo, potresti fare un semplice :s/foo/bar(foo)/g. Quanto sopra funzionerà, tuttavia, se decidi di trovare una corrispondenza su un'espressione regolare piuttosto che su una semplice parola (esf[a-z][a-z] ). La "&" sopra rappresenta ciò che hai trovato.


Ho avuto una risposta lunga e lunga con le macro. Questo è molto più semplice :-)
Brian Ramsay

Come lo fai per più righe? Un caso pratico è quando si dispone di un blocco di codice costituito da righe simili che richiedono questa sostituzione.

Sembra che funzioni su tutte le righe ... nota:% se / g.
ojrac

ciò che è interessante è che:% s / foo / bar (&) / gc non conferma - "c" non ha effetto .. Ugh

1
Il testo tra :e e sdetermina su quali righe opera. Niente significa solo la linea corrente. 1,30indica le righe da 1 a 30 (incluse). '<,'>indica le linee nella selezione visiva corrente.
rampion

17

Per prefissare un insieme di linee utilizzo uno dei due diversi approcci:

Un approccio è la selezione del blocco (menzionata da qc). In generale, puoi selezionare una regione rettangolare con ctrl-Vseguito dal movimento del cursore. Dopo aver evidenziato un rettangolo, premendo shift-Isi inseriranno dei caratteri sul lato sinistro del rettangolo o shift-Ali accoderà sul lato destro del rettangolo. Quindi puoi usare questa tecnica per creare un rettangolo che includa la colonna più a sinistra delle linee a cui vuoi aggiungere il prefisso, premere shift-I, digitare il prefisso e quindi premere Esc.

L'altro approccio consiste nell'usare una sostituzione (come menzionato da Brian Agnew). La sostituzione di Brian avrà effetto sull'intero file (il% nel comando significa "tutte le righe"). Per influenzare solo poche righe, l'approccio più semplice è shift-Vpremere (che abilita la modalità visual-line) mentre si è sulla prima / ultima riga, e poi passare all'ultima / prima riga. Quindi digita:

:s/^/YOUR PREFIX/

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

Suggerimento extra: se il prefisso contiene barre, è possibile eseguire l'escape con barra rovesciata oppure utilizzare un carattere di punteggiatura diverso come separatore nel comando. Ad esempio, per aggiungere commenti di riga C ++, di solito scrivo:

:s:^:// :

Per aggiungere un suffisso, l'approccio della sostituzione è generalmente più semplice a meno che tutte le linee non siano esattamente della stessa lunghezza. Usa solo $ per il pattern invece di ^ e la tua stringa verrà aggiunta invece di pre-attesa.

Se vuoi aggiungere un prefisso e un suffisso contemporaneamente, puoi fare qualcosa del genere:

:s/.*/PREFIX & SUFFIX/

Il. * Corrisponde all'intera riga. La & nella sostituzione rimette il testo corrispondente (l'intera riga), ma ora avrà il prefisso e il suffisso aggiunti.

BTW: quando commentate il codice probabilmente vorrete rimuoverlo in seguito. Puoi usare visual-block ( ctrl-V) per selezionare le barre e poi premere d per cancellarle, oppure puoi usare una sostituzione (probabilmente con una selezione di riga visiva, fatta con shift-V) per rimuovere le barre iniziali in questo modo:

:s:// ::

6

: normale in soccorso!

:%norm Wibar(

:%norm WEa)

: norm (al) riproduce i comandi come se li avessi digitati:

W - passa alla parola successiva

i - avvia la modalità di inserimento

bar (- digita la sequenza 'bar ('

O in una riga:

:%norm Wibar(ctrlvESCEa)

Se utilizzi Windows, digita ctrlqinvece di ctrlv.


3

Un'altra possibilità (probabilmente non così utile nel tuo caso di prova, ma utile in altre situazioni) è quella di delimitare l'area che vuoi cambiare con i segni.

  • Posizionare il cursore in un punto qualsiasi della riga superiore e premere 'a
  • Posizionare il cursore in un punto qualsiasi dell'ultima riga e premere 'b
  • Emetti il ​​comando :'a,'b s/foo/bar(&)/

Di solito mi piace la modalità blocco visivo se tutto è visibile sullo schermo e di solito preferisco i segni se l'inizio e l'arresto sono separati da molti schermi.


Dovrebbe essere minvece di 'impostare un nuovo marker. 'serve per saltare alla linea di un marker esistente. `salta alla riga e alla colonna di quel marcatore.
tiktak

1

Un'altra semplice espressione regolare è:

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

0

Per i commenti in stile C, usa la risposta regexp di Brian, abbina la fine della riga $e inseriscila.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.