Puoi prendere o cancellare tra parentesi in vi / vim?


128

Data questa riga di codice in C:

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));

C'è un modo per cancellare o strappare dalla prima parentesi in grassetto alla sua parentesi corrispondente? Ho pensato a df) , ma questo ti porterà solo dopo il 9.0.

C'è un modo simile per ottenere VIM per afferrare tutto tra parentesi graffe corrispondenti, indipendentemente dalle nuove linee?

Risposte:


167

Vari movimenti:%

Il %comando passa alla corrispondenza dell'elemento sotto il cursore. Posiziona il cursore sulla paren di apertura (o chiusura) e usa y%per strattonare od% per cancellare tutto dal cursore alla paren corrispondente.

Questo funziona perché %è un "comando di movimento", quindi può essere usato ovunque vim si aspetti un tale comando. Da :help y:

["x]y{motion}       Yank {motion} text [into register x].  When no
                    characters are to be yanked (e.g., "y0" in column 1),
                    this is an error when 'cpoptions' includes the 'E'
                    flag.

Per impostazione predefinita, "item" include parentesi, parentesi graffe, parentesi, commenti in stile C e varie istruzioni precompilatore ( #ifdef, ecc.).

C'è un plugin per la "corrispondenza% estesa" che puoi trovare sulla homepage di Vim .

È possibile leggere la documentazione %e i relativi comandi di movimento accedendo :help various-motionsalla modalità comandi.

oggetto di selezione

Esiste un altro set di comandi di movimento che è possibile utilizzare in modalità Visual per selezionare vari oggetti di testo.

Per risolvere il tuo problema specifico, esegui le seguenti operazioni:

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                   ^

Supponiamo che il cursore sia posizionato su ^. Immettere la sequenza seguente per selezionare la parte che si sta cercando:

v2a)

Innanzitutto ventra in modalità Visual, quindi specifichi che vuoi salire di 2livello su parentesi. Alla fine a)seleziona "un blocco". Dopodiché puoi usare do xper cancellare, ecc.

Se non vuoi includere le parentesi esterne, puoi invece usare "blocco interno":

v2i)

Vedere :help object-selectl'elenco completo dei comandi correlati.


Grazie! Conoscevo il% di passaggio tra gli articoli corrispondenti; non sapevo che fosse utile anche all'interno dei comandi. +1 e accettato.
Romandia,

5
Interessante, ho sempre pensato che asignificasse "in giro" piuttosto che "a". Senti che integra meglio "interiore". Sembra che non passi un giorno non imparando qualcosa di nuovo su Vim.
Andrew Marshall,

217

Che dire di dibo di(.

Elimina il blocco interno (...) in cui si trova il cursore.

Adoro i movimenti e le selezioni di oggetti di testo !


10
Fortunatamente, questa domanda è il primo successo quando cerco su Google - non so quante volte questa risposta mi ha salvato. E lo dimentico sempre ... :-(
Konrad Rudolph,

16
È possibile eliminare anche le parentesi? (sì, ho risposto alla mia domanda: dab=> elimina un blocco (comprese le parentesi)
bantic

5
Voto in alto. Inoltre, se si desidera correggere la parola tra parentesi, fare ciw .
Sviluppatore Marius Žilėnas,

5
+1! Sono rimasto sbalordito quando di recente ho scoperto movimenti di oggetti di testo! non cercare più di posizionare il cursore nel punto giusto per strappare il testo: D
verboze

36

Per eliminare tutto ciò che si trova all'interno di una coppia di parentesi, è sempre possibile emettere di(e i suoi derivati.

Nota :

Come suggerito da @porglezomb nel suo commento, puoi usare a("insieme a") invece di i("dentro") per includere le parentesi. Quindi, usando da(elimina tutto dentro (e )incluso (e ).

Eliminazione del testo all'interno della coppia di parentesi esterna immediata:

Quindi, per questa riga di codice

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                ^       ^
                                |       |
                                 \_______\___---> Cursor range

supponendo che il cursore si trovi all'interno dell'intervallo del cursore sopra menzionato, è possibile emettere i seguenti comandi:

di(   --> Deletes '5.0/9.0'
ci(   --> Substitutes '5.0/9.0'
yi(   --> Yanks '5.0/9.0'

Eliminazione del testo all'interno dell'ennesima parentesi esterna:

Per afferrare tutto all'interno dell'ennesima parentesi esterna, basta aggiungere nprima del comando sopra. Quindi, con la stessa posizione del cursore sopra,

2di(   --> Deletes '(5.0/9.0) * (fahr-32)'
2ci(   --> Substitutes '(5.0/9.0) * (fahr-32)'
2yi(   --> Yanks '(5.0/9.0) * (fahr-32)'

3di(   --> Deletes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3ci(   --> Substitutes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3yi(   --> Yanks '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'

3
Dovresti aggiungere una nota di cui parliamo acome controparte i, poiché è probabile che aiuti molte persone.
porglezomp

@romandas questa dovrebbe essere la domanda accettata. Oggi stavo cercando lo stesso identico problema e @Kevin è l'unico qui a dare la risposta corretta. Certo, potrei "abusare" %di questo problema, ma ciò richiede più tempo e, a mio avviso, dovrebbe essere utilizzato solo per scenari più complessi. L'eliminazione di qualcosa all'interno di un determinato ambito è esattamente il caso d'uso di.
daniel451,

19

È possibile utilizzare d%per l'eliminazione e y%per lo strappo.


3
% è l'identificatore di movimento per "parentesi, parentesi o parentesi corrispondente". Qualsiasi specifica di movimento può essere accoppiata con d e y (e molte altre cose).
caos

10

Posiziona il cursore sulla prima parentesi, quindi premi v%yo v%d.


3
Grande! % passa alla paren corrispondente. Quindi puoi persino usare d% e y%.

1
Si noti inoltre che 'd%' può iniziare all'inizio di un nome di funzione e cancellerà l'intera chiamata di funzione. Funziona anche per le coppie '{}', '[]' e persino '<>'.
Jonathan Leffler,

@Leffler, grazie per i suggerimenti! Ed è bene sapere che% funziona anche in modalità visiva.
Strager

3

Prova ci [block-surrounder]

Nel tuo caso, posiziona il cursore in qualsiasi punto tra le 2 parentesi evidenziate e prova i tasti: ci (


Quasi. Provando questo, sembra che il cursore debba trovarsi sulla prima parentesi, non tra, e 'c' è il comando change. Con il cursore sulla parentesi aperta, 'di (' cancella la parentesi chiusa corrispondente, e 'yi (' strattona.
Richard Neish,

ci lavora sempre per me. Tutto quello che devo fare è assicurarmi che il cursore si trovi tra quelle parentesi che circondano il blocco di testo che devo eliminare.
Justin Nguyen,

2

Come dice la risposta di David Norman,

Posiziona il cursore sulla prima parentesi, quindi premi v%yo v%d.

Spiegazione da http://vimdoc.sourceforge.net/htmldoc/vimindex.html :

tagga azione nota char in modalità Normale        
-------------------------------------------------- ----------------------------
| V | v avvia la modalità visuale in modo caratteristico
|% | % 1 trova la parentesi quadra successiva (riccia / quadrata)
                                       questa linea e vai alla sua corrispondenza, o vai a
                                       parentesi di commento corrispondente o vai alla corrispondenza
| D | ["x] d {motion} 2 elimina il testo di Nmove [nel buffer x]

Ciò significa che selezionerà tutto tra e includendo le due parentesi ( %) mentre ti mostra visivamente la selezione ( v) e quindi strappa / copia yo elimina / taglia d. (Al buffer predefinito.)

Puoi mettere / incollare con p.

Ha dato questa risposta a "insegnami a pescare" .


nota: vimdoc.sourceforge.net è collegato da vim.org che è il sito ufficiale di vim dal 2015.
n611x007
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.