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.
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.
Risposte:
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.
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.
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.
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.ciw
e non solo cw
? Trovo il primo confuso e il secondo funziona bene.
ciw
funziona indipendentemente dalla posizione del cursore nella parola. cw
Funziona solo se il cursore si trova all'inizio della parola. Vedere :help iw
.
.
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 :-))
Cita una parola, usando virgolette singole
ciw'Ctrl+r"'
È stato più facile per me farlo in questo modo
ciw '' Esc P
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.
map <Leader>' gewi'<Esc>A'<Esc>
al mio .vimrc
file per inserire singoli commenti di citazione dalla posizione corrente alla fine della riga; che mi ha aiutato mentre convertivo alcuni script MSDOS in bash.
:vnoremap <leader>q c""<esc>P
.
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"/
:s/\v([a-Z]+)/"\1"/g
I modi macro!
premere qe qper registrare nel registro q (usiamo "q" come scorciatoia per ricordare "virgolette").
premi shift+ bsposta il cursore all'inizio della parola corrente
itipo di stampa '(virgolette singole)
premere escquindi premere eper spostarsi alla fine della parola
premere aquindi premere di 'nuovo per racchiudere la parola tra virgolette.
premere escper entrare in modalità normale.
infine premere qper registrarlo nel q
registro.
Come usare
Puoi modificare step 4
qualsiasi cosa ti piaccia {una riga, una parola fino a quando non trovi un carattere, ecc}.
Rendi persistente la macro registrata
lascia @ q = ' ctrl+ r ctrl+ rq'
salva ed esci
apri i tuoi file, vai ad alcune parole
@q
se lo fai correttamente, le cose magiche dovrebbero apparire nelle tue parole.
Puoi eseguire questa procedura per altre macro che ami.
@q w
e quindi puoi racchiudere le n
parole successive tra virgolette usando con n@j
.
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-r
e altro sugli oggetti di testo in:h text-objects
Fonte: http://vimcasts.org/episodes/pasting-from-insert-mode/
ciw'<C-R><C-O>"'<Esc>
.
.
riscriverà il contenuto dell'ultima chiamata effettiva.
Per gli utenti di VSCodeVim puoi farlo
vwS"
"
con qualunque cosa desideri.w
con qualsiasi altro operatore di selezioneviwS'
che racchiude la parola tra virgolette singole. Di gran lunga il più semplice.
viwS"
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 ".
'r
e "r
), puoi semplicemente digitare .
E se vuoi cambiare più virgolette ;
e ,
portarti al successivo o al precedente mentre ripetono l'ultima f/F/t/T
ricerca nella stessa direzione o in quella opposta, rispettivamente.
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 s
per 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
.
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
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>
qw
qd
wq
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)
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.
cosa ne pensi di questo?
:%s/\'/"/g
%
, funzionerà solo sulla riga corrente a meno che tu non abbia selezionato l'intero file
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.