Come selezionare tra parentesi (o virgolette o ...) in Vim?


219

Sono sicuro che esistesse un plugin per questo genere di cose, ma ora che ne ho bisogno, non riesco a trovarlo (naturalmente), quindi chiederò semplicemente carino e semplice.

Qual è il modo più semplice per selezionare tra parentesi, virgolette o in genere un elenco di caratteri corrispondenti?

   write ( *, '(a)' ) 'Computed solution coefficients:'

Ad esempio, qui vorrei selezionare (a), oppure Computed solution coefficients:.

Non mi interessa il multiline, solo i casi che si verificano su una riga.

Risposte:


276

Usa il tasto di navigazione che vuoi inserire tra parentesi, quindi puoi usare yi(o yi)per copiare tutto all'interno delle parentesi corrispondenti. Funziona anche con parentesi quadre (ad es. yi]) E parentesi graffe. Inoltre y, puoi anche eliminare o modificare il testo (ad esempio ci), di]).

Ho provato questo con virgolette doppie e singole e sembra funzionare anche lì. Per i tuoi dati, faccio:

write (*, '(a)') 'Computed solution coefficients:'

Spostare il cursore su C, quindi digitare yi'. Spostare il cursore su una riga vuota, premere pe ottenere

Computed solution coefficients:

Come ha osservato CMS , questo funziona per la selezione della modalità visiva, come pure - solo l'uso vi), vi}, vi', etc.


1
In genere cerco un modo per selezionare tutto tra caratteri di corrispondenza predefiniti (normalmente solo virgolette singole e doppie e parentesi di ogni tipo).
Rook,

2
Cosa intendi con parole separate? L'ho provato su "[x, y, z]" e ha selezionato "x, y, z"
Tim Whitcomb,

4
Ignora l'ultimo commento: ho scoperto quale fosse il problema. Funziona come un fascino :-)
Rook,

sembra funzionare anche con le virgolette e yi"selezionare tutte le virgolette
stefanB

ci(o lo ci)fa per quello che stavo cercando. Grazie. In iquel caso non capisco ancora del tutto , ma chi se ne frega finché funziona, giusto? :)
justnorris,

279

Per selezionare tra le virgolette singole di solito faccio un vi' ("seleziona virgolette singole interne").

All'interno di un blocco tra parentesi, utilizzo vib ("seleziona blocco interno")

All'interno di un blocco di parentesi graffe che puoi usare viB("maiuscola B")

Per rendere le selezioni "inclusive" (selezionare anche le virgolette, le parentesi o le parentesi graffe) che è possibile utilizzare al aposto di i.

Puoi leggere ulteriori informazioni sulla selezione degli oggetti di testo nel manuale o :help text-objectsall'interno di vim.


grazie per quel suggerimento, ho cercato e chiesto qualcosa di simile e non ero soddisfatto dei miei risultati. Eccezionale.
Alfredoodeza,

questo suggerimento è molto semplice e facile da impegnare nella mia memoria cerebrale e muscolare. Grazie.
Ghazaly,

Questo è un consiglio molto utile. Non dovrai più armeggiare con i tasti aggiuntivi. Grazie per il link.
Rai,

27

Questo metodo di selezione è integrato e ben coperto nella guida di Vim. Copre tag XML e altro ancora.

Vedere :help text-objects.


1
: aiuta gli oggetti di testo ad avvicinarsi alle cose utili ... potresti almeno menzionare alcuni dei più comuni, come un "e un (quando in modalità visiva.
Stobor,

2
(Inoltre, +1 perché nonostante sia un utente vim di
vecchia data

@Stobor. Saluti risolto quel riferimento
michael

21

Per selezionare tra virgolette singole utilizzare vi'.

Per selezionare tra parentesi usare vi(.


3
Nota: ci'o ci(per modificare anziché selezionare visivamente. Ma fa esattamente quello che volevo. Grazie :)
Justnorris,

Il secondo funziona solo quando si trova all'interno di quel blocco (), quindi di solito lo faccio %vi(o%vib
816-8055

7

Utilizzare le frecce o hjklper accedere a una delle espressioni di bracketing, quindi vper selezionare la modalità visiva (cioè selezione), quindi %per passare all'altra parentesi.


5
(non fa citazioni, sfortunatamente, però ...)
Stobor,

3

Scrivi una funzione Vim in .vimrc usando la searchpairfunzione integrata:

searchpair({start}, {middle}, {end} [, {flags} [, {skip}
            [, {stopline} [, {timeout}]]]])
    Search for the match of a nested start-end pair.  This can be
    used to find the "endif" that matches an "if", while other
    if/endif pairs in between are ignored.
    [...]

( http://vimdoc.sourceforge.net/htmldoc/eval.html )


2

Aggiungerei un dettaglio alla risposta più votata:

Se stai usando gvim e vuoi copiarlo negli appunti, usa

"+<command>

Per copiare tutto il contenuto tra parentesi (o parentesi graffe o parentesi graffe)

Ad esempio: "+yi}copierà negli appunti tutto il contenuto tra le parentesi graffe del cursore.


2
Questo è completamente ortogonale al problema e non dovrebbe essere una risposta. Puoi scrivere questo su ogni domanda che ti pone y.
pipe

Questa è un'aggiunta alla risposta, non una risposta stessa.
yuriploc,

Quindi dovrebbe essere una modifica a quella risposta, questo post così com'è non risponde alla domanda.
pipe

Questa è una pubblicità per NON usare gvim :) Chi ha bisogno di altri due turni + tasti nella loro vita?
Paul Parker,

1

Ho creato un plugin vim-textobj-quotes: https://github.com/beloglazov/vim-textobj-quotes

Fornisce oggetti di testo per le coppie di virgolette più vicine di qualsiasi tipo. L'utilizzo di solo iqo aqconsente di operare sul contenuto delle virgolette singole ('), doppie (") o indietro (`) che attualmente circondano il cursore, sono davanti al cursore o dietro (in quell'ordine di preferenza) In altre parole, salta avanti o indietro quando necessario per raggiungere le virgolette.

È più facile da capire guardando esempi (il cursore è mostrato con |):

  1. Prima foo '1, |2, 3' bar:; dopo aver premuto diq:foo '|' bar
  2. Prima foo| '1, 2, 3' bar:; dopo aver premuto diq:foo '|' bar
  3. Prima foo '1, 2, 3' |bar:; dopo aver premuto diq:foo '|' bar
  4. Prima foo '1, |2, 3' bar:; dopo aver premuto daq:foo | bar
  5. Prima foo| '1, 2, 3' bar:; dopo aver premuto daq:foo | bar
  6. Prima foo '1, 2, 3' |bar:; dopo aver premuto daq:foo | bar

Gli esempi sopra riportati sono riportati per virgolette singole, il plugin funziona esattamente allo stesso modo per virgolette doppie (") e back (`).

È inoltre possibile utilizzare tutti gli altri operatori: ciq, diq, yiq, viq, etc.

Si prega di dare un'occhiata alla pagina github collegata sopra per maggiori dettagli.


-6

Una semplice keymap in vim risolverebbe questo problema. map viq F ”lvf” hh Questo comando sopra associa viq ai tasti per cercare tra virgolette. Sostituisci "con qualsiasi carattere e crea le tue mappe. Attivalo in vimrc durante l'avvio e dovresti essere in grado di usarlo ogni volta.

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.