Как мне повторить (то есть «отменить отмену») в 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для записи в файл.

ZYX
источник
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}
geowa4
источник
30

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

Xinus
источник
Как насчет в режиме вставки?
YuFeng Shen
1
@YuFengShen мощность vim находится в командном режиме. нам не нужно переделывать в режиме вставки
Томас Хрубовчак
Ссылка (эффективно) не работает.
Питер Мортенсен
14

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

Затем,

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

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

Amol Udage
источник
11

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

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

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

wangxinalex
источник
5

CTRL+r

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

mimetnet
источник
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. Это немного больше хлопот, чем выше, но все же хорошо, когда вам это действительно нужно.

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

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

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

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

gregory
источник