Как получить мелкозернистую отмену в Vim - PullRequest
15 голосов
/ 24 мая 2010

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

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

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

Ответы [ 4 ]

22 голосов
/ 05 декабря 2010

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

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

После этого каждое слово можно отменить через u

10 голосов
/ 24 мая 2010

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

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

9 голосов
/ 24 мая 2010

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

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

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

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

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

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

Файл:

Это мой пост

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

это середина

Это конец

если бы я хотел заменить «есть» на «был», я мог бы написать: % S / \ <есть \> / WAS / г

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

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

8 голосов
/ 24 мая 2010

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

...