Possible de ne pas utiliser undo-tree en mode diabolique?

12

De temps en temps, je rencontre des bogues dans l'annuaire, où je ne peux pas refaire, avec le bogue connu suivant , un autre rapport et un fil reddit .

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

C'est vraiment mauvais et peut entraîner une perte de travail si vous n'avez pas enregistré la dernière version du fichier.


Étant donné que je n'utilise jamais la fonctionnalité d'arborescence d'annulation de ramification, est-il possible d'utiliser l'annulation linéaire emacs avec le mode diabolique?


Remarque: j'ai essayé de définir (global-undo-tree-mode -1)directement après (evil-mode 1)quoi désactive l'annulation de l'arborescence, mais la restauration (Ctrl-R) ne fonctionne pas après cela.

ideasman42
la source
2
Emacs n'a pas de commande «redo» (vous interrompez à la place la séquence d'annulation, puis annulez la séquence précédente de commandes d'annulation). Il semble que ce que vous avez fait fonctionne correctement.
phils
1
Si votre objectif est de faire réparer l'annulation de l'arbre, veuillez contacter son auteur et lui écrire un e-mail. Se plaindre sur emacs-devel ne réglera pas les choses. De même, si votre objectif est de permettre à Evil d'utiliser vanilla undo, ouvrez un ticket sur son bug tracker. Gardez à l'esprit que l'annulation de vanille est uniquement annulée, il n'y a pas du tout de rétablissement, uniquement l'annulation de l'annulation, d'où la raison pour laquelle l'annulation de l'arbre est utilisée en premier lieu.
wasamasa
1
Mon objectif est de faire défaire / refaire. Je ne suis pas si embêté exactement comment. Comme je n'utilise pas la fonctionnalité d' arborescence de l'annulation, j'ai pensé qu'il serait peut-être plus simple d'utiliser l'annulation intégrée d'emacs. Même ainsi, j'ai signalé le bogue à l'auteur de l'annulation de l'arborescence.
ideasman42
J'ai exactement le même problème, il se produit environ une fois par jour et est très frustrant
cjohansson

Réponses:

7

L'auteur de undo-tree.el, Toby Cubitt, est actuellement trop occupé pour corriger ce bogue particulier. S'il a du temps à l'avenir, il pourrait approfondir la question. L'auteur a indiqué qu'il a du mal à reproduire l'erreur de manière fiable et qu'il n'a pas été en mesure récemment de la reproduire à l'aide de la branche principale. Cela se produit uniquement lors de l'utilisation de l'annulation / du rétablissement dans la région. L'auteur suggère de désactiver entre-temps la fonction annuler / rétablir dans la région.

J'encourage fortement toute personne motivée à trouver un moyen fiable de reproduire le problème en emacs -qutilisant à la fois la version stable actuelle d'Emacs (par exemple, 25.2.1) et également avec la version la plus récente de la branche principale, puis soumettre ces recettes au numéro de suivi des bogues 16377 avec des copies carbone aux participants (Stefan, Toby, Barry et Keith).

Le numéro de suivi principal est 16377, et il existe un numéro de suivi associé 16523:

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

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

Voici la solution de contournement qui désactive la undo/redo-in-regionfonctionnalité:

(setq undo-tree-enable-undo-in-region nil)
liste des lois
la source
1
Cette solution de contournement ne fonctionne pas - je l'ai essayé et je me casse encore parfois.
ideasman42
@ ideasman42 - Pour autant que je sache, Toby Cubitt ignore actuellement que l'erreur peut se produire quand undo-tree-enable-undo-in-regionest nil; et, je n'ai également jamais vu cela se produire en dehors de l'utilisation de l'annulation dans la région. Si vous êtes en mesure de trouver une recette pour reproduire l'erreur, veuillez la signaler à l'équipe Emacs - une copie carbone au Dr Cubitt serait également utile, et si cela ne vous pose pas trop de problèmes, j'apprécierais certainement la recette si vous êtes en mesure d'en trouver un qui est fiable. Désolé que vous rencontrez des problèmes ...
lawlist
J'ai envoyé un rapport de bogue sans réponse (il y a quelques mois). Les projets comme celui-ci dont dépendent de nombreuses personnes devraient vraiment avoir un outil de suivi des bogues public.
ideasman42
16377 et 16523 sont en effet des numéros de suivi de bogues Emacs publics et font undo-treeofficiellement partie des elparéférentiels. Vous pouvez utiliser le bogue Emacs de rapport standard; cependant, le résultat final peut être le même - c'est-à-dire, attendre que le Dr Cubitt trouve du temps libre dans son emploi du temps chargé ... À un moment donné, un autre gourou de l'annulation peut venir et aider à maintenir le package. J'ai passé beaucoup de temps à créer un fork personnalisé de défaire un arbre qui peut défaire / refaire de façon semi-linéaire, et je n'ai encore qu'une compréhension de base de la façon dont tout cela fonctionne ...
Lawlist
1

Apparemment, vous pouvez modifier evil-pkg.el dans ~ / .emacs.d / elpa / evil-xxxxxxx / dir et supprimer l'annulation de l'arborescence comme condition:

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

la source

DaftWooly
la source
Cela annulera / rétablira ce qui n'est pas ce que OP souhaite.
wasamasa
1
L'auteur du blog que j'ai lié a dit qu'il lui permettait d'utiliser la vanille d'emacs, ce qui semble être ce que voulait OP lorsqu'il a dit "désactiver l'arbre d'annulation".
DaftWooly
1
Cela devrait vraiment être une solution de dernier recours, car la prochaine fois que vous mettrez à jour des packages, cette personnalisation sera écrasée. Il serait préférable de trouver un moyen d'obtenir le comportement souhaité en configurant votre fichier init.
zck
Je suis d'accord, malheureusement, cela semble être le seul moyen de désactiver l'annulation de l'arbre dans le mal.
DaftWooly
Ça ne marche pas pour moi. J'ai commenté l'exigence et déplacé le undo-treepaquet pour qu'il ne se charge pas. Maintenant, l'utilisation de "redo" échoue avec Wrong type argument: commandp, redo.
Hi-Angel
1

Edit, c'est maintenant un paquet qui peut être utilisé pour annuler / refaire avec evil-mode - undo-fu .


Ajout d'une réponse à ma propre question depuis que j'utilise mal sans annuler l'arbre depuis un certain temps maintenant.

Cela fonctionne étonnamment bien pour annuler / refaire, ce qui encapsule l'annulation d'emacs sans rien de lourd comme undo-treeou 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
la source