Por que `cw` e` ce` fazem a mesma coisa?

15

Isso sempre me incomodou nos comandos we Wmotion - eles parecem funcionar de maneira diferente quando usados ​​com o ccomando hange do que quando usados ​​sozinhos ou com o dcomando elete.


Por exemplo, com o cursor no "q" deste texto:

The quick brown fox jumps over the lazy dog.

digitando dwresulta em

The brown fox jumps over the lazy dog.

e digitando deresultados em

The  brown fox jumps over the lazy dog.

(Observe os dois espaços entre "The" e "brown".)


O ycomando ank também trata we de maneira ediferente, como pode ser mostrado comparando yeP:

The quickquick brown fox jumps over the lazy dog.

e ywP:

The quick quick brown fox jumps over the lazy dog.

No entanto, digitar um ceslow<Esc>ou cwslow<Esc>resulta na mesma coisa :

The slow brown fox jumps over the lazy dog.

Isso está documentado em algum lugar? Qual é a lógica por trás disso e como posso prever os resultados de um comando que usa w?

Curinga
fonte

Respostas:

18

É um caso especial. Consulte a documentação do WORD , em "Caso especial":

Caso especial: "cw" e "cW" são tratados como "ce" e "cE" se o cursor não estiver em branco. Isso ocorre porque "cw" é interpretado como alteração de palavra e uma palavra não inclui o seguinte espaço em branco. {Vi: "cw" quando em branco seguido de outros espaços em branco altera apenas o primeiro espaço em branco; isso provavelmente é um bug, porque "dw" exclui todos os espaços em branco}

Outro caso especial: ao usar o movimento "w" em combinação com um operador e a última palavra movida é no final de uma linha, o final dessa palavra se torna o final do texto operado, não a primeira palavra na próxima linha.

A implementação original do Vi de "e" é incorreta. Por exemplo, o comando "e" será interrompido no primeiro caractere de uma linha se a linha anterior estiver vazia. Mas quando você usa "2e", isso não acontece. No Vim, "ee" e "2e" são os mesmos, o que é mais lógico. No entanto, isso causa uma pequena incompatibilidade entre o Vi e o Vim.

fruglemonkey
fonte
11
O Neovim 0.2.1 adiciona um sinalizador 'cpoptions' "" (sublinhado) que alterna esse comportamento. neovim.io/doc/user/options.html#'cpoptions '
Justin M. Keyes
6

A diferença entre o comportamento do movimento em cwvs. dwpode ser explicada de maneira simples: normalmente, se você quiser alterar uma palavra, deixará o espaço em branco seguindo-o, enquanto a exclusão de uma palavra sugere que você deseja que o espaço em branco também seja removido.

Se você deseja que o espaço em branco para ir embora por algum motivo (I fazê-lo regularmente o suficiente, mas não consigo pensar em um exemplo), em seguida, usar o awmovimento: caw.

traço-tom-bang
fonte