¿Es posible no usar undo-tree en modo malvado?


12

De vez en cuando me encuentro con errores en undo-tree, donde no puedo rehacer, con el siguiente error conocido , otro informe y reddit hilo .

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

Esto es realmente malo y puede causar pérdida de trabajo si no guarda la versión más reciente del archivo.


Como nunca uso la funcionalidad de árbol de deshacer de ramificación, ¿es posible usar emacs linear deshacer con el modo malvado?


Nota: He intentado configurar (global-undo-tree-mode -1)directamente después de lo (evil-mode 1)cual desactiva el árbol de deshacer, pero rehacer (Ctrl-R) no funciona después de hacer esto.


2
Emacs no tiene un comando 'rehacer' (en su lugar, interrumpe la secuencia de deshacer y luego deshace la secuencia anterior de comandos de deshacer). Parece que lo que has hecho ha funcionado correctamente.
Phil

1
Si su objetivo es arreglar el árbol de deshacer, póngase en contacto con su autor y escríbale un correo electrónico. Quejarse en emacs-devel no solucionará las cosas. Del mismo modo, si su objetivo es permitir que Evil use deshacer vainilla, abra un ticket en su rastreador de errores. Tenga en cuenta, sin embargo, que deshacer vainilla es deshacer solo, no hay rehacer en absoluto, solo deshacer deshacer, por lo tanto, por qué se utiliza deshacer-tree en primer lugar.
wasamasa

1
Mi objetivo es tener trabajando deshacer / rehacer. No estoy tan preocupado exactamente cómo. Como no uso la funcionalidad de árbol de deshacer árbol, pensé que podría ser más simple usar deshacer incorporado de emacs. Aun así, le informé del error al autor del deshacer árbol.
ideasman42

Tengo exactamente el mismo problema, ocurre una vez al día y es muy frustrante
cjohansson

Respuestas:


7

El autor de undo-tree.el, Toby Cubitt, actualmente está demasiado ocupado para solucionar este error en particular. Si tiene tiempo en el futuro, puede investigar más el problema. El autor ha indicado que tiene dificultades para reproducir el error de manera confiable, y recientemente no pudo reproducirlo usando la rama maestra. Solo ocurre cuando se usa deshacer / rehacer en la región. El autor sugiere simplemente desactivar la función deshacer / rehacer en la región mientras tanto.

Recomiendo encarecidamente a cualquiera que esté motivado a encontrar una forma confiable de reproducir el problema a partir del emacs -quso de la versión estable actual de Emacs (por ejemplo, 25.2.1) y también con la versión más reciente de la rama maestra, y luego envíe esas recetas al número de seguimiento de errores 16377 con copias al carbón a los participantes (Stefan, Toby, Barry y Keith).

El número de seguimiento principal es 16377, y hay un número de seguimiento relacionado 16523:

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

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

Aquí está la solución que desactiva la undo/redo-in-regionfunción:

(setq undo-tree-enable-undo-in-region nil)

1
Esta solución alternativa no funciona: lo probé y todavía me vuelvo a hacer de nuevo.
ideasman42

@ ideasman42 - Hasta donde yo sé, Toby Cubitt actualmente no es consciente de que el error puede ocurrir cuando undo-tree-enable-undo-in-regiones nil; y, nunca he visto que ocurra fuera del uso de deshacer en la región. Si puede encontrar una receta para reproducir el error, infórmelo al equipo de Emacs; una copia al Dr. Cubitt también sería útil, y si no es demasiado problema, le agradecería receta si puede encontrar una que sea confiable. Lo sentimos que usted está teniendo problemas ...
lawlist

Envié un informe de error sin respuesta (algunos meses atrás). Los proyectos como este del que dependen muchas personas deberían tener un rastreador de errores público.
ideasman42

16377 y 16523 son números públicos de seguimiento de errores de Emacs y undo-treeoficialmente son parte de los elparepositorios. Puede usar el informe estándar de error de Emacs; sin embargo, el resultado final puede ser el mismo, es decir, esperar que el Dr. Cubitt encuentre algo de tiempo libre en su apretada agenda ... En algún momento, otro gurú de deshacer puede venir y ayudarlo a mantener el paquete. Me pasó una gran cantidad de tiempo la creación de un tenedor costumbre de deshacer-árbol que puede deshacer / rehacer de forma semi-lineal, y todavía tener solamente un conocimiento básico de cómo funciona todo ...
lawlist

1

Aparentemente, puedes editar evil-pkg.el en ~ / .emacs.d / elpa / evil-xxxxxxx / dir y eliminar undo-tree como requisito:

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

fuente


Eso romperá deshacer / rehacer, que no es lo que OP quiere.
wasamasa

1
El autor del blog que vinculé dijo que le permitía usar la función de deshacer de vainilla de emacs, que parece ser lo que OP quería cuando dijo "desactivar el árbol de deshacer".
DaftWooly

1
Esto debería ser realmente un último recurso, porque la próxima vez que actualice paquetes, se sobrescribirá esta personalización. Sería mejor encontrar una manera de obtener el comportamiento que desea configurando su archivo de inicio.
zck

Estoy de acuerdo, desafortunadamente parece ser la única forma de deshabilitar undo-tree en el mal.
DaftWooly

No funciona para mi Comenté el requisito y undo-treesaqué el paquete para que no se cargara. Ahora el uso de "rehacer" falla con Wrong type argument: commandp, redo.
Hola Ángel,

1

Editar, ahora es un paquete que se puede usar para deshacer / rehacer con evil-mode - undo-fu .


Agregando respuesta a la propia pregunta ya que he estado usando el mal sin deshacer árbol por algún tiempo.

Esto funciona sorprendentemente bien para deshacer / rehacer, lo que envuelve emacs deshacer sin nada pesado como undo-treeo 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))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.