Как используется дерево отмены VIM?

В этом ответе говорится:

Система Vim undo/redo является непревзойденной. Напечатайте что-нибудь, отмените, введите что-то еще, и вы можете вернуть первое, что вы набрали, потому что Vim использует дерево отмены, а не стек. В почти каждой другой программе история первого, что вы набрали, теряется в этом обстоятельстве.

Это первое, что я слышал об этом. Как я могу вернуться назад по дереву?

Ответ 1

См. также :h undo-redo, в котором перечислены все команды и их использование.

Есть два способа перемещения дерева отмены. Один из них - "вернуться во времени". g+ и g- будут перемещаться по всем узлам в дереве в хронологическом или обратном хронологическом порядке (что может быть немного запутанным, поскольку оно может произвольно перемещаться между ветвями отмены, но если вы делаете g- достаточно долго, вы 'всегда всегда туда, куда вам нужно идти в конце концов). :earlier и :later взять дескриптор времени, например 7m или 1h; снова это может сканировать вас произвольно между ветвями отмены.

Другим способом является переход к определенным узлам в дереве с помощью :undo n, где n - это число действий. (Все действия, т.е. Текстовые дополнения, удаления, замены, нумеруются последовательно, как вы их делаете.) Вы можете посмотреть количество действий на листьях дерева отмены с помощью :undolist. Это позволит вам легко прыгать между ветвями. Затем вы можете использовать u и Ctrl-R для перемещения вверх и вниз по этой ветке.

В помощи Vim есть несколько хороших примеров. Лучший способ выяснить, как это работает, - немного поиграть с ним.

Ответ 2

Я немного опаздываю на вечеринку, но, полагаю, я бы упомянул, что написал для Vim плагин визуализации дерева отмены: http://bitbucket.org/sjl/gundo.vim/

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

Ответ 4

Если вы используете vim, вы можете перемещаться по дереву отмены, используя:

  • u: (отменить) вернуться в дерево отмены
  • Ctrl+R: (redo) перемещение вперед в дереве отмены

Другие способы возврата документа или вперед во времени:

  • :earlier 15m: вернуться назад во времени 15 минут
  • :later 15m: перемещение вперед во времени 15 минут

Ответ 6

Я знаю, что на этот вопрос был дан ответ, но я подумал, что добавлю пример.

Создайте новый файл и введите:

this is a line

undol отобразит дерево отмены. На данный момент вы ничего не отменили

:undol

number changes  when               saved
     1       1  14:50:36

теперь нажмите ESC и измените строку на:

this is a old line

переключитесь в обычный режим и нажмите u (отменить), это должно удалить "старый". Если вы проверите undol, на данный момент у вас все еще есть только одна ветка.

теперь измените строку так, чтобы она говорила:

this is a new line

Теперь :undol показывает:

number changes  when               saved
     2       2  87 seconds ago
     3       2  3 seconds ago

Вы можете переключиться на первую ветку, набрав

:u 2

это переместит вас в конец ветки, связанной с номером 2. Вы можете перемещаться вдоль этой ветки с помощью g+ и g-. На данный момент g+ ничего не сделает (вы на листе). Если вы нажмете g- "старый", будет удален (вы пересекаете первое дерево отмены). То есть, если вы удалите "старый" с помощью g- и снова нажмите g+, "старый" будет переделан.

Если вы наберете

:u 3

Вы перейдете к листу второй ветки отмены, и он будет читать:

this is a new line

Ответ 7

Кроме использования gundo.vim, я хотел бы упомянуть g+ и g-