Можливо, не використовувати скасування дерева в злому режимі?


12

Кожен так часто натрапляю на помилки в скасувати дерево, де я не можу повторити, із наступною відомою помилкою , іншим звітом та редактором reddit .

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

Це дуже погано і може призвести до втрати роботи, якщо вам не вдалося зберегти найновішу версію файлу.


Оскільки я ніколи не використовую функцію дерева розгалуження відміни, чи можна використовувати лінійні скасування Emacs зі злим режимом?


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


2
У Emacs немає команди «повторити» (ви замість цього перервите послідовність скасування, а потім скасуєте попередню послідовність команд скасування). Це звучить як те, що ви зробили, працювали правильно.
філ

1
Якщо ваша мета - виправити скасування дерева, будь ласка, зв’яжіться з його автором та напишіть їм електронний лист. Скарги на emacs-devel не виправлять речі. Так само, якщо ваша мета - дозволити Злу використовувати скасування ванілі, відкрийте квиток на своєму відстежувачі помилок. Майте на увазі, хоча скасування ванілі є лише скасуванням, це взагалі не повторюється, а лише скасовується скасування, отже, чому в першу чергу використовується деревце.
wasamasa

1
Моя мета - робоче скасування / повторення. Я не так метушився саме як. Оскільки я не використовую функціональність дерева для скасування дерева, я подумав, що це може бути найпростіше використовувати вбудовані відмінки emacs. Незважаючи на це, я повідомив про помилку автору скасування дерева.
ideaman42

У мене точно таке питання, це трапляється раз на день і дуже засмучує
cjohansson

Відповіді:


7

Автор undo-tree.el, Тобі Кубітт, зараз занадто зайнятий, щоб виправити цю помилку. Якщо у нього буде час у майбутньому, він може вивчити проблему далі. Автор зазначив, що йому важко надійно відтворити помилку, і нещодавно не зміг її відтворити, використовуючи головну гілку. Це відбувається лише при використанні скасувати / повторно в регіоні. Автор пропонує тим часом просто вимкнути функцію скасувати / повторно в регіоні.

Я б настійно закликав усіх, хто вмотивований, створити надійний спосіб відтворити проблему, починаючи з 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)

1
Таке вирішення не працює - я намагався його і досі іноді ламаю.
ideaman42

@ Ideman42 - Наскільки я знаю, Тобі Кубітт наразі не знає, що помилка може виникнути, коли undo-tree-enable-undo-in-regionє nil; і я також ніколи не бачив, щоб це відбувалося за межами використання скасування в регіоні. Якщо ви зможете придумати рецепт відтворення помилки, повідомте про це команді Emacs - копія копії доктору Кубітту також буде корисною, і якщо це не буде зайвих проблем, я впевнений, що вдячний би рецепт, якщо ви вмієте придумати надійний. Вибачте, що у вас виникають проблеми ...
lawlist

Я написав повідомлення про помилку, не отримавши відповіді (кілька місяців тому). Такі проекти, від яких залежать багато людей, дійсно повинні мати публічний інструмент відстеження помилок.
ideaman42

16377 та 16523 дійсно є загальнодоступними номерами для відстеження помилок Emacs і undo-treeофіційно є частиною elpaсховищ. Ви можете використовувати стандартну помилку звіту Emacs; однак кінцевий результат може бути таким самим, тобто чекати, коли доктор Кубітт знайде вільний час у своєму напруженому графіку ... У якийсь момент може прийти ще один гуру для скасування та допомогти у підтримці пакету. Я витратив чимало часу на створення власної вилки для скасування дерева, яка може відмінятись / повторюватися напівлінійним способом, і у мене все ще є лише основне розуміння того, як це все працює ...
законник

1

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

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

джерело


Це скасує скасування / повтор, що не є тим, чого хоче ОП.
wasamasa

1
Автор блогу, з яким я пов’язаний, сказав, що це дозволило йому використовувати скасування ванілі emacs. Це, здається, те, чого хотів ОП, коли сказав "відключити дерево скасування".
DaftWooly

1
Це справді має бути в останню чергу, адже наступного разу, коли ви оновлюєте пакунки, це налаштування буде перезаписано. Було б краще знайти спосіб отримати потрібну поведінку, налаштувавши свій файл init.
zck

Я згоден, на жаль, здається, це єдиний спосіб відключити скасування дерева на зло.
DaftWooly

Не працює для мене. Я прокоментував цю вимогу і перемістив undo-treeпакет з шляху, щоб він не завантажувався. Тепер використання "повтору" не вдається Wrong type argument: commandp, redo.
Привіт-Ангел

1

Редагувати, тепер це пакет, який можна використовувати для скасування / повторення в злому режимі - скасувати фу .


Додавання відповіді на власне запитання, оскільки я вже деякий час використовую зла з / без скасування дерева.

Це надзвичайно добре скасовує / повторює, що завершує завершення 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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.