Vim racchiuso tra virgolette


6

Di 'che ho il seguente

printf(text goes here);

e seleziono "testo va qui" in modalità visiva ...
Come posso cambiarlo rapidamente in

printf("text goes here");

Risposte:


8

Questo ha lo scopo di rispondere alla domanda specifica che hai posto. Dichiari di aver selezionato visivamente del testo e vuoi racchiuderlo tra virgolette. Per farlo, esegui:

:s/\%V\(.*\)\%V/"\1"/

Per dividerlo in parti:

  • :ti permette di inserire i excomandi.

  • s/old/new/ è il solito comando sostitutivo.

  • \%V è un atomo non documentato per contrassegnare l'inizio del testo selezionato

  • \(.*\) seleziona tutto e salvalo nella selezione 1.

  • Il secondo \%Vindica la fine del testo selezionato.

  • Il testo di sostituzione è everyting che è stato selezionato, che è memorizzato in \1, circondato da citazioni: "\1".

Questo comando si applica riga per riga. Pertanto, potresti ottenere risultati indesiderati se il testo selezionato si estende su più righe.


1
Penso che ci sia un bug. printf(text goes here);diventa printf("text goes her"e);.
Cristian Ciupitu,

@CristianCiupitu Non mi è chiaro se si tratti di un vimbug o no. In entrambi i casi, una semplice soluzione consiste nell'evidenziare un personaggio in più.
Giovanni 1024,

Per la cronaca, ho usato con vim-Enhanced-7.4.179-1.fc20.x86_64.
Cristian Ciupitu,

1
@CristianCiupitu @ John1024% V corrisponde solo alla selezione prima del cursore, quindi se eè l'ultimo carattere nella selezione, il secondo% V non è all'interno della selezione e ignora l'ultimo e.
Dwight Spencer,

2
@ John1024 la vera soluzione sarebbe usare il più appropriato '<,'> o in un pizzico includere un .dopo il secondo \% V
Dwight Spencer

12

Dovresti cercare di più. Quali comandi Vim possono essere utilizzati per citare / annullare la citazione delle parole?

citando:

surround.vim sarà la tua risposta più semplice. Se sei davvero contrario a usarlo, ecco alcuni esempi di cosa puoi fare. Non necessariamente il più efficiente, ma è per questo che è stato scritto surround.vim.

  • Cita una parola, usando virgolette singole ciw'Ctrl+r"'
    • ciw - Elimina la parola su cui si trova il cursore e finisci in modalità inserimento.
    • ' - aggiungi la prima citazione.
    • Ctrl+r"- Inserisci il contenuto del "registro, ovvero l'ultimo yank / cancella.
    • ' - aggiungi il preventivo di chiusura.

  • Annulla la citazione di una parola racchiusa tra virgolette singole di'hPl2x
    • di' - Elimina la parola racchiusa tra virgolette singole.
    • hP - Sposta il cursore a sinistra di un posto (sopra la citazione di apertura) e metti il ​​testo appena cancellato prima della citazione.
    • l - Spostare il cursore a destra di un posto (sopra la citazione di apertura).
    • 2x - Elimina le due virgolette.

  • Cambia virgolette singole in virgolette doppie va':s/\%V'\%V/"/g
    • va' - Seleziona visivamente la parola tra virgolette e le virgolette.
    • :s/ - Inizia una sostituzione.
    • \%V'\%V - Abbina solo virgolette singole all'interno della regione selezionata visivamente.
    • /"/g - Sostituiscili tutti con doppie virgolette.

6
tl; dr Installa surround.vim , seleziona visivamente il testo quindi premi S".
Cristian Ciupitu,

3
@CristianCiupitu ysi)"senza modalità visiva.
FDinoff,

4

La sequenza di comandi cw""<ESC>Pè la cosa vicina che può fare un contorno di testo e funziona tagliando la parola (stringa di caratteri alfanumerici: az, AZ, 0-9, incluso _ [trattino basso]), quindi inserisce il testo ""e premendo il tasto tasto Esc ( <ESC>per uscire dalla modalità di inserimento uno è quindi in grado di incollare prima del cursore. Pertanto il comando si scompone in:

c - tagliato nel registro

w - regex match \ w

"" - inserire due "caratteri nella posizione corrente del cursore

<ESC>- Scorciatoia VIM per premere il tasto Esc. In questo contesto, tornare alla modalità comando

P - incolla il registro corrente

Tuttavia, nel caso di serie più lunghe di stringhe sulla linea corrente che si desidera circondare, è necessario utilizzare i comandi regex di sostituzione con un gruppo di acquisizione come:

:s/\(\w\+\)/"\1"/g

Questo comando memorizza la regex corrispondente risultante acquisita come gruppo '1' e sostituisce la preforma per inserire il contenuto del gruppo tra virgolette. Quindi, dato il testo:

fubar: 1

diventa:

"fubar": 1

Il file della guida introduttiva di vim è una delle migliori risorse per chiunque, insieme al :helpcomando.


Funziona benissimo anche con la modalità visiva
predikt

Penso che un piccolo miglioramento sia usare ciw "" <ESC> P perché puoi stare con il cursore al centro della parola e puoi fare "cambia la parola interiore".
Andrei Sura,

1

Non utilizzare la modalità visiva. Basta cambiare il testo tra parentesi in "", quindi incollare il testo eliminato tra. ci) "" <Esc> P

Se si desidera utilizzare la modalità visiva, funziona allo stesso modo, è sufficiente rilasciare la parte 'i)': c "" <Esc> P

( <Esc> significa premere il tasto Esc)


1

Ecco come ho citato alcune delle mie selezioni visive:

  1. Mentre sei in modalità VISUAL seleziona il testo che devi citare, quindi premi qqc""<Esc>Pq

    • qq inizia a registrare le tue azioni nel record q
    • c inserisce il testo selezionato in un registro e passa alla modalità INPUT
    • "" mette i simboli necessari per racchiudere il testo
    • <Esc> passa alla modalità NORMALE
    • P mette il testo dal registro nella posizione del cursore, tra virgolette
    • q indica la fine della registrazione delle azioni
  2. Ora, durante la stessa sessione, sarai in grado di citare qualsiasi blocco visivo semplicemente digitando @q, che riproduce le nostre azioni precedentemente registrate

  3. ???

  4. Dopo aver usato @quna volta, sarà possibile emettere @@(ripetere l'azione precedente) per citare le successive selezioni visive


Che cos'è il passaggio 3? Per favore, aggiusta la tua risposta.
DavidPostill
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.