Come posso specificare "la parola sotto il cursore" sulla riga di comando di VIM?
-
09-06-2019 - |
Domanda
Voglio scrivere un comando che specifichi "la parola sotto il cursore" in VIM.Ad esempio, diciamo che ho il cursore su una parola e la faccio apparire due volte.Ad esempio, se la parola è "abc" e voglio "abcabc", potrei digitare:
:s/\(abc\)/\1\1/
Ma poi mi piacerebbe poter spostare il cursore su "def" e usare lo stesso comando per cambiarlo in "defdef":
:s/\(def\)/\1\1/
Come posso scrivere il comando nella riga di comando in modo che lo faccia?
:s/\(*whatever is under the commandline*\)/\1\1
Soluzione
<cword>
è la parola sotto il cursore (:help <cword>
).
Scusa, avrei dovuto essere più completo nella risposta.
Puoi nmap un comando ad esso, oppure questa serie di tasti per i più pigri funzionerà:
b #go to beginning of current word
yw #yank to register
Quindi, quando stai digitando il tuo pattern puoi premere <control-r>0<enter>
che incollerà nel tuo comando il contenuto del registro 0-esimo.
Puoi anche creare un comando per questo come:
:nmap <leader>w :s/\(<c-r>=expand("<cword>")<cr>\)/
Che mapperà premendo "\" e "w" contemporaneamente per sostituire la riga di comando
:s/\(<currentword>\)/
Altri suggerimenti
In modalità riga di comando, CTRL+R CTRL+W inserirà la parola sotto il cursore.
Consulta la guida per c_CTRL-R
per l'elenco di tutti gli altri registri speciali:
:help c_CTRL-R
yiwP
yiw
:Yank parola interna (la parola sotto il cursore).Questo comando sposta anche il cursore all'inizio della parola.
P
:Incolla prima del cursore.
È quindi possibile mappare ad esempio: < ALT > - D
a questo comando:
:nmap < ALT >-D yiwP
Un altro modo semplice per farlo è usare il file *
comando.
Nella modalità normale, una volta terminata una parola, digita
*:s//\0\0<Enter>
*
rende il modello di ricerca la parola corrente (ad es.\<abc\>).
:s//
esegue una sostituzione utilizzando il modello di ricerca corrente e \0
Nella sezione di sostituzione è la stringa abbinata.
È quindi possibile ripetere questo comportamento, ad esempio sulla parola "def", digitando nuovamente lo stesso oppure digitando
*@:
@:
ripete semplicemente l'ultimo comando ex, senza bisogno di <Invio>, in questo caso la sostituzione.
Puoi anche registrare una macro veloce per farlo usando il file q
comando
qd*:s//\0\0<Enter>q
Quindi ripetilo a tuo piacimento digitando
@d
quando su una parola vuoi raddoppiare.Poiché questo è solo un carattere in meno rispetto alla soluzione precedente, potrebbe non valerne la pena, a meno che tu non esegua altri ex comandi tra il raddoppio delle parole, che cambierebbero il comportamento di @:
È necessario evitare le barre rovesciate all'interno della mappatura.È inoltre possibile includere la stringa di sostituzione all'interno della mappatura.
:nmap <leader>w :s/\\(<c-r>=expand("<cword>")<cr>\\)/\\1\\1<cr>
ywPx
farà quello che descrivi.
ywPxw
farà avanzare anche il cursore alla parola successiva.
@utente11211 ha il modo più semplice per duplicare la parola sotto il cursore:
yiwP
strappa la parola interna (sposta il cursore all'inizio della parola), incolla (prima del cursore).
per esempio.diretto[t]avanti ----> direttoguerra[d]diretto
[] è il cursore
Elaborare...
Probabilmente vorrai che il cursore segua la tua parola duplicata:
yiwPea
semplice[t]avanti ----> semplicesemplice[]
NOTA:
yiw
è una parola interna strappata (senza spazi bianchi)
yaw
è strappare tutte le parole (inclusi gli spazi bianchi finali).
yawPea
è quindi una parola duplicata che include spazi bianchi e cursore di posizione.
dritto[t]avanti ----> semplice semplice[]
" count word (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>