Podczas pracy nad projektem pod kontrolą wersji za pomocą git często chcę robić pewne rzeczy w powłoce, które wpływają na wiele moich otwartych plików, a następnie odwracać każdy otwarty bufor, aby upewnić się, że przypadkowo nie zablokuję nowej wersji z tym, co miałem otwarte. Wiem, że magit
może być tutaj pomocna, ale przyzwyczaiłem się do mojego przepływu pracy w powłoce i na razie chciałbym ją zatrzymać. Zamiast tego chciałbym cofnąć wszystkie otwarte bufory i być może zamknąć te, które przestały istnieć (np. Z powodu git checkout
gałęzi, która nie ma już tego pliku).
Mam następujący fragment elisp, który pobrałem z wyszukiwarki Google:
(defun revert-all-buffers ()
"Refreshes all open buffers from their respective files"
(interactive)
(let* ((list (buffer-list))
(buffer (car list)))
(while buffer
(when (and (buffer-file-name buffer)
(not (buffer-modified-p buffer)))
(set-buffer buffer)
(revert-buffer t t t))
(setq list (cdr list))
(setq buffer (car list))))
(message "Refreshed open files"))
Ale to przerwy, jeśli natrafi błąd w jednym z moich otwartych plików, to znaczy, kiedy powraca B1
, B2
, B3
, ..., Bn
błąd, starając się przywrócić B2
zapobiega B3
- Bn
przed powrócił.
Jak mogę nakazać emacsowi zignorowanie błędów, które pojawią się w tym przypadku? Nie chcę tego używać, global-auto-revert-mode
ponieważ każde przywracanie uruchamia niektóre ciężkie rzeczy, takie jak automatyczne uzupełnianie i moduł sprawdzania składni, ponownie analizujący plik i zawieszający emacsa na sekundę.
źródło
B2
bufora w twoim przykładzie. Używam bardzo podobnej funkcji (najprawdopodobniej pochodzącej z tego fragmentu) i działa dobrze.C-x s
"file no longer exists"
.. Aha! moja wersja to naprawia :) Wkrótce opublikuję.Odpowiedzi:
Oryginalny
Oto moja nieco ulepszona wersja fragmentu w pytaniu. Przeglądając moją historię VC, potwierdzam, że poniższy fragment zaczął się jako fragment opublikowany przez OP. Płacę więc temu atrybutowi.
Oto stabilny dla mnie kod:
Aktualizacja
Oto ulepszona i lepiej udokumentowana wersja powyższego, po zapoznaniu się z rozwiązaniem @ Drew .
Odniesienie
źródło
Inne:
źródło
dolist
styl, aby zastąpićcar
ipop
. Zabawne, jak możesz ulepszać konfigurację, gdy uczysz się więcej elisp :)Zaakceptowałem odpowiedź Kausala, ponieważ była ona najbliższa temu, czego chciałem, ale też skorzystałem z części rozwiązania Drew. I zawinięte
revert-buffer
wwith-demoted-errors
i upuścił:preserve-modes
parametr tak, że mój sprawdzania składni będzie ponownie przeanalizować wszystkie moje otwartych plików. Pozwalam również zabijać zarówno zmodyfikowane pliki, jak i niezmodyfikowane, ponieważ często mam problemy z przypadkowymC-x s
uruchomieniem pogit checkout
otwarciu zmodyfikowanego pliku.Ostateczna wersja to:
źródło
Naprawiłbym to za pomocą
condition-case
lubignore-errors
(dokumenty tutaj ). Nie wiem dokładnie, co będziemy chcieli go zrobić ; jeśli chcesz zrobić coś z błędami, możesz użyć,condition-case
aby określić wynik lub możesz użyć,ignore-errors
aby kontynuować. Coś jak:źródło
Na podstawie odpowiedzi @ Drew z dodatkami:
źródło