Come faccio a specificare "la parola sotto il cursore" sulla riga di comando di VIM?


86

Voglio scrivere un comando che specifica "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

Risposte:


74

<cword>è la parola sotto il cursore (: help <cword>).

Scusa, avrei dovuto essere più completo in questa risposta.

Puoi nmap un comando ad esso, o questa serie di sequenze di tasti per i pigri funzionerà:

b #go to beginning of current word
yw #yank to register

Quindi, quando stai digitando il tuo pattern, puoi premere il tasto <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' allo stesso tempo per sostituire la riga di comando con

:s/\(<currentword>\)/

17
Apprezzo l'ottima risposta, ma probabilmente suggerirei l' yiwover bywsolo a causa della memoria muscolare. Nello scenario in cui il cursore capita già di essere sul primo carattere della parola, è necessario omettere l' be semplicemente digitare ywvs si può omettere l' iin yiw. Gli incidenti possono accadere e correggere un errore è sicuramente più pressione dei tasti :)
Jacob Swartwood

132

In modalità riga di comando, CTRL+ R CTRL+ Winserirà la parola sotto il cursore.

Vedere la guida c_CTRL-Rper un elenco di tutti gli altri registri speciali:

:help c_CTRL-R

29
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 eg: < ALT > - Da questo comando:

:nmap < ALT >-D yiwP

4
La domanda riguardava specificamente la specifica "la parola sotto il cursore" dalla riga di comando di Vim, non dalla modalità di comando
Nathan Fellman

12

Un altro modo semplice per farlo è usare il * comando.

In modalità normale, quando sopra una parola, digita

*:s//\0\0<Enter>

* rende il modello di ricerca la parola corrente (ad esempio \ <abc \>).

:s// esegue una sostituzione utilizzando il modello di ricerca corrente e \0 nella sezione di sostituzione è la stringa corrispondente.

È quindi possibile ripetere questo comportamento, ad esempio sulla parola "def", digitando di nuovo lo stesso o digitando

*@:

@: ripete solo l'ultimo comando ex, senza bisogno di un <Invio>, in questo caso la sostituzione.

Puoi anche registrare una macro veloce per farlo usando il qcomando

qd*:s//\0\0<Enter>q

Quindi ripetilo al contenuto del tuo cuore 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 cambierebbe il comportamento di@:


1

È necessario eseguire l'escape dei backslash 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>

1
ywPx

farà quello che descrivi.

ywPxw

farà anche avanzare il cursore alla parola successiva.


La domanda riguardava specificamente la specifica "la parola sotto il cursore" dalla riga di comando di Vim, non dalla modalità di comando
Nathan Fellman

Descrivi le risposte in questo modo, ogni lettera nel comando.
Vitaly Zdanevich

0

@ user11211 ha il modo più semplice per duplicare la parola sotto il cursore:

yiwP

trascina la parola interna (sposta il cursore all'inizio della parola), incolla (prima del cursore).

per esempio. straight [t] forward ----> straightforwar [d] straightforward

[] è il cursore

Elaborare...

Probabilmente vuoi che il cursore segua la tua parola duplicata:

yiwPea

dritto [t] avanti ----> diretto dritto []

NOTA:

yiw

è strattonare la parola interiore (senza spazi)

yaw

è uno strappo di tutte le parole (inclusi gli spazi vuoti finali).

yawPea

è quindi una parola duplicata che include spazi bianchi e cursore di posizione.

dritto [t] avanti ----> semplice diretto []


La domanda riguardava specificamente la specificazione della "parola sotto il cursore" dalla riga di comando di Vim , non dalla modalità di comando.
Nathan Fellman

1
È possibile utilizzare uno qualsiasi dei comandi normali (modalità di comando) sopra all'interno della modalità di comando, semplicemente precedendoli con: normal ... ad esempio,: normal yiwP farà lo stesso di yiwP in modalità normale. Questo è ovviamente il modo più lento per fare ciò che stavi chiedendo.
BBW Before Windows

-1
" count word  (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>

potresti commentare cosa fa?
Nathan Fellman

1
Questo utilizza il nflag del :substitutecomando per stampare quante volte la parola sotto il cursore appare nel buffer corrente. Abbastanza intelligente, ma in realtà non una risposta a questa domanda.
Jacob
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.