Почему `cw` и` ce` делают одно и то же?

15

Это всегда беспокоило меня в отношении команд wand и Wmotion - кажется, что они работают по-разному при использовании с командой change, чем при использовании по отдельности или с командой delete.


Например, с курсором на «q» этого текста:

The quick brown fox jumps over the lazy dog.

печатать dwрезультаты в

The brown fox jumps over the lazy dog.

и печатать deрезультаты в

The  brown fox jumps over the lazy dog.

(Обратите внимание на два пробела между «The» и «коричневый».)


Команда yank также обрабатывает wи по- eразному, что можно показать, сравнивая yeP:

The quickquick brown fox jumps over the lazy dog.

и ywP:

The quick quick brown fox jumps over the lazy dog.

Тем не менее, ввод либо ceslow<Esc>либо cwslow<Esc>приводит к тому же :

The slow brown fox jumps over the lazy dog.

Это где-то задокументировано? Какая логика стоит за этим и как я могу предсказать результаты команды, которая использует w?

Wildcard
источник

Ответы:

18

Это особый случай. Проверьте документацию на WORD в разделе «Особый случай»:

Особый случай: «cw» и «cW» обрабатываются как «ce» и «cE», если курсор находится на непустом поле. Это потому, что "cw" интерпретируется как слово изменения, и слово не включает в себя следующие пробелы. {Vi: "cw", когда за пробелом следуют другие пробелы, изменяется только первый пробел; это, вероятно, ошибка, потому что "dw" удаляет все пробелы}

Еще один особый случай: если при использовании движения «w» в сочетании с оператором последнее перемещаемое слово находится в конце строки, конец этого слова становится концом оперируемого текста, а не первым словом в следующем линия.

Оригинальная реализация "е" в Vi содержит ошибки. Например, команда «e» остановится на первом символе строки, если предыдущая строка была пустой. Но когда вы используете «2е», этого не происходит. В Vim "ee" и "2e" одинаковы, что более логично. Однако это вызывает небольшую несовместимость между Vi и Vim.

fruglemonkey
источник
1
Neovim 0.2.1 добавляет флаг 'cpoptions' "_" (подчеркивание), который переключает это поведение. neovim.io/doc/user/options.html#'cpoptions '
Джастин М. Кейс,
6

Разницу между поведением движения в cwсравнении с dwможно объяснить просто: обычно, если вы хотите изменить слово, вы оставляете пробел после него, а удаление слова предполагает, что вы также хотите удалить пробел.

Если вы хотите пробельные уйти по какой - то причине (я делаю это достаточно регулярно , но не могу думать о примере) , а затем использовать awдвижение: caw.

штрих-кот-бэнг
источник