Можно ли не использовать отменить дерево в злом режиме?

12

Время от времени я сталкиваюсь с ошибками в дереве отмены, где я не могу повторить, со следующей известной ошибкой , другим потоком отчетов и reddit .

primitive-undo: Unrecognized entry in undo list undo-tree-canary

Это действительно плохо и может привести к потере работы, если вам не удалось сохранить самую новую версию файла.


Так как я никогда не использую функциональность дерева ветвящихся отмен, возможно ли использовать emacs linear undo со злым режимом?


Примечание: я попытался установить (global-undo-tree-mode -1)сразу после (evil-mode 1)чего отключает дерево отмены, но повтор (Ctrl-R) не работает после этого.

ideasman42
источник
2
В Emacs нет команды 'redo' (вместо этого вы прерываете последовательность отмены, а затем отменяете предыдущую последовательность команд отмены). Похоже, то, что вы сделали, сработало правильно.
Филс
1
Если ваша цель состоит в том, чтобы исправить дерево отмены, пожалуйста, свяжитесь с его автором и напишите им по электронной почте. Жаловаться на emacs-devel не поможет. Аналогичным образом, если ваша цель - позволить Злу ​​использовать отмену ванили, откройте тикет на его баг-трекере. Имейте в виду, что отмена отмены ванили - это только отмена, повторения вообще нет, только отмена отмены, следовательно, почему дерево отмены используется в первую очередь.
Васамаса
1
Моя цель - работать отменять / повторять. Я не так уж суетился. Поскольку я не использую функции дерева undo-дерева, я подумал, что проще всего использовать встроенную в emacs отмену. Тем не менее, я сообщил об ошибке автору отмены дерева.
ideasman42
У меня точно такая же проблема, это происходит примерно раз в день и очень расстраивает
cjohansson

Ответы:

7

Автор undo-tree.elToby Cubitt в настоящее время слишком занят, чтобы исправить эту конкретную ошибку. Если у него будет время в будущем, он может изучить этот вопрос дальше. Автор указал, что он испытывает трудности с надежным воспроизведением ошибки и недавно не смог воспроизвести ее, используя главную ветвь. Это происходит только при использовании undo / redo-in-region. Автор предлагает просто отключить функцию отмены / повтора в регионе.

Я настоятельно рекомендую всем, кто заинтересован найти надежный способ воспроизвести проблему, начиная с emacs -qиспользования как текущей стабильной версии Emacs (например, 25.2.1), так и с самой последней версии основной ветки, а затем отправьте эти сообщения на номер для отслеживания ошибок 16377 с копиями для участников (Стефан, Тоби, Барри и Кит).

Основной номер отслеживания - 16377, и существует связанный номер отслеживания 16523:

https://debbugs.gnu.org/cgi/bugreport.cgi?bug=16377

https://debbugs.gnu.org/cgi/bugreport.cgi?bug=16523

Вот обходной путь, который отключает эту undo/redo-in-regionфункцию:

(setq undo-tree-enable-undo-in-region nil)
lawlist
источник
1
Этот обходной путь не работает - я пробовал его и иногда все еще получаю ошибку.
ideasman42
@ ideasman42 - Насколько я знаю, Тоби Кубитт в настоящее время не знает, что ошибка может произойти, когда undo-tree-enable-undo-in-regionесть nil; и я также никогда не видел, чтобы это происходило за пределами использования отмены в регионе. Если вам удастся придумать рецепт для воспроизведения ошибки, пожалуйста, сообщите об этом команде Emacs - точная копия Dr. Cubitt также будет полезна, и если это не так уж и сложно, я уверен, что буду признателен за рецепт, если вы в состоянии придумать тот, который надежен. Извините, что у вас возникли проблемы ...
юрист
Я отправил сообщение об ошибке без ответа (несколько месяцев назад). Такие проекты, от которых зависит много людей, должны иметь общедоступную систему отслеживания ошибок.
ideasman42
16377 и 16523 действительно являются общедоступными номерами отслеживания ошибок Emacs и undo-treeофициально являются частью elpaрепозиториев. Вы можете использовать стандартный отчет Emacs об ошибке; однако конечный результат может быть таким же - то есть ожидание того, что доктор Кубитт найдет немного свободного времени в своем напряженном графике ... В какой-то момент может прийти другой гуру отмены и помочь в обслуживании пакета. Я потратил много времени на создание пользовательского форка дерева отмены, который может отменить / повторить полулинейным образом, и у меня все еще есть только базовое понимание того, как все это работает ...
Lawlist
1

Видимо, вы можете отредактировать evil-pkg.el в ~ / .emacs.d / elpa / evil-xxxxxxx / dir и удалить дерево отмены в качестве требования:

(define-package "evil" "20140109.605" "Extensible Vi layer for Emacs." '((goto-chg "1.6")))

источник

DaftWooly
источник
Это сломает отмену / повтор, чего не хочет OP.
Васамаса
1
Автор блога, на который я ссылался, сказал, что он позволил ему использовать ванильную отмену emacs, что, по-видимому, и хотел OP, когда сказал «отключить дерево отмены».
DaftWooly
1
Это должно быть последнее средство, потому что при следующем обновлении пакетов эта настройка будет перезаписана. Было бы лучше найти способ получить желаемое поведение, настроив файл инициализации.
Zck
Я согласен, к сожалению, похоже, что это единственный способ отключить уничтожение дерева во зле.
DaftWooly
Не работает для меня Я закомментировал требование и убрал undo-treeпакет, чтобы он не загружался. Теперь с помощью «повторить» не удается с Wrong type argument: commandp, redo.
Привет, Ангел,
1

Отредактируйте, теперь это пакет, который можно использовать для отмены / повтора с помощью evil-mode - undo-fu .


Добавление ответа на собственный вопрос, так как я уже некоторое время использую зло без отмены.

Это работает на удивление хорошо, чтобы отменить / повторить, что оборачивает отмену Emacs без каких-либо тяжелых, как undo-treeили redo+.

(global-undo-tree-mode -1)

(defun simple-redo ()
  (interactive)
  (let
    (
      (last-command
        (cond
          ;; Break undo chain, avoid having to press Ctrl-G.
          ((string= last-command 'simple-undo) 'ignore)
          ;; Emacs undo uses this to detect successive undo calls.
          ((string= last-command 'simple-redo) 'undo)
          (t last-command))))
    (condition-case err
      (progn
        (undo) t)
      (user-error
        (message "%s" (error-message-string err)))))
  (setq this-command 'simple-redo))

(defun simple-undo ()
  (interactive)
  (let
    (
      (last-command
        (cond
          ;; Emacs undo uses this to detect successive undo calls.
          ((string= last-command 'simple-undo) 'undo)
          ((string= last-command 'simple-redo) 'undo)
          (t last-command))))
    (condition-case err
      (progn
        (undo-only) t)
      (user-error
        (message "%s" (error-message-string err)))))
  (setq this-command 'simple-undo))
ideasman42
источник