Як зробити повтор (тобто "скасувати скасування") у 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 не працюють на stackoverflow. :-)
ciscogambo

2
Примітка для користувачів Mac: Ctrl + r у терміналі Mac зіпсує ваш день у vim. Не знаю правильного комбінації клавіш у терміналі Mac, щоб скасувати, але це, безумовно, НЕ Ctrl + r!
tpartee

@tpartee Я щойно використовував Ctrl + r in vim під програмою Terminal macOS - тут проблем немає.
Jase

3
Можливо, @tpartee означав, що Cmd + rпсує речі? Це, безумовно, робить щось дивне; але Ctrl + rякраз добре працював для мене (Mac + tmux + vim)
dwanderson

133

Також перегляньте :undolist, який пропонує кілька шляхів історії скасування. Це корисно, якщо ви випадково щось набрали після занадто великої відміни.


22
@amindfv: візьміть число від :undolistі введіть :undo 178(скажіть) перемотування назад на крок 178.
Петро

чи є спосіб показати, що саме буде скасовано :undolist?
csharpfolk

2
@csharpfolk Використовуйте плагін unotree ( 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 лише після того, як баш кидає vim: command not found. Наступне, що я роблю, це alias vim=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 ключ стільки разів, скільки потрібно скасувати.

Для повтору використовуйте клавішу Ctrl+r


11

Дивіться частину "скасувати" та "повторити" частину документа Vim .

: red [o] (Повторити одну зміну, яку не було скасовано) та {count} Ctrl+ r(Redo {count} зміни, які було скасовано) - це нормально.

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


5

CTRL+r

"R" є малі.


9
Насправді це не має значення - традиційні консолі не мають різниці між ^rі ^R, і Vim слідує за цим.
ephemient

@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".

Очевидно, що це щось, що потрібно використовувати лише тоді, коли вам потрібно виправити дрібнозернистий виправлення, або якщо ви не впевнені в точному стані документа, до якого ви хочете повернутися. Див .: Гундо. Графікуйте ваше дерево Vim скасувати за стилем

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.