Как vim определяет размер одного «edit» при использовании «u» и «CTL-R»?

17

При использовании uили CTL-Rдля отмены или повторного редактирования в vim я, кажется, изменяю фрагменты текста, а не только последнее нажатие клавиши.

От чего зависит размер фрагмента, который считается единичным редактированием?

DQdlM
источник

Ответы:

19

Вы ищете определение undo-blocks.

От :h undo-blocks:

Одна команда отмены обычно отменяет набранную команду, независимо от того, сколько изменений она вносит. Эта последовательность отменяемых изменений образует блок отмены. Таким образом, если набранные клавиши вызывают функцию, все команды в функции отменяются вместе.

Этот же блок используется для redo. От :h redo:

Последние изменения запоминаются. Вы можете использовать команды отмены и возврата выше, чтобы вернуть текст к тому, что было до каждого изменения. Вы также можете применить изменения снова, вернув текст перед отменой.

vappolinario
источник
4
Вы также можете вручную разбить один блок отмены с помощью команды CTRL-G uв режиме вставки, что полезно, если у вас есть несколько макросов режима вставки.
fruglemonkey
8

Модальные редактирования Vim, часто рассматриваются как оператор (например c, d...) применяется над движением (например iw, w, }, ...). В качестве замечательного продукта Vim получает толстые отменить. В то время как другим редакторам приходится делать какие-то догадки, чтобы превратить множество маленьких откатов в блоки отмены, Vim делает это естественно. Еще один побочный эффект - это дает вам оператор повтора .(он же точка).

В вашем вопросе конкретно упоминаются нажатия клавиш, поэтому я предполагаю, что вы хотите знать, как отменить небольшие изменения в режиме вставки. Ответ в том, что это не «путь Vim». «The Vim Way» означает, что вы будете в режиме вставки для короткой серии за раз. Это означает, что при ошибках в режиме вставки вы часто просто выходите в обычный режим и исправляете текст или просто отменяете его uи переписываете текст.

Иногда необходимо разделить блок отмены в режиме вставки. Это может быть выполнено через <c-g>uрежим вставки. Смотрите :h :undojи :h undo-blocksдля получения дополнительной информации.

Для получения дополнительной помощи я предлагаю следующее:

:h undo-blocks
:h :undoj
:h undo-tree
:h persistent-undo
:h undo.txt

Есть также несколько скринкастов на эту тему:

Питер Ринкер
источник
«Коренастый отменить» - лучшее описание, которое я видел.
Мэтт Паркер
6

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

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

Примечание: если вы используете стрелки для перемещения, это как если бы вы нажали Esc+ [ hjkl]

Wylex
источник