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


132

Этот ответ говорит:

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

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


1
Завистливые пользователи Emacs могут захотеть узнать о режиме отмены-дерева .
Аарон Миллер

Ответы:


142

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

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

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

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


43
Можете ли вы объединить ветки? (Я шучу)
he_the_great

40
Своего рода из. Посмотрите: h undojoin
Pod

23
Vim настолько классный, что в нем даже реализованы способы, которыми мы шутим над тем, насколько он крутой!
andyortlieb

4
Я не знала, как пользоваться этим деревом отмены, но знала, что когда-нибудь оно спасет мне жизнь. Что ж, день настал. Спасибо!!
ndvo

1
@Pod Похоже, undojoinэто не имеет отношения к веткам; Фактически, следующий раздел справки начинается со слов: «Выше мы обсуждали только одну строку отмены / повтора. Но также возможно ответвление». Есть ли способ использовать undojoinветки, которые я просто не вижу?
Кайл Стрэнд

70

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

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


Более свежий репозиторий git существует на github.com/sjl/gundo.vim . С помощью vim-plug плагин можно установить с помощью, Plug 'sjl/gundo.vim'а затем nnoremap <F5> :GundoToggle<CR>(заменяя <F5>любой последовательностью клавиш, которую вы хотите привязать)
ewen-lbh


16

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

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

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

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

2
Этот ответ объясняет только, как двигаться вперед и назад по одной ветке. Не как перемещаться между ветками.
Джонатан Хартли,

Это будет перемещаться по всем веткам, сортируя все точки по времени. См. Ответ @BrianCarper.
Holloway

@JonathanHartley, если вы используете, earlierи laterон не перемещается по веткам. Я ожидал, что большинству людей все равно и они не помнят различные ветки, которые они создали. Но просто хочу вернуться в прошлое. Если вы хотите создавать ветки и давать им имена, возможно, gitлучше использовать систему контроля версий.
alpha_989

@ alpha_989 Ваши комментарии по поводу контроля версий не имеют смысла. Контроль версий предназначен для состояния названных файлов на диске. Мы говорим о дереве отмены Vim, которое представляет собой просто структуры данных в памяти. Оба они используют слово «ветвь», но это не одно и то же.
Джонатан Хартли

Спасибо всем, кто указал на то, что раньше / позже ДЕЙСТВИТЕЛЬНО перемещайтесь по веткам!
Джонатан Хартли

9

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

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

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


3

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


3

Пакет undotree написан на чистом vimscript, поэтому никаких требований.

И добавьте это в свой vimrc, пока не стало слишком поздно:

  set nobackup
  set noswapfile
  set nowritebackup
  set undolevels=10000         " use many levels of undo
  set history=10000    " After nocompatible

  if has('persistent_undo')
    set undodir=$HOME/.vim/undo
    set undofile 
  endif 

введите описание изображения здесь

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