понедельник, 26 октября 2015 г.

Визуальные undo redo в Emacs

Концепция операций undo/redo кажется выверенной и отточенной многими годами, добавить туда что-то новое не возможно. Большинство редакторов впрочем и не пытаются, полностью сосредоточившись на редизайне кнопок в интерфейсе и добавлении новых шкурок. В Emacs'е же, попытки изменить устоявшуюся концепцию есть и на мой взгляд удачные.


Есть такой замечательный плагин undo-tree, он основан на том, что "undo/redo" в принципе являются частным случаем системы контроля версий. И в процессе редактирования текста периодически возникают "ветки", которые нужно показывать пользователям и дать возможность по ним "ходить".

Вот допустим написали мы "hello", потом откатились назад на пустую страницу и написали "word", теперь в большинстве редакторов никакими "ctrl+Z" откатиться до "hello" не возможно. А с этим плагином в Emacs сделать такое не сложно, вот как это выглядит:

Настройка в простейшем случае, проблем не вызывает:
(require 'undo-tree)
(global-undo-tree-mode)
После установки продолжают работать стандартные не визуальные "undo/redo". Но при необходимости всегда можно вызывать расширенное "дерево отмены" через "M-x undo-tree-visualize". Пользоваться им постоянно конечно не удобно, но когда понадобиться, не раз скажешь спасибо автору.

Подробнее про навигацию и расширенные возможности неплохо написано в документации.

12 комментариев:

  1. Подскажите, пожалуйста, как предотвратить открытие undo-tree в новом фрейме, и установить вертикальное разбиение по умолчанию?

    ОтветитьУдалить
    Ответы
    1. Я никаких специализированных настроек не делал, но у меня undo-tree использует второй открытый фрейм, а не создает новый. Или я не правильно понял вопрос? В любом случае, у меня полностью дефолтное поведение и я к нему настолько привык, что даже в голову не приходило, что-то еще донастраивать. Но думаю можно спросить у автора напрямую http://www.dr-qubit.org/emacs.php#undo-tree-bugs

      Удалить
    2. У меня открывается новое окно (в смысле полноценное Emacs окно уровня ОС), а мне бы хотелось иметь все это в переделах уже открытого Emacs и разбиение вертикальное как у вас, а не горизонтальное.

      Удалить
    3. Возможно дело в версии, у меня стоит из melpa репозитория: 20140509.522

      Удалить
    4. Я правда для этого ничего особенного не делал, я даже не знаю как открыть в emacs второе окно )
      Я всего лишь "вертикально" разбил окно на 2 через "C-x 3" https://www.gnu.org/software/emacs/manual/html_node/emacs/Split-Window.html После этого undo-tree сам стал выбирать второе окно, как на GIF-ке

      Удалить
    5. >>Возможно дело в версии, у меня стоит из melpa репозитория: 20140509.522
      Думаю дело не в версии, я бы попробовал воспроизвести проблему на чистом emacs без всего, только с плагином undo-tree, мне кажется это какие-то настройки ломают всё.

      Удалить
    6. Написал автору, может быть он чего посоветует..
      Спасибо

      Удалить
    7. Автор оказался членом королевского исследовательского общества и предложил почитать документацию по емаксу. Решил проблему путем добавления пары собственных функций и key-binding'ов.
      А что у вас за тема, кстати на гифе?

      Удалить
    8. Solarized: http://melpa.org/#/solarized-theme
      Mode line - сам писал

      Удалить
    9. Спасибо. А код для mode line где-нибудь доступен?

      Удалить
    10. Да конечно, вот тут та часть конфига, которая отвечает за него: https://github.com/ReanGD/dotfiles/blob/master/.config/emacs/minor/mode-line-cfg.el

      Правда не думаю, что он будет сильно полезен, я это писал скорее для того, что бы понять, как там внутри всё устроено

      Удалить
    11. Мне понравилось оформление, но тут похоже всего на два окна расчитано. В любом случае спасибо.

      Удалить