¿Cómo especifico “la palabra debajo del cursor” en la línea de comandos de VIM?

86

Quiero escribir un comando que especifique "la palabra debajo del cursor" en VIM. Por ejemplo, digamos que tengo el cursor sobre una palabra y la hago aparecer dos veces. Por ejemplo, si la palabra es "abc" y quiero "abcabc", entonces podría escribir:

:s/\(abc\)/\1\1/

Pero luego me gustaría poder mover el cursor a "def" y usar el mismo comando para cambiarlo a "defdef":

:s/\(def\)/\1\1/

¿Cómo puedo escribir el comando en la línea de comandos para que haga esto?

:s/\(*whatever is under the commandline*\)/\1\1
Nathan Fellman
fuente

Respuestas:

74

<cword>es la palabra debajo del cursor (: ayuda <cword>).

Lo siento, debería haber sido más completo en esta respuesta.

Puede asignarle un comando, o esta serie de pulsaciones de teclas para los perezosos funcionará:

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

Luego, cuando esté escribiendo su patrón, puede presionar <control-r>0<enter>lo que pegará en su comando el contenido del registro 0-ésimo.

También puede hacer un comando para esto como:

:nmap <leader>w :s/\(<c-r>=expand("<cword>")<cr>\)/

Que mapeará presionando '\' y 'w' al mismo tiempo para reemplazar su línea de comando con

:s/\(<currentword>\)/
hazzen
fuente
17
Yo aprecio la gran respuesta, pero probablemente sugerir la yiwmás bywsólo por la memoria muscular. En el escenario en el que su cursor ya está en el primer carácter de la palabra, debe omitir by simplemente escribir ywvs puede omitir iin yiw. Pueden ocurrir accidentes, y corregir un error es sin duda más pulsaciones de teclas :)
Jacob Swartwood
130

Mientras está en el modo de línea de comandos, CTRL+ R CTRL+ Winsertará la palabra debajo del cursor.

Consulte la ayuda para c_CTRL-Robtener una lista de todos los demás registros especiales:

:help c_CTRL-R
César Alforde
fuente
28
yiwP

yiw: Yank inner word (la palabra debajo del cursor). Este comando también mueve el cursor al principio de la palabra.

P: Pega antes del cursor.

A continuación, puede asignar el ejemplo: < ALT > - Da este comando:

:nmap < ALT >-D yiwP
user11211
fuente
4
La pregunta se refería específicamente a especificar "la palabra debajo del cursor" desde la línea de comandos de Vim, no desde el modo de comando
Nathan Fellman
12

Otra forma fácil de hacer esto es usar el *comando.

En el modo normal, cuando supere una palabra, escriba

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

* convierte el patrón de búsqueda en la palabra actual (por ejemplo, \ <abc \>).

:s//realiza una sustitución utilizando el patrón de búsqueda actual, y \0en la sección de reemplazo está la cadena coincidente.

A continuación, puede repetir este comportamiento, decir sobre la palabra "def", ya sea escribiendo lo mismo de nuevo o escribiendo

*@:

@: simplemente repite el último comando ex, sin necesidad de un <Enter>, en este caso la sustitución.

También puede grabar una macro rápida para hacer esto usando el qcomando

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

Luego repítelo al contenido de su corazón escribiendo

@d

cuando sobre una palabra quieres doblar. Como esto es solo un carácter menos que la solución anterior, puede que no valga la pena para usted, a menos que esté haciendo otros comandos anteriores entre la duplicación de palabras, lo que cambiaría el comportamiento de@:

rampion
fuente
1

Debe escapar de las barras invertidas dentro del mapeo. También puede incluir la cadena de sustitución dentro del mapeo.

:nmap <leader>w :s/\\(<c-r>=expand("<cword>")<cr>\\)/\\1\\1<cr>

fuente
1
ywPx

hará lo que usted describe.

ywPxw

también avanzará el cursor a la siguiente palabra.

bmb
fuente
La pregunta se refería específicamente a especificar "la palabra debajo del cursor" desde la línea de comandos de Vim, no desde el modo de comando
Nathan Fellman
Describe respuestas como esa, cada letra del comando.
Vitaly Zdanevich
0

@ user11211 tiene la forma más sencilla de duplicar la palabra debajo del cursor:

yiwP

tirar de la palabra interior (mueve el cursor al principio de la palabra), pegar (antes del cursor).

p.ej. recto [t] hacia adelante ----> sencillo [d] sencillo

[] es cursor

Elaborar...

Probablemente desee que el cursor siga su palabra duplicada:

yiwPea

recto [t] adelante ----> directo directo []

NOTA:

yiw

es la palabra interior yank (sin espacios en blanco)

yaw

es tirar todas las palabras (incluidos los espacios en blanco finales).

yawPea

es por tanto una palabra duplicada que incluye espacios en blanco y cursor de posición.

recto [t] adelante ----> sencillo sencillo []

BBW antes de Windows
fuente
La pregunta era específicamente acerca de especificar "la palabra debajo del cursor" desde la línea de comandos de Vim , no desde el modo de comando.
Nathan Fellman
1
Puede usar cualquiera de los comandos normales (modo de comando) anteriores dentro del modo de comando, simplemente precediéndolos con: normal ... por ejemplo,: normal yiwP hará lo mismo que yiwP en modo normal. Por supuesto, esta es la forma más lenta de hacer lo que estaba pidiendo.
BBW antes de Windows
-1
" count word  (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>
Sergio Araujo
fuente
¿Podrías comentar qué hace esto?
Nathan Fellman
1
Esto usa la nbandera del :substitutecomando para imprimir cuántas veces aparece la palabra debajo del cursor en el búfer actual. Bastante inteligente, pero en realidad no es una respuesta a esta pregunta.
Jacob