Quali comandi Vim possono essere utilizzati per citare / annullare la citazione delle parole?


204

Come posso citare / annullare la citazione rapida delle parole e modificare le citazioni (ad es. Da 'a ") in Vim? Conosco il plugin surround.vim , ma vorrei usare solo Vim.


Una soluzione dipende davvero dal contesto. Vuoi farlo su una sola riga, o nell'intero file, o solo per una singola stringa tra virgolette?
Lucas Oman,

Per una sola parola o tutte le parole in una riga. Ad esempio, durante la conversione di parole incollate in letterali stringa.
Eugene Yarmash,

Risposte:


253

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.

1
Questi funzionano bene per me. Ho appena cercato su Google che incollare in modalità inserimento sia possibile anche con Ctrl + op.
Eugene Yarmash,

1
Utilizzato in combinazione con la modalità di registrazione (q), funziona come un incantesimo per lavori veloci.
vescovo,

Perché ciwe non solo cw? Trovo il primo confuso e il secondo funziona bene.
Big McLargeHuge

18
@Koveras ciwfunziona indipendentemente dalla posizione del cursore nella parola. cwFunziona solo se il cursore si trova all'inizio della parola. Vedere :help iw.
Jamessan,

10
Dirottare la risposta migliore per dare un piccolo trucco: se hai diverse parole per sostituire racchiudendo una virgoletta singola tra virgolette doppie, potresti notare che la prima soluzione di @jamessan non funziona con il .comando. Per farlo funzionare, usa ciw' Ctrl+r Ctrl+p". Quindi .si comporterà come lo vuoi per la seguente parola: invece di ricordare il contenuto del registro, ricorderà che vuoi tutto ciò che è nel registro in questo momento (un po 'difficile da spiegare, ma se provi entrambi, diventerà ovvio :-))
autra

182

Cita una parola, usando virgolette singole

ciw'Ctrl+r"'

È stato più facile per me farlo in questo modo

ciw '' Esc P

8
Sfortunatamente, ciò non sembra consentire. (ripetere).
Wil Moore III,

2
Preferisco questo in quanto posso usarlo su terminali / sostituzioni con la modalità vim poiché Ctrl + r è di solito già utilizzato per la ricerca cronologica inversa.
krock,

3
@wilmoore Registrare quanto sopra come macro, quindi riprodurre.
Christopher,

30

Ecco alcune mappature che potrebbero aiutare:

:nnoremap <Leader>q" ciw""<Esc>P
:nnoremap <Leader>q' ciw''<Esc>P
:nnoremap <Leader>qd daW"=substitute(@@,"'\\\|\"","","g")<CR>P

Se non hai modificato la variabile mapleader, attiva la mappatura con \q" \q'o \qd. Aggiungono virgolette doppie intorno alla parola sotto il cursore, virgolette singole intorno alla parola sotto il cursore, eliminano rispettivamente le virgolette intorno alla parola sotto il cursore.


Ottima idea! Ho finito per aggiungere map <Leader>' gewi'<Esc>A'<Esc>al mio .vimrcfile per inserire singoli commenti di citazione dalla posizione corrente alla fine della riga; che mi ha aiutato mentre convertivo alcuni script MSDOS in bash.
ILMostro_7,

@Geoff, funziona benissimo per virgolette singole. ma per le doppie virgolette inserisce `` "" "` davanti alla parola
RameshVel

@RameshVel È possibile che tu abbia avuto alcune delle tue macro che hanno interessato il lato destro della mappatura. Ho aggiornato il comando di mapping su nnoremap in modo che altri mapping non vengano espansi. Ho anche migliorato le mappature. I precedenti avevano problemi quando il cursore si trova sulla prima parola su una riga.
Geoff Reedy,

Questo può anche essere facilmente adattato alla modalità visiva per racchiudere una selezione tra virgolette, ad es :vnoremap <leader>q c""<esc>P.
Dominik,

27

Oltre agli altri comandi, questo racchiuderà tutte le parole in una riga tra virgolette doppie (come da tuo commento)

:s/\(\S\+\)/"\1"/

o se vuoi ridurre il numero di barre rovesciate, puoi mettere un modificatore \v(molto magico) all'inizio del modello

:s/\v(\S+)/"\1"/

Anche il mio testo copiato conteneva delle virgole, quindi sono appena passato a questo:s/\v([a-Z]+)/"\1"/g
tsukimi,

22

I modi macro!

  1. premere qe qper registrare nel registro q (usiamo "q" come scorciatoia per ricordare "virgolette").

  2. premi shift+ bsposta il cursore all'inizio della parola corrente

  3. itipo di stampa '(virgolette singole)

  4. premere escquindi premere eper spostarsi alla fine della parola

  5. premere aquindi premere di 'nuovo per racchiudere la parola tra virgolette.

  6. premere escper entrare in modalità normale.

  7. infine premere qper registrarlo nel qregistro.

Come usare

  1. Sposta il cursore sulla parola desiderata.
  2. Premere @qper racchiudere una parola tra virgolette.
  3. Premere @@se si desidera ripeterlo in un'altra parola.

Puoi modificare step 4qualsiasi cosa ti piaccia {una riga, una parola fino a quando non trovi un carattere, ecc}.

Rendi persistente la macro registrata

  1. apri .vimrc
  2. vai alla fine del file
  3. passa alla modalità di inserimento. digita questo per renderlo persistente:
lascia @ q = ' ctrl+ r ctrl+ rq'
  1. salva ed esci

  2. apri i tuoi file, vai ad alcune parole

  3. ora premi @q

se lo fai correttamente, le cose magiche dovrebbero apparire nelle tue parole.

Puoi eseguire questa procedura per altre macro che ami.


3
Devo dire che mi piace questa soluzione. Nessun surround.vim necessario e facile invocazione e creazione delle macro. Facilmente utilizzabile anche per qualsiasi altra cosa di cui abbiate bisogno (per esempio, citate la parola corrente fino alla fine della riga, perfetta per rispondere). Per mostrare la macro do: "qp. Per salvarla vai a .vimrc e fai: let @q = 'macro contents' (solo per completezza)
th3penguinwhisperer

Mi piace molto questo. Puoi anche annidare queste macro. Quindi potresti registrare nel registro j @q we quindi puoi racchiudere le nparole successive tra virgolette usando con n@j.
nome utente nascosto

1
Ho aggiunto alcuni passaggi per rendere persistente la macro.
Brain90,

1
Pedante, ma, parola e PAROLA sono diversi in Vim. Maiusc + b = B, quindi il passaggio 2 dovrebbe idealmente essere modificato in "... davanti alla WORD corrente". Se intendevi l'inizio della parola, tuttavia, non è necessario utilizzare Maiusc.
Ambareesh,

Grazie per il punto che. Uso shift + b di proposito per gestire WORD. La macro dovrebbe essere eseguita in word o WORD [0]. In realtà il passaggio 3 dovrebbe anche cambiare in shift + e. [0] stackoverflow.com/a/14390568/341959
Brain90

18

Avvolgere tra virgolette singole (ad esempio) ciw'<C-r>"'<esc>funziona, ma ripeti non funzionerà. Provare:

ciw'<C-r><C-o>"'<esc>

Questo mette i contenuti del registro predefinito "letteralmente". Ora puoi premere .qualsiasi parola per racchiuderla tra virgolette. Per saperne di più vedi :h[elp] i_ctrl-re altro sugli oggetti di testo in:h text-objects

Fonte: http://vimcasts.org/episodes/pasting-from-insert-mode/


2
Consiglio eccellente! Se qualcuno vuole fare una mappatura di questo, la notazione corretta è ciw'<C-R><C-O>"'<Esc>.
inizia l'

Cosa fa esattamente <Cr> "?
CodeCrack del

@CodeCrack È CTRL-R. CTRL-R inserisce il contenuto del registro in corrispondenza del cursore e rimane nella modalità di inserimento.
Erwin Rooijakkers,

Questo è ripetibile, come hai detto, ma se archiviato in una macro, la ripetizione della macro .riscriverà il contenuto dell'ultima chiamata effettiva.
Sbu,

7

Per gli utenti di VSCodeVim puoi farlo

vwS"

  • Puoi sostituirlo "con qualunque cosa desideri.
  • È possibile sostituire wcon qualsiasi altro operatore di selezione

2
Questo ha funzionato bene anche per me su MacVIM, ma ho dovuto usare ciò viwS'che racchiude la parola tra virgolette singole. Di gran lunga il più semplice.
Matt Grannary

questo funziona solo se sei all'inizio della parola. Se vuoi farlo da qualsiasi parte della parola, puoi fare:viwS"
geoyws

6

Non conosco alcun comando incorporato di vim per questo, ma usando r"f'r"per cambiare da 'a "e r'f"r'per cambiare da" a "funziona se ti trovi sul primo' o". Il comando r'sostituisce qualsiasi carattere sotto il cursore con ', e f"ti sposta al successivo ".


1
La soluzione "manuale" più intuitiva per me. Invece del secondo comando di sostituzione ( 're "r), puoi semplicemente digitare .E se vuoi cambiare più virgolette ;e ,portarti al successivo o al precedente mentre ripetono l'ultima f/F/t/Tricerca nella stessa direzione o in quella opposta, rispettivamente.
Endre Entrambi il

6

Aggiunta di virgolette

Ho iniziato a utilizzare questa funzione rapida e sporca nel mio .vimrc:

vnoremap q <esc>:call QuickWrap("'")<cr>
vnoremap Q <esc>:call QuickWrap('"')<cr>

function! QuickWrap(wrapper)
  let l:w = a:wrapper
  let l:inside_or_around = (&selection == 'exclusive') ? ('i') : ('a')
  normal `>
  execute "normal " . inside_or_around . escape(w, '\')
  normal `<
  execute "normal i" . escape(w, '\')
  normal `<
endfunction

Quindi ora seleziono visivamente ciò che voglio (in genere tramite viw- seleziona visivamente la parola interna ) tra virgolette e premo Qper virgolette doppie, oppure premo qper virgolette singole.

Rimozione delle citazioni

vnoremap s <esc>:call StripWrap()<cr>

function! StripWrap()
  normal `>x`<x
endfunction

Uso vim-textobj-quotes in modo che vim tratti le citazioni come oggetti di testo. Questo significa che posso fare vaq(selezionare visivamente tra virgolette . Trova le virgolette più vicine e le seleziona visivamente. (Questo è facoltativo, puoi semplicemente fare qualcosa di simile f"vww). Quindi premo sper rimuovere le virgolette dalla selezione.

Virgolette

BACIO. Ho Rimuovi le virgolette poi aggiungere le citazioni . Ad esempio, per sostituire le virgolette singole con doppi apici, vorrei eseguire i passaggi: apici 1. Rimuovere: vaqs, 2. aggiungere nuove citazioni: vwQ.



4

Se usi il plugin vim https://github.com/tpope/vim-surround (o usi il plugin VSCode Vim, che viene fornito con vim-surround preinstallato), è abbastanza comodo!

Inserisci

ysiw' // surround in word `'`

far cadere

ds' // drop surround `'`

modificare

cs'" // change surround from `'` to `"`

Funziona anche con tag html!

cst<em> // change surround from current tag to `<em>`

controlla il readme su github per esempi migliori


2

Ecco alcuni semplici mapping che possono essere utilizzati per citare e annullare la citazione di una parola:

" 'quote' a word
nnoremap qw :silent! normal mpea'<Esc>bi'<Esc>`pl
" double "quote" a word
nnoremap qd :silent! normal mpea"<Esc>bi"<Esc>`pl
" remove quotes from a word
nnoremap wq :silent! normal mpeld bhd `ph<CR>

1
Sarebbe bello per tutti se tu potessi elaborare la tua risposta: come aggiungere mappature, come chiamarle ecc. Grazie.
Carles Alcolea,

1
Direi che per citare, raddoppiare la citazione e non citare dovresti fareqw qd wq
nilon

per qualche ragione, la doppia citazione restituisce una citazione extra alla fine come "parola" ".
Janicebaratheon

@ShuaiWang forse hai installato autopairs o qualche estensione simile? Rimuovere quel bug risolto per me.
Nephilim,

2

VIM per vscode lo fa incredibilmente. Si basa su un vim-surround se non si utilizza vscode.

Qualche esempio:

"test" con il cursore tra virgolette digitare cs "'per finire con' test '

"test" con il cursore tra virgolette digita ds "per finire con test

"test" con il cursore tra virgolette digita cs "t e inserisci 123> per finire con <123> test

test con cursore sulla parola test tipo ysaw) per finire con (test)


1

Sto usando nnoremap nel mio .vimrc

Per citare una sola parola:

nnoremap sq :silent! normal mpea'<Esc>bi'<Esc>`pl

Per rimuovere le virgolette (funziona anche con virgolette doppie):

nnoremap qs :silent! normal mpeld bhd `ph<CR>

Regola da ricordare: 'sq' = virgoletta singola.


0

cosa ne pensi di questo?

 :%s/\'/"/g

2
Questo comando opera su tutto il file. Devo solo cambiare singole parole.
Eugene Yarmash,

4
Senza il %, funzionerà solo sulla riga corrente a meno che tu non abbia selezionato l'intero file
Emily il

0

Ho scritto una sceneggiatura che fa questo:

function! WrapSelect (front)
    "puts characters around the selected text.
    let l:front = a:front
    if (a:front == '[')
        let l:back = ']'
    elseif (a:front == '(')
        let l:back = ')'
    elseif (a:front == '{')
        let l:back = '}'
    elseif (a:front == '<')
        let l:back = '>'
    elseif (a:front =~ " ")
        let l:split = split(a:front)
        let l:back = l:split[1]
        let l:front = l:split[0]
    else
        let l:back = a:front
    endif
    "execute: concat all these strings. '.' means "concat without spaces"
    "norm means "run in normal mode and also be able to use \<C-x> characters"
    "gv means "get the previous visual selection back up"
    "c means "cut visual selection and go to insert mode"
    "\<C-R> means "insert the contents of a register. in this case, the
    "default register"
    execute 'norm! gvc' . l:front. "\<C-R>\""  . l:back
endfunction
vnoremap <C-l> :<C-u>call WrapSelect(input('Wrapping? Give both (space separated) or just the first one: '))<cr>

Per usare, basta evidenziare qualcosa, premere control l, quindi digitare un carattere. Se è uno dei personaggi di cui la funzione è a conoscenza, fornirà il carattere finale corretto. In caso contrario, utilizzerà lo stesso carattere da inserire su entrambi i lati.

Surround.vim può fare molto di più, ma questo è stato sufficiente per le mie esigenze.


-1

Esempio di mappa in modalità visiva per aggiungere virgolette singole attorno a un blocco di testo selezionato:

:vnoremap qq <Esc>`>a'<Esc>`<i'<Esc>
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.