Czy można nie używać cofania drzewa w trybie zła?

12

Co jakiś czas napotykam błędy w cofnięciu drzewa, gdzie nie mogę ponownie wykonać, z następującym znanym błędem , innym raportem i wątkiem reddit .

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

Jest to naprawdę złe i może powodować utratę pracy, jeśli nie zapisałeś najnowszej wersji pliku.


Skoro nigdy nie używam funkcji rozgałęziającego drzewa cofania, czy można używać emacs liniowego cofania w trybie zła?


Uwaga: próbowałem ustawienia (global-undo-tree-mode -1)bezpośrednio, po (evil-mode 1)którym wyłącza cofanie drzewa, ale ponowne wykonanie (Ctrl-R) nie działa po wykonaniu tego.

ideasman42
źródło
2
Emacs nie ma polecenia „ponów” (zamiast tego przerywasz sekwencję cofania, a następnie cofasz poprzednią sekwencję poleceń cofania). Wygląda na to, że to, co zrobiłeś, działało poprawnie.
phils
1
Jeśli Twoim celem jest naprawienie cofnięcia drzewa, skontaktuj się z jego autorem i napisz do niego wiadomość e-mail. Narzekanie na emacs-devel niczego nie naprawi. Podobnie, jeśli Twoim celem jest zezwolenie Złu na cofanie wanilii, otwórz bilet na swoim narzędziu do śledzenia błędów. Pamiętaj jednak, że cofanie waniliowe jest tylko cofaniem, nie ma w ogóle żadnego powtarzania, tylko cofanie cofania, dlatego właśnie w pierwszej kolejności używa się cofania.
wasamasa,
1
Moim celem jest mieć działające cofanie / ponawianie. Nie jestem tak zdenerwowany jak. Ponieważ nie używać drzewa funkcjonalność cofania drzewa Pomyślałem, że może to być najprostszy w użyciu emacs wbudowane cofania. Mimo to zgłosiłem błąd autorowi cofania drzewa.
ideasman42
Mam dokładnie ten sam problem, zdarza się to raz dziennie i jest bardzo frustrujący
cjohansson

Odpowiedzi:

7

Autor undo-tree.elToby Cubitt jest obecnie zbyt zajęty, aby naprawić ten konkretny błąd. Jeśli ma czas w przyszłości, może przyjrzeć się temu zagadnieniu. Autor wskazał, że ma trudności z niezawodnym odtworzeniem błędu, a ostatnio nie był w stanie go odtworzyć za pomocą gałęzi master. Występuje tylko w przypadku cofania / ponawiania w regionie. W międzyczasie autor sugeruje wyłączenie funkcji cofania / ponawiania w regionie.

Gorąco zachęcam każdego, kto jest zmotywowany do wymyślenia niezawodnego sposobu na odtworzenie problemu, zaczynając od emacs -qużycia zarówno bieżącej stabilnej wersji Emacsa (np. 25.2.1), jak i najnowszej wersji gałęzi master, a następnie prześlij te przepisy na numer śledzenia błędów 16377 z kopiami do uczestników (Stefan, Toby, Barry i Keith).

Główny numer śledzenia to 16377, a powiązany numer śledzenia to 16523:

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

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

Oto obejście, które wyłącza tę undo/redo-in-regionfunkcję:

(setq undo-tree-enable-undo-in-region nil)
lista prawnicza
źródło
1
To obejście nie działa - próbowałem go i wciąż czasami popełniam błąd.
ideasman42
@ ideasman42 - O ile mi wiadomo, Toby Cubitt jest obecnie nieświadomy, że błąd może wystąpić, gdy undo-tree-enable-undo-in-regionjest nil; i nigdy też nie widziałem, aby miało to miejsce poza użyciem cofania w regionie. Jeśli jesteś w stanie wymyślić przepis na odtworzenie błędu, zgłoś go zespołowi Emacsa - pomocna byłaby również kopia do dr Cubitt, a jeśli nie będzie to zbyt duży problem, z pewnością docenię przepis, jeśli jesteś w stanie wymyślić taki, który jest niezawodny. Przepraszam, że masz problemy ...
lista prawników z
Wysłałem raport o błędzie bez odpowiedzi (kilka miesięcy temu). Projekty takie jak ten, na których wiele osób polega, powinny naprawdę mieć publiczny moduł śledzenia błędów.
ideasman42
16377 i 16523 są rzeczywiście publicznymi numerami śledzenia błędów Emacsa i undo-treesą oficjalnie częścią elparepozytoriów. Możesz użyć standardowego zgłoszenia błędu Emacsa; jednak wynik końcowy może być taki sam - tj. czekanie, aż dr Cubitt znajdzie trochę wolnego czasu w swoim napiętym harmonogramie ... W pewnym momencie może przyjść inny cofający się guru i pomóc w utrzymaniu pakietu. Spędziłem dużo czasu, tworząc niestandardowy widelec cofania drzewa, który może cofać / powtarzać w sposób półliniowy, i nadal mam tylko podstawowe zrozumienie, jak to wszystko działa ...
Lawlist
1

Najwyraźniej możesz edytować evil-pkg.el w ~ / .emacs.d / elpa / evil-xxxxxxx / dir i usunąć cofanie drzewa jako wymaganie:

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

źródło

DaftWooly
źródło
To złamie cofanie / ponawianie, czego nie chce OP.
wasamasa,
1
Autor bloga, który podlinkowałem, powiedział, że pozwala mu używać cofania wanilii emacsa, to wydaje się być tym, czego OP chciał, gdy powiedział „wyłącz drzewo cofania”.
DaftWooly,
1
Powinno to naprawdę być rozwiązaniem ostatecznym, ponieważ przy następnej aktualizacji pakietów dostosowanie zostanie zastąpione. Lepiej byłoby znaleźć sposób, aby uzyskać pożądane zachowanie, konfigurując plik init.
zck 17.07.17
Zgadzam się, niestety wydaje się, że jest to jedyny sposób na wyłączenie cofania drzew w złu.
DaftWooly 17.07.17
Nie działa dla mnie. Skomentowałem wymaganie i odsunąłem undo-treepaczkę na bok, aby się nie ładowała. Teraz użycie polecenia „Ponów” kończy się niepowodzeniem Wrong type argument: commandp, redo.
Cześć Anioł
1

Edytuj, jest to teraz pakiet, którego można używać do cofania / ponawiania w trybie zła - cofania-fu .


Dodanie odpowiedzi na własne pytanie, ponieważ od jakiegoś czasu używam zła bez cofania drzewa.

Działa to zaskakująco dobrze w przypadku cofania / ponawiania, które otacza cofanie emacsa bez niczego ciężkiego, takiego jak undo-treelub 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
źródło