Как получить мелкозернистую отмену в Vim

Я считаю, что Vim undo слишком груб. Например. если я напечатаю что-то вроде этого:

a // to go into edit mode
to be or not to ve
<esc> // to exit insert mode

Oops! Я сделал опечатку. Я хочу начать отмену, поэтому я нажимаю u, но затем очищает всю строку. Есть ли способ отменить по одному или по одному символу?

Ответы

Ответ 1

Итак, как вы видите из других, то, что вы просите, не существует в Vi (AFAIK).

Отменить отменяет действие вашего последнего действия. Если ваше последнее действие состояло в том, чтобы войти в режим вставки, а затем добавить строку, а затем выйти из режима вставки. Это будет отменено, однако если из режима по умолчанию вы нажмете клавишу "x", вы удалите 1 символ или если в визуальном режиме с выбранным текстом текст будет удален. Если вы нажмете кнопку "Отменить", вы восстановите этот один символ или текст, который был выбран.

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

Как уже упоминалось ранее, если вы хотите удалить предыдущее слово, вы можете нажать Ctrl + w и удалить предыдущее слово, оставаясь в режиме вставки.

Если вы выходите из режима вставки, вы можете перемещать (движение) назад слово с буквой "b" вперед с "w" до конца слова "e" и вырезать (что оставляет вас в режиме вставки) с "c" или удалить с помощью "d". Оба действия cut and delete могут принимать движение, следуя за ними, поэтому вы можете удалить текущее слово/до следующего слова с помощью "dw" или вырезать предыдущее слово с помощью "cb"

Эта концепция становится более полезной, когда вы помните использовать ".". (в обычном режиме). Эта команда должна повторить последнее действие. Я использовал это много раз, чтобы найти и заменить небольшую группу слов в файле (это особенно полезно, если вы параноик об изменении слишком много). Сценарий будет следующим:

Файл:

Это мой пост

действительно это тест

это средний

Это конец

Если бы я хотел заменить "is" на "was" , я мог бы написать: % S/\ < является\ > /WAS/г

однако, если бы я хотел изменить первую строку, а третья строка "была" на "была" (и я не знал их номера строк, и мне хотелось посмотреть, есть ли какие-либо другие места, которые я хотел бы изменить, я мог бы ввести "/Есть"

нажмите "n", пока я не доберусь до места, которое хочу заменить, а затем нажмите "cw" и введите "was" Теперь я могу нажать "n", пока не дойду до другого места, которое я хочу заменить, и нажмите ".", И это заменит "is" на "was" (Примечание: моя строка поиска не ограничивала слово "is" , просто два символа "есть", поэтому "This" и "This" будут совпадать в этом случае)

Ответ 2

Вы можете отменить отмену через :help i_ctrl-g_u. Вы можете сопоставить это, если хотите, для каждого персонажа, но это может быть немного сложнее. Отображение этой кнопки пробела является способом.

:inoremap <Space> <Space><C-g>u

После этого каждое слово можно отменить с помощью u

Ответ 3

Нет, это невозможно и на самом деле не нужно. У Vim есть миллион способов борьбы с этим. Например, попробуйте c b. Или b c. Или b r b. Или T space для возврата назад вместо b. Или c i w.

Вы можете, конечно, использовать большинство этих решений в режиме вставки (сначала нажав CTRL o) или привязать его к вашей любимой комбинации клавиш (:help map и :help imap).

Ответ 4

В Linux, используя control-w, в то время как в режиме ввода удаляет последнее слово.