Как мне повторить (то есть «отменить отмену») в Vim?


697

В Vim я слишком много отменил. Как мне отменить это (то есть повторить)?


106
так как я уже собрал 2 близких голоса, я думаю, что это относится и к тому, что vim - редактор программ.
— flybywire

28
Я согласен, это связано с программированием, и это настоящий вопрос.
— DigitalRoss,

41
Кто-то здесь идет вокруг и отмечает каждый вопрос Vim как «принадлежащий SU», несмотря на то, что сообщество давно решило, что Vim принадлежит к SO, поскольку это инструмент программирования.
— Брайан Карпер

@Brian: У вас есть ссылка на документ, где был достигнут этот консенсус?
— слишком много php

12
meta.stackexchange.com/questions/20251/… но я вспоминаю, что это произошло в прошлом году. Vim / Emacs являются IDE. Более того, языки, используемые в обоих конфигурационных файлах, являются языками сценариев с полным набором Тьюринга, поэтому сам процесс настройки Vim сам по себе является программированием.
— Брайан Карпер

Ответы:


907

Ctrl+r


2
Я просто хотел бы выпустить плагин undoTree, очень круто для тех времен, когда вы, казалось, облажались с кучей отмен и повторов.
— Джейк Селлерс

3
Если я читаю о vi, то мои пальцы просто действуют сами по себе. Команды vi не работают со стековым потоком. :-)
— ciscogambo

2
Примечание для пользователей Mac: Ctrl + r в терминале Mac разрушит ваш день в vim. Не знаю, какую комбинацию клавиш в терминале Mac нужно отменить, но это определенно НЕ Ctrl + r!
— 17

@tpartee Я только что использовал Ctrl + r в vim в терминальном приложении macOS - здесь нет проблем.
— Джейс

3
Может быть, @tpartee имел в виду, что Cmd + rвсе испортилось ? Это конечно делает что-то странное; но Ctrl + rу меня все работало нормально (Mac + tmux + vim)
— dwanderson

133

Также проверьте :undolist, который предлагает несколько путей в истории отмены. Это полезно, если вы случайно напечатали что-то после слишком большого удаления.


22
@amindfv: взять число от :undolistи набрать :undo 178(скажем), чтобы перемотать к шагу 178.
— Питер

Есть ли способ показать, что именно будет отменено :undolist?
— csharpfolk

2
@csharpfolk Используйте плагин undotree ( github.com/mbbill/undotree )

54

Используйте :earlier/ :later. Чтобы повторить все, что вам нужно сделать

later 9999999d

(при условии , что вы первый редактировали файл в наиболее 9999999 дней назад), или, если вы помните разницу между текущим состоянием и отменами нуждались, использованием Nh, Nmили в Nsтечение нескольких часов, минут и секунд соответственно. + :later N<CR><=> Ng+и :later Nfдля записи в файл.


1
:laterработал для меня vi(не vim - искал "vi" в Google, но все результаты для "vim"), спасибо!
— Люк

@Luc Почти везде, где у вас есть viкоманда, это символическая ссылка на исполняемый файл vim или его копию. Хотя и не везде.
— ZyX

@ ZyX Я бы хотел, чтобы это было правдой. Я использую vi только после того, как bash бросает a vim: command not found. Следующее, что я делаю, это alias vim=viпотому, что я набираю его так автоматически, но, тем не менее, это обычный старый vi. Кроме того, redo (ctrl + r) работал бы правильно, если бы vi был псевдонимом для vim.
— Люк

2
9999999d - это 27395 лет назад. Я предполагаю, что функция отмены не была реализована в vi в то время. Возможно, вы захотите сэкономить немного времени и набрать разумное число. 9999d соответствует 27 годам, 999d - 2,7 года. Я думаю, в большинстве случаев этого достаточно ...
— ChristophK

45

Vim документация

<Undo>      or                  *undo* *<Undo>* *u*
u           Undo [count] changes.  {Vi: only one level}

                            *:u* *:un* *:undo*
:u[ndo]         Undo one change.  {Vi: only one level}

                            *CTRL-R*
CTRL-R          Redo [count] changes which were undone.  {Vi: redraw screen}

                            *:red* *:redo* *redo*
:red[o]         Redo one change which was undone.  {Vi: no redo}

                            *U*
U           Undo all latest changes on one line.  {Vi: while not
            moved off of it}

30

В командном режиме используйте Uклавишу, чтобы отменить и Ctrl+, rчтобы повторить. Посмотрите на http://www.vim.org/htmldoc/undo.html .


Как насчет в режиме вставки?
— YuFeng Shen

1
@YuFengShen мощность vim находится в командном режиме. нам не нужно переделывать в режиме вставки
— Томас Хрубовчак

Ссылка (эффективно) не работает.
— Питер Мортенсен

14

Сначала нажмите Escклавишу, чтобы выйти из режима редактирования.

Затем,

Для отмены используйте uклавишу столько раз, сколько вы хотите отменить.

Для повтора используйтеCtrlr клавишу +


11

Обратитесь к разделам «отменить» и «повторить» документа Vim .

: red [o] (Вернуть одно изменение, которое было отменено) и {count} Ctrl+r (Вернуть {изменение}, которое было отменено) оба в порядке.

Кроме того ,: ранее {count} (перейти к более старому текстовому состоянию {count} раз) всегда может заменить отмену и повтор.


5

CTRL+r

«R» в нижнем регистре.


9
На самом деле, это не должно иметь значения - традиционные консоли не имеют различий между ^rи ^R, и Vim следует за этим.
— Эфимент

@ephemient: согласился. В MS-DOS вы даже не можете вводить строчные буквы ^X(где Xможет быть любая буква).
— nyuszika7h

В Vim Ctrl-shift-R (ctrl с прописной буквой R) является режимом замены.
— Пол Стелян

5

Используете VsVim для Visual Studio?

Я сталкивался с этим, когда экспериментировал с VsVim, который предоставляет привязки для команд Vim в Visual Studio .

Я знаю об этом Ctrlrв самом Vim, но эта конкретная привязка не работает в VsVim (по крайней мере, в моей настройке?).

Что делает работу , однако, является команда :red. Это немного больше хлопот, чем выше, но все же хорошо, когда вам это действительно нужно.


Понижено, потому что вопрос задает именно vim, а не Visual Studio.
— Джон фон Нейман

3
@JohnVonNeumann Это будет связано с Vim, или по крайней мере ВИМ привязок, только в контексте VS. Это то, что привело меня к этому вопросу, в конце концов. Наказывать кого-то за добавление немного больше информации, кажется немного суровым и неуместным, как вы думаете, даже если это немного расширяется за пределы ОП?
— Кьяртан

2

Практически говоря, :undolistэто сложно использовать, :earlierа :laterотслеживание изменений в Vim и времени можно использовать только для исправлений курса.

Учитывая это, я прибегаю к плагину, который объединяет эти функции, чтобы обеспечить визуальное дерево просматриваемых отмен, называемое «Gundo».

Очевидно, что это то, что нужно использовать только тогда, когда вам нужно детальное исправление, или вы не уверены в точном состоянии документа, к которому хотите вернуться. Смотрите: Gundo. График вашего дерева отмены Vim в стиле

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.