¿Cómo especifico "la palabra debajo del cursor" en la línea de comando de VIM?
-
09-06-2019 - |
Pregunta
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
Solución
<cword>
es la palabra debajo del cursor (:ayuda <cword>
).
Lo siento, debería haber sido más completo en esta respuesta.
Puedes 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és escribiendo tu patrón, puedes presionar <control-r>0<enter>
que pegará en su comando el contenido del registro 0.
También puedes hacer un comando para esto como:
:nmap <leader>w :s/\(<c-r>=expand("<cword>")<cr>\)/
Lo cual asignará presionar '\' y 'w' al mismo tiempo para reemplazar su línea de comando con
:s/\(<currentword>\)/
Otros consejos
Mientras está en modo de línea de comandos, CONTROL+R CONTROL+W. insertará la palabra debajo del cursor.
Ver la ayuda para c_CTRL-R
para obtener una lista de todos los demás registros especiales:
:help c_CTRL-R
yiwP
yiw
:Palabra interna yanqui (la palabra debajo del cursor).Este comando también mueve el cursor al principio de la palabra.
P
:Pegar antes del cursor.
Luego puede mapear, por ejemplo: < ALT > - D
a este comando:
:nmap < ALT >-D yiwP
Otra manera fácil de hacer esto es usar el *
dominio.
En modo normal, cuando esté sobre una palabra, escriba
*:s//\0\0<Enter>
*
convierte el patrón de búsqueda en la palabra actual (p. ej.\<abc\>).
:s//
realiza una sustitución utilizando el patrón de búsqueda actual, y \0
En la sección de reemplazo está la cadena coincidente.
Luego puede repetir este comportamiento, digamos sobre la palabra "def", escribiendo lo mismo nuevamente o escribiendo
*@:
@:
simplemente repite el último comando ex, sin necesidad de <Enter>, en este caso la sustitución.
También puedes grabar una macro rápida para hacer esto usando el q
dominio
qd*:s//\0\0<Enter>q
Luego repítelo a tu gusto escribiendo
@d
cuando sobre una palabra desea duplicar.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é ejecutando otros comandos ex entre la duplicación de palabras, lo que cambiaría el comportamiento de @:
Debes escapar de las barras invertidas dentro del mapeo.También puede incluir la cadena de sustitución dentro de la asignación.
:nmap <leader>w :s/\\(<c-r>=expand("<cword>")<cr>\\)/\\1\\1<cr>
ywPx
Hará lo que usted describe.
ywPxw
También hará avanzar el cursor a la siguiente palabra.
@usuario11211 tiene la forma más sencilla para duplicar la palabra debajo del cursor:
yiwP
tirar de la palabra interna (mueve el cursor al inicio de la palabra), pegar (antes del cursor).
p.ej.directo[t]directo ----> directo[d]directo
[] es el cursor
Elaborar...
Probablemente quieras que el cursor siga tu palabra duplicada:
yiwPea
sencillo[t]adelante ----> sencillodirecto[]
NOTA:
yiw
es una palabra interna yank (sin espacios en blanco)
yaw
es tirar todas las palabras (incluidos los espacios en blanco finales).
yawPea
Por lo tanto, es una palabra duplicada que incluye espacios en blanco y posición del cursor.
sencillo[t]adelante ----> sencillo sencillo[]
" count word (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>