2008-09-07 16 views
64

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 yo quiero "abcabc" entonces yo podría escribir:¿Cómo especifico "la palabra debajo del cursor" en la línea de comandos de VIM?

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

Pero entonces me gustaría ser capaz de mover el cursor a "def" y utilizar 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 

Respuesta

46

<cword> es la palabra bajo el cursor (: ayudar a <cword>).

Disculpa, debería haber estado más completo en esta respuesta.

Puede nmap un comando a ella, o esta serie de pulsaciones de teclas para los perezosos va a trabajar:

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

Entonces, cuando se está escribiendo en su patrón que puede golpear <control-r>0<enter> que se pegue en su comando contenido del registro 0 °.

También se puede hacer una orden para esto como:

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

Qué va a asignar golpear '\' y 'w' en el mismo momento de reemplazar la línea de comandos con

:s/\(<currentword>\)/ 
+13

hago apreciar la gran respuesta, pero probablemente sugerir la 'yiw' sobre byw' só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 la 'b' y simplemente escribir 'yw' contra usted ** puede ** omitir el' i' en 'yiw '. Los accidentes pueden ocurrir, y corregir un error es más presión de tecla :) –

1

Usted necesidad de 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> 
1
ywPx 

va a hacer lo que usted describe.

ywPxw 

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

+0

La pregunta era específicamente sobre especificar "la palabra bajo el cursor" de la línea de comando de Vim, no del modo de comando –

22
yiwP 

yiw: Yank palabra interior (la palabra bajo el cursor). Este comando también mueve el cursor al comienzo de la palabra.

P: Pegue antes del cursor.

A continuación, puede asignar la ej .: <ALT> - D a este comando:

:nmap <ALT>-D yiwP 
+1

La pregunta era específicamente sobre especificar "la palabra debajo del cursor" desde la línea de comandos de Vim, no desde el modo de comando –

11

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

En el modo normal, cuando más de una palabra, el tipo

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

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

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

A continuación, puede repetir este comportamiento, dicen sobre palabra "def", ya sea escribiendo lo mismo otra vez, 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 de hacer esto con el comando q

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

A continuación, repita a su contenido de corazones escribiendo

@d 

cuando más de una palabra que desea duplicar. Como este es solo un carácter menos que la solución anterior, puede que no le valga la pena, a menos que haga otros comandos entre la duplicación de palabras, que cambiaría el comportamiento de @:

96

Mientras está al mando modo -line, CTRL + RCTRL + W insertará la palabra bajo el cursor.

Consulte la Ayuda para c_CTRL-R para obtener una lista de todos los otros registros especiales:

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

¿podría comentar sobre lo que hace esto? –

+1

Esto usa la bandera 'n' para el comando': substitute' para imprimir cuántas veces aparece la palabra debajo del cursor en el búfer actual. Muy inteligente, pero en realidad no es una respuesta a esta pregunta. – Jacob

0

@user11211has the most straightforward way duplicar la palabra bajo el cursor:

yiwP 

tirón palabra interior (mueve el cursor al comienzo de la palabra), pega (antes del cursor).

por ejemplo. straigh [t] hacia delante ----> straightforwar [d] directa

[] es el cursor

Elaborar ...

Usted probablemente querrá tener el cursor después de su palabra duplicada:

yiwPea 

straigh [t] hacia delante ----> straightforwardstraightforward []

NOTA:

yiw 

se dé un tirón palabra interior (sin espacios en blanco)

yaw 

es tirón todo palabra (incluyendo espacios en blanco finales).

yawPea 

es, por lo tanto, una palabra duplicada, incluidos los espacios en blanco, y el cursor de posición.

straigh [t] hacia delante ----> sencillo sencillo []

+0

La pregunta era específicamente sobre especificar "la palabra debajo del cursor" de la línea de comandos * de Vim, no desde el modo de comando. –

+1

Puede usar cualquiera de los comandos normales (modo de comando) arriba en modo comando, simplemente precediéndolos con: normal ... por ejemplo,: normal yiwP hará lo mismo que yiwP en modo normal. Esta es, por supuesto, la manera más lenta de hacer lo que estabas pidiendo. –

Cuestiones relacionadas