¿Por qué `cw` y` ce` hacen lo mismo?

15

Esto siempre me ha molestado acerca de los comandos wy de Wmovimiento: parecen funcionar de manera diferente cuando se usan con el ccomando de suspensión que cuando se usan solos o con el dcomando elete.


Por ejemplo, con el cursor en la "q" de este texto:

The quick brown fox jumps over the lazy dog.

escribiendo dwresultados en

The brown fox jumps over the lazy dog.

y escribiendo deresultados en

The  brown fox jumps over the lazy dog.

(Observe los dos espacios entre "The" y "brown").


El ycomando ank también trata wy de manera ediferente, como se puede mostrar al comparar yeP:

The quickquick brown fox jumps over the lazy dog.

y ywP:

The quick quick brown fox jumps over the lazy dog.

Sin embargo, al escribir ceslow<Esc>o cwslow<Esc>da como resultado lo mismo :

The slow brown fox jumps over the lazy dog.

¿Está esto documentado en alguna parte? ¿Cuál es la lógica detrás de esto y cómo puedo predecir los resultados de un comando que utiliza w?

Comodín
fuente

Respuestas:

18

Es un caso especial. Consulte la documentación de WORD , en "Caso especial":

Caso especial: "cw" y "cW" se tratan como "ce" y "cE" si el cursor no está en blanco. Esto se debe a que "cw" se interpreta como palabra de cambio, y una palabra no incluye el siguiente espacio en blanco. {Vi: "cw" cuando está en un espacio en blanco seguido de otros espacios en blanco cambia solo el primer espacio en blanco; esto es probablemente un error, porque "dw" elimina todos los espacios en blanco}

Otro caso especial: cuando se usa el movimiento "w" en combinación con un operador y la última palabra movida se encuentra al final de una línea, el final de esa palabra se convierte en el final del texto operado, no la primera palabra en la siguiente línea.

La implementación original de Vi de "e" tiene errores. Por ejemplo, el comando "e" se detendrá en el primer carácter de una línea si la línea anterior estaba vacía. Pero cuando usa "2e" esto no sucede. En Vim "ee" y "2e" son lo mismo, lo cual es más lógico. Sin embargo, esto causa una pequeña incompatibilidad entre Vi y Vim.

fruglemonkey
fuente
1
Neovim 0.2.1 agrega una bandera de 'cpoptions' "_" (guión bajo) que alterna este comportamiento. neovim.io/doc/user/options.html#'cpoptions '
Justin M. Keyes
6

La diferencia entre el comportamiento del movimiento en cwvs. dwpuede explicarse simplemente: normalmente, si desea cambiar una palabra, dejará el espacio en blanco que le sigue, mientras que eliminar una palabra sugiere que también desea eliminar el espacio en blanco.

Si desea que el espacio en blanco que se vaya por alguna razón (lo hago bastante regularidad, pero no puedo pensar en un ejemplo) es válida la awmoción: caw.

dash-tom-bang
fuente