При undo-tree-undo/redo
последовательном запуске команды все отменено / переделано в зависимости от текущей активной ветви. Хотя пользователь получает сообщение о точке ветвления, предыдущие ветки игнорируются, если только пользователь не выбрал другую ветвь вручную.
Я понимаю, что могу открыть визуализатор и выбрать другую ветвь, однако было бы очень полезно просто удерживать клавишу отмены / повтора и смотреть, как все происходит в совершенно противоположном порядке. В идеале это должно работать независимо от того, открыт ли visualizer
буфер, т. Е. Программно рассчитывать порядок от конца до начала и от начала до конца.
Q : По сути, это запрос на расширение, undo-tree
чтобы разрешить линейную последовательную отмену / возврат, независимо от того, открыт ли буфер визуализатора. [Новые функции и альтернативные сочетания клавиш для этой новой функции, безусловно, приемлемы.]
источник
undo-tree
выглядит так, как будто он является частью концепции, которую вы можете свободно переключатьbuffer-undo-tree
иbuffer-undo-list
переключатьundo-tree-mode
. Как я понимаю ваш вопрос, оригинальная обработкаbuffer-undo-list
делает то, что вы хотите. Поэтому он предлагает себе временно отключитьсяundo-tree-mode
для вашей цели. Жаль, что переключение междуbuffer-undo-tree
и,buffer-undo-list
кажется, глючит (по крайней мере для меня). Так что, возможно, для этого нужно просто сообщить об ошибке сопровождающемуundo-tree
. Но, возможно, мое предположение об оригинальной концепции неверно.undo-tree-mode
, чтобы переключение между нимиbuffer-undo-tree
иbuffer-undo-list
работало безупречно. Рассматривали ли вы сообщение об ошибке на `toby-undo-tree @ dr-qubit.org`?undo-tree
при использовании новойlinear
функции; и я хотел бы, чтобы новаяlinear
функция работала без необходимости видеть буфер визуализатора. В общем, я реализую свои собственные улучшения / модификации Emacs, как встроенные, так и дополнительные сторонние библиотеки. Когда я застреваю или вижу что-то сверхсложное, например,undo
функцию, я прошу помощи. Запрос функции для сопровождающего не может повредить, но я бы предпочел обработать его здесь.undo-tree.el
код сегодня, я увидел, что есть функция отметки времени узла. Я не уверен, есть ли у каждого узла правильная временная метка и сохранились ли они до следующего сеанса Emacs (при восстановлении истории), но звучит так, будто это может быть ярлык для разрешения этого нового запроса функции - то есть сортировки и выбора предыдущий или следующий по времени. Я еще не видел, как выглядит план земли в точке разветвления, но ... это мои предварительные мысли. , , ,undo-list-rebuild-from-tree
. Нужноlet
связать переменнуюbuffer-undo-list
и позволитьundo-list-rebuild-from-tree
ей работать. Затем скопируйте это значение в другую локальную переменную, скажемmy-undo-list
, и оставьтеlet
-форму для привязкиbuffer-undo-list
. Переменнаяmy-undo-list
диктует линейный путь черезundo-tree
. Взглянув наundo-list-rebuild-from-tree
вас, вы увидите, что эта функция также использует временные метки. Я раньше рассматривал использование временных меток. Но у меня сложилось впечатление, что они меняются слишком часто.Ответы:
Ниже приведена прототипная реализация приблизительного значения того, что вы хотите. Он использует тот факт, что новые ветви в дереве отмены добавляются в левой части текущего узла.
Последовательность клавиш C-M-_связана с тем, как
undo-tree-walk
проходит правая верхняя часть дерева отмены, начиная с текущего узла.Поведение отличается от того, что вы хотите, если активная ветвь некоторого поддерева в правой части текущего узла не является самой левой ветвью в этом поддереве.
Вы можете попасть в такое состояние с помощью нетривальных откатов / повторов.
Попробуйте сами, чтобы увидеть, достаточно ли этого для вашего приложения.
Обратите внимание, что я добавил
undo-tree-visualize
в конец,undo-tree-walk
чтобы отобразить последствия обхода дерева отменыundo-tree-walk
. Не стесняйтесь изменять код по своему вкусу.Также обратите внимание, что мне пришлось выбрать это самое простое приближение решения для вашей проблемы из-за временных ограничений.
источник
undo-tree-walk
обойти некоторые первоначальные ошибки, возможно, из-за того, что у меня нет этого глобального режима.(when (eq buffer-undo-list t) (user-error "No undo information.")) (undo-list-transfer-to-tree)
Это заставило замолчать мои первоначальные ошибки в новом буфере, когда я пытался найти ответ. Следующим моим наблюдением было то, что онundo-tree-walk
достигает точки ветвления, а затем переключается на ветку справа, но идет только вниз по ветви на одну ступеньку / узелок, прежде чем вернуться вверх по ветке к стволу. Моя предпочтительная установка создает метку / узелок для каждого нажатия клавиши.undo-list-transfer-to-tree
как вы предложили. Перед этим я проверяю,undo-tree-mode
активен ли он, иначеundo-list-transfer-to-tree
может быть смертельным.Особая благодарность @Tobias за написание функции для поиска следующей / предыдущей отметки времени в истории отмен / повторов: https://emacs.stackexchange.com/a/32415/2287 ; а также для написания ряда функций для копирования дерева отмен: https://emacs.stackexchange.com/a/32230/2287 .
Как некоторые читатели уже могут знать, вилки принимаются MELPA только в экстремальных обстоятельствах. Создание дополнения, вероятно, выполнимо, но не представляется практичным, учитывая количество изменений, которые были внесены @lawlist - включая, помимо прочего, добавление элементов в базовые векторы структуры данных и изменение имен нескольких функции / переменные, которые не соответствовали
undo-tree-...
соглашению об именовании префиксов и т. д. @lawlist уже обратился к первоначальному автору (Dr. Cubitt), чтобы предложить эту новую функцию, а также различные исправления ошибок и улучшения.Если кто-то заинтересован, пожалуйста, не стесняйтесь, чтобы эта новая функция кружилась. Комментарий содержит образец формы отправки отчета об ошибке, начиная с
emacs -q
случая, когда у кого-то возникли проблемы.Исходный код: https://github.com/lawlist/undo_tree
Комментарий:
источник