Pourquoi «cw» et «ce» font-ils la même chose?

15

Cela m'a toujours dérangé à propos des commandes wet Wmotion - elles semblent fonctionner différemment lorsqu'elles sont utilisées avec la ccommande hange que lorsqu'elles sont utilisées seules, ou avec la dcommande elete.


Par exemple, avec le curseur sur le "q" de ce texte:

The quick brown fox jumps over the lazy dog.

en tapant les dwrésultats dans

The brown fox jumps over the lazy dog.

et en tapant les derésultats dans

The  brown fox jumps over the lazy dog.

(Remarquez les deux espaces entre "Le" et "marron".)


La ycommande ank traite également wet edifféremment, comme le montre la comparaison yeP:

The quickquick brown fox jumps over the lazy dog.

et ywP:

The quick quick brown fox jumps over the lazy dog.

Cependant, taper soit ceslow<Esc>ou cwslow<Esc>entraîne la même chose :

The slow brown fox jumps over the lazy dog.

Est-ce documenté quelque part? Quelle est la logique derrière cela et comment puis-je prédire les résultats d'une commande qui utilise w?

Caractère générique
la source

Réponses:

18

C'est un cas particulier. Consultez la documentation de WORD , sous "Cas particulier":

Cas particulier: "cw" et "cW" sont traités comme "ce" et "cE" si le curseur est sur un espace non vide. En effet, "cw" est interprété comme un mot de changement et un mot ne comprend pas l'espace blanc suivant. {Vi: "cw" quand sur un blanc suivi d'autres blancs ne change que le premier blanc; c'est probablement un bug, car "dw" supprime tous les blancs}

Autre cas particulier: lorsque vous utilisez le mouvement "w" en combinaison avec un opérateur et que le dernier mot déplacé se trouve à la fin d'une ligne, la fin de ce mot devient la fin du texte opéré, pas le premier mot du suivant ligne.

L'implémentation Vi originale de "e" est boguée. Par exemple, la commande "e" s'arrêtera sur le premier caractère d'une ligne si la ligne précédente était vide. Mais lorsque vous utilisez "2e", cela ne se produit pas. Dans Vim "ee" et "2e" sont les mêmes, ce qui est plus logique. Cependant, cela provoque une petite incompatibilité entre Vi et Vim.

fruglemonkey
la source
1
Neovim 0.2.1 ajoute un indicateur "cpoptions" "_" (souligné) qui bascule ce comportement. neovim.io/doc/user/options.html#'cpoptions '
Justin M. Keyes
6

La différence entre le comportement du mouvement dans cwvs. dwpeut être expliquée simplement: normalement si vous voulez changer un mot, vous allez laisser les espaces qui le suivent, tandis que la suppression d'un mot suggère que vous voulez que les espaces soient également supprimés.

Si vous ne voulez les espaces blancs à partir pour une raison quelconque (je le fais assez régulièrement mais ne peut pas penser à un exemple) puis utilisez le awmouvement: caw.

dash-tom-bang
la source