Przy undo-tree-undo/redo
sukcesywnym uruchamianiu polecenia czynności są cofane / powtarzane na podstawie bieżącej aktywnej gałęzi. Chociaż po drodze użytkownik otrzymuje komunikat punktu rozgałęzienia, poprzednie gałęzie są ignorowane, chyba że użytkownik ręcznie wybierze inną gałąź.
Rozumiem, że mogę otworzyć wizualizator i wybrać inną gałąź, jednak bardzo przydatne byłoby po prostu przytrzymanie klawisza cofania / ponawiania i obserwowanie, jak wszystko dzieje się w dokładnie odwrotnej kolejności. Najlepiej byłoby, gdyby działało to niezależnie od tego, czy visualizer
bufor jest otwarty - tj. Programowo oblicza kolejność od początku do końca i od początku do końca.
P : Zasadniczo jest to żądanie rozszerzenia funkcji, undo-tree
aby umożliwić liniowe kolejne cofanie / ponawianie, niezależnie od tego, czy bufor wizualizatora jest otwarty. [Nowe funkcje i alternatywne skróty klawiaturowe dla tej nowej funkcji są z pewnością dopuszczalne.]
źródło
undo-tree
Wygląda na to, że kod wygląda na to, że możesz swobodnie przełączać się międzybuffer-undo-tree
ibuffer-undo-list
poprzez przełączanieundo-tree-mode
. Jak rozumiem twoje pytanie, oryginalne postępowaniebuffer-undo-list
robi to, co chcesz. Sugeruje się więc tymczasowe wyłączenieundo-tree-mode
w zależności od celu. Szkoda, że przełączanie międzybuffer-undo-tree
ibuffer-undo-list
wydaje się być wadliwe (przynajmniej dla mnie). Być może więc droga będzie tylko zgłoszeniem błędu do opiekunaundo-tree
. Ale może moje przypuszczenia dotyczące oryginalnej koncepcji są błędne.undo-tree-mode
takiego, aby przełączanie międzybuffer-undo-tree
ibuffer-undo-list
działało bezbłędnie. Czy rozważałeś wydanie raportu o błędzie na `toby-undo-tree @ dr-qubit.org`?undo-tree
podczas korzystania z nowejlinear
funkcji; i chciałbym, aby nowalinear
funkcja działała bez konieczności pokazywania bufora wizualizatora. Ogólnie, wdrażam własne ulepszenia / modyfikacje Emacsa, zarówno jego wbudowane, jak i opcjonalne biblioteki innych firm. Kiedy utknę lub zobaczę coś bardzo złożonego, jak taundo
funkcja, proszę o pomoc. Żądanie funkcji od opiekuna nie mogło zaszkodzić, ale wolałbym się tym zająć tutaj.undo-tree.el
dzisiaj na kod, zauważyłem, że istnieje funkcja znacznika czasu węzła. Nie jestem pewien, czy każdy węzeł ma prawidłowy znacznik czasu i czy przetrwają do następnej sesji Emacsa (podczas przywracania historii), ale wygląda na to, że może to być skrót do rozwiązania tego nowego żądania funkcji - tj. Sortowania i wybierania poprzedni lub następny w czasie. Nie widziałem jeszcze, jak układ terenu wygląda w punkcie rozgałęzienia, ale ... takie są moje wstępne myśli. . . .undo-list-rebuild-from-tree
. Należylet
-wiązać zmiennąbuffer-undo-list
i pozwolićundo-list-rebuild-from-tree
jej wykonać swoją pracę. Następnie skopiuj tę wartość do innej zmiennej lokalnej, powiedzmymy-undo-list
, i pozostawlet
-form do wiązaniabuffer-undo-list
. Zmiennamy-undo-list
określa ścieżkę liniową przezundo-tree
. Po obejrzeniuundo-list-rebuild-from-tree
widać, że ta funkcja używa także znaczników czasu. Wcześniej rozważałem użycie znaczników czasu. Ale miałem wrażenie, że zmieniają się zbyt często.Odpowiedzi:
Poniżej znajduje się prototypowa implementacja przybliżenia tego, co chcesz. Wykorzystuje to fakt, że nowe gałęzie w cofniętym drzewie są dodawane po lewej stronie bieżącego węzła.
Powiązana C-M-_jest sekwencja klawiszy, z
undo-tree-walk
którą przechodzi prawa górna część drzewa cofania, zaczynając od bieżącego węzła.Zachowanie różni się od tego, czego chcesz, jeśli aktywna gałąź jakiegoś poddrzewa po prawej stronie bieżącego węzła nie jest gałęzią najbardziej wysuniętą w lewo w tym poddrzewie.
Możesz wejść w taki stan, wykonując niebanalne sekwencje cofania / powtarzania.
Po prostu spróbuj sam, aby sprawdzić, czy to wystarczy do twojej aplikacji.
Zauważ, że dodałem
undo-tree-visualize
na końcu,undo-tree-walk
aby wyświetlić konsekwencje chodzenia po cofniętym drzewieundo-tree-walk
. Zmodyfikuj kod według własnych upodobań.Zauważ też, że musiałem wybrać to najprostsze przybliżenie rozwiązania twojego problemu z powodu ograniczeń czasowych.
źródło
undo-tree-walk
ominąć niektóre początkowe błędy, być może dlatego, że nie mam tego trybu globalnie aktywny.(when (eq buffer-undo-list t) (user-error "No undo information.")) (undo-list-transfer-to-tree)
To uciszyło moje początkowe błędy w nowym buforze podczas wypróbowywania tej odpowiedzi. Moje następne spostrzeżenieundo-tree-walk
dotyczyło dotarcia do punktu rozgałęzienia, a następnie przełączenia do gałęzi po prawej stronie, ale zstępuje tylko o jeden stopień / guzek przed powrotem do gałęzi do pnia. Moja preferowana konfiguracja tworzy wycięcie / guzek dla każdego naciśnięcia klawisza.undo-list-transfer-to-tree
zgodnie z propozycją. Wcześniej sprawdzam, czyundo-tree-mode
jest aktywny, inaczejundo-list-transfer-to-tree
może być śmiertelny.Specjalne podziękowania dla @Tobias za napisanie funkcji do zlokalizowania następnego / poprzedniego znacznika czasu w historii cofania / ponawiania: https://emacs.stackexchange.com/a/32415/2287 ; a także w celu napisania szeregu funkcji do skopiowania drzewa cofnięć: https://emacs.stackexchange.com/a/32230/2287 .
Jak niektórzy czytelnicy mogą już wiedzieć, widelce są akceptowane przez MELPA tylko w ekstremalnych okolicznościach. Utworzenie dodatku jest prawdopodobnie wykonalne, ale nie wydaje się praktyczne, biorąc pod uwagę liczbę zmian dokonanych przez @lawlist - w tym między innymi dodanie elementów do wektorów struktury danych i zmianę nazw kilku funkcje / zmienne, które nie były zgodne z
undo-tree-...
konwencją nazewnictwa prefiksów itp. @lawlist skontaktował się już z oryginalnym autorem (Dr. Cubitt), aby zaoferować tę nową funkcję, a także różne poprawki i ulepszenia błędów.Jeśli ktoś jest zainteresowany, zachęcamy do skorzystania z tej nowej funkcji. Komentarz zawiera przykładowy formularz zgłoszenia raportu o błędzie, zaczynający się
emacs -q
na wypadek, gdyby ktoś miał problemy.Kod źródłowy: https://github.com/lawlist/undo_tree
Komentarz:
źródło