Як використовується дерево скасування 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
Вигляд о. Подивіться: ч undojoin
Під

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.
Холлоуей

@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

Невідповідність упаковки написана чистим 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.