Possibile non usare undo-tree in modalità male?


12

Ogni tanto mi imbatto in bug in undo-tree, dove non riesco a ripetere, con il seguente bug noto , un altro report e thread reddit .

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

Questo è davvero male e può causare la perdita di lavoro se non ti è capitato di salvare la versione più recente del file.


Dato che non utilizzo mai la funzionalità di annullamento delle ramificazioni dell'albero, è possibile utilizzare l'annullamento lineare di emacs con la modalità malvagia?


Nota: ho provato a impostare (global-undo-tree-mode -1)direttamente dopo di (evil-mode 1)che disattiva l'albero di annullamento, ma la ripetizione (Ctrl-R) non funziona dopo averlo fatto.


2
Emacs non ha un comando 'redo' (devi invece interrompere la sequenza di annullamento e quindi annullare la precedente sequenza di comandi di annullamento). Sembra che quello che hai fatto abbia funzionato correttamente.
phils,

1
Se il tuo obiettivo è riparare un-tree, ti preghiamo di metterti in contatto con il suo autore e scrivere loro un'e-mail. Lamentarsi su emacs-devel non risolverà le cose. Allo stesso modo, se il tuo obiettivo è consentire a Evil di usare l'annullamento della vaniglia, apri un ticket sul suo bug tracker. Tieni presente, tuttavia, che l'annullamento della vaniglia è solo annulla, non esiste alcuna ripetizione, annulla solo l'annullamento, quindi perché l'annullamento dell'albero viene utilizzato in primo luogo.
Wasamasa,

1
Il mio obiettivo è di annullare / ripetere il lavoro. Non sono così agitato esattamente come. Dal momento che non utilizzo la funzionalità tree di undo-tree ho pensato che sarebbe stato più semplice usare l'annullamento integrato di emacs. Anche così, ho segnalato il bug all'autore di undo-tree.
ideasman42

Ho lo stesso identico problema, succede una volta al giorno ed è molto frustrante
cjohansson,

Risposte:


7

L'autore di undo-tree.elToby Cubitt è attualmente troppo impegnato per risolvere questo particolare bug. Se ha tempo in futuro, potrebbe approfondire ulteriormente la questione. L'autore ha indicato di avere difficoltà a riprodurre l'errore in modo affidabile e di recente non è stato in grado di riprodurlo utilizzando il ramo master. Si verifica solo quando si utilizza annulla / ripristina nella regione. L'autore suggerisce semplicemente di disattivare la funzione di annullamento / ripetizione nella regione nel frattempo.

Incoraggerei fortemente chiunque sia motivato a trovare un modo affidabile per riprodurre il problema a partire emacs -qdall'uso sia dell'attuale versione stabile di Emacs (ad esempio, 25.2.1) sia della versione più recente del ramo master, e quindi inviare tali destinatari al numero di tracciamento bug 16377 con copie carbone ai partecipanti (Stefan, Toby, Barry e Keith).

Il numero di tracciamento principale è 16377 e esiste un numero di tracciamento 16523 correlato:

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

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

Ecco la soluzione alternativa che disattiva la undo/redo-in-regionfunzionalità:

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

1
Questa soluzione alternativa non funziona: l'ho provata e talvolta mi rompono ancora.
ideasman42

@ ideasman42 - Per quanto ne so, Toby Cubitt non è al momento a conoscenza del fatto che l'errore può verificarsi quando lo undo-tree-enable-undo-in-regionè nil; e non l'ho mai visto accadere al di fuori dell'utilizzo dell'annullamento nella regione. Se riesci a trovare una ricetta per riprodurre l'errore, ti preghiamo di segnalarlo al team Emacs: una copia carbone al Dr. Cubitt sarebbe anche utile, e se non ci sono troppi problemi, sicuramente apprezzerei il ricetta se riesci a trovarne uno affidabile. Mi dispiace che tu stia
riscontrando

Ho inviato una segnalazione di bug senza risposta (alcuni mesi fa). Progetti come questo su cui molte persone dipendono dovrebbero davvero avere un localizzatore di bug pubblico.
ideasman42

16377 e 16523 sono effettivamente numeri di tracciamento dei bug di Emacs pubblici ed undo-treeè ufficialmente parte dei elparepository. È possibile utilizzare il bug Emacs standard del report; tuttavia, il risultato finale potrebbe essere lo stesso - vale a dire, in attesa che il Dr. Cubitt trovi del tempo libero nella sua fitta agenda ... Ad un certo punto, potrebbe arrivare un altro guru di annullamento e aiutare a mantenere il pacchetto. Ho trascorso molto tempo a creare un fork personalizzato di annulla-albero che può annullare / ripetere in modo semi-lineare, e ho ancora solo una conoscenza di base di come funziona tutto ...
elenco delle leggi

1

Apparentemente puoi modificare evil-pkg.el in ~ / .emacs.d / elpa / evil-xxxxxxx / dir ed eliminare undo-tree come requisito:

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

fonte


Ciò interromperà l'annullamento / la ripetizione che non è ciò che OP desidera.
Wasamasa,

1
L'autore del blog che ho collegato ha detto che gli ha permesso di usare la vanilla undo di emacs, che sembra essere ciò che OP ha voluto quando ha detto "disabilita la struttura di annullamento".
DaftWooly,

1
Questa dovrebbe essere davvero l'ultima cosa, perché la prossima volta che aggiorni i pacchetti, questa personalizzazione verrà sovrascritta. Sarebbe meglio trovare un modo per ottenere il comportamento desiderato configurando il file init.
zck,

Sono d'accordo, purtroppo sembra essere l'unico modo per disabilitare l'annullamento nel male.
DaftWooly,

Non funziona per me. Ho commentato il requisito e ho rimosso il undo-treepacchetto in modo che non si caricasse. Ora usando "redo" fallisce con Wrong type argument: commandp, redo.
Ciao Angelo

1

Modifica, questo è ora un pacchetto che può essere usato per annullare / ripetere con modalità malvagia - undo-fu .


Aggiungendo la risposta alla propria domanda da quando uso il male senza annulla l'albero da qualche tempo.

Questo funziona sorprendentemente bene per annullare / ripetere che avvolge emacs annulla senza nulla di pesante come 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))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.