Всем привет, с Вами еженедельная рубрика "Секреты Вим"! Сегодня поговорим об отмене действий --- важнейшей возможности, если много работаешь с текстом.
В Виме, в отличие от классического vi, undo неограниченный. В vi команда u отменяла последнюю команду, в том числе и предыдущую u. То есть u отменяла-повторяла одно изменение.
Команда u в Виме отменяет сколь угодно далеко.
Ну, не совсем так: параметр undolevels задает глубину. По умолчанию он 1000.
Есть команда командной строки :undo. Можно отменить отмену, Ctrl+R или :redo.
Важно понимать, что такое изменение, правка, команда. Например, если вы удалили слово командой cw и впечатали новое слово, то это --- одна правка. Если вы включили режим вставки и час печатали, то это --- тоже одна правка. С одной стороны, печатав час, вы не можете вернуться на полчаса назад. С другой, тысяча правок --- более, чем достаточно. Выходите из режима вставки, напечатав одну мысль, это хорошая практика. Отпадет необходимость отменять полчаса работы))) Заодно и файл сохраните.
Пара undo-redo, u и <C-R>, линейна: вы можете двигаться по истории изменений взад-вперед, но не можете делать новых изменений. Если вы отменили три правки и сделали новую, то redo работать не будет. Та ветвь утрачена.
Но не насовсем! Команды g- и g+ позволяют двигаться по истории правок, линейно пронумерованных.
Пусть вы сделали семь правок, потом три отменили и сделали еще пять. Всего двенадцать правок, если с Undo, то 15, все по порядку. Командами g- и g+ можно гулять взад-вперед по этой истории.
Если вы отменили хоть одну правку и сделали новую, появилось ветвление в дереве истории правок. Команда :undolist выводит список ветвлений. Для каждого ветвления указан абсолютный номер правки, число правок от начала работы до текущей (длина пути от корня дерева до данного ветвления) и --- самое приятное --- дата и время ветвления, причем в удобном формате. От "8 секунд назад" до полной даты, с годом и точным временем. Указывается еще и номер сохранения файла на диск, если таковое имело место.
Команда :earlier работает как g-, но можно указать число шагов или время: :earlier 8s, :earlier 2h, и так далее: s --- секунды, m --- минуты, h --- часы, d --- дни. f --- сохранения файла.
Парная команда :later работает симметрично.
Обычно при выходе дерево правок теряется. Но можно его сохранить, если перед сохранением файла выставить флаг undofile. По умолчанию он отключен. Файлы не удаляются, даже если уже не нужны.
Можно сохранить историю и вручную :wundo файл, считать потом :rundo файл.
Для конфигов и исходных текстов, где часто редактируются отдельные строки, полезна команда U, которая отменяет все, что делалось на строке. Ее саму отменяет u, так что проблем не возникает.
Удачи, коллеги. И да помогут вам undo, redo и древо истории правок!