Jak rozwiązywać problemy z Emacsem?

21

W sytuacji, gdy Emacs nie zachowuje się tak, jak chcę, co mogę zrobić, aby rozwiązać problem? Jakie kroki mogę podjąć, aby samemu znaleźć i naprawić problem?

Lub, w przeciwnym razie, w jaki sposób mogę zebrać przydatne informacje, aby ludzie tutaj (lub na liście mailingowej lub na innych forach) mogli mi pomóc z moim problemem?

My Emacs zawiera wiele paczek, zbiór fragmentów kopiowanych i wklejanych (lub zabijanych i szarpanych) z całego Internetu oraz mój własny elips, z których niektórych nie pamiętam pisania ani już nie rozumiem. Czy istnieje sposób na zrozumienie tych wszystkich komplikacji?

Tyler
źródło
Nie jestem pewien, czy jest to najlepsze miejsce do tego, ale jest wiele pytań, które wymagają odpowiedzi / komentarzy emacs -Qjako pierwszy krok. Napisałem to jako coś do połączenia tych pytań z ogólną pomocą dla nowych użytkowników.
Tyler,
Tak, to najlepsze miejsce na to. Właściwie takie pytanie zostało zasugerowane (prawie) 2 lata temu: meta.emacs.stackexchange.com/q/198/184 Dzięki!
T. Verron

Odpowiedzi:

28

Krok 1: bieganie emacs -Q

Pierwszą rzeczą, którą musisz zrobić, to uruchomić emacsa bez żadnych dostosowań. Jeśli możesz odtworzyć problem w waniliowym Emacsie, może to być błąd w samym Emacsie. To rzadkie, ale wykluczamy to jako pierwszy krok.

Jeśli uruchomisz Emacsa z wiersza poleceń z -Qflagą, tzn. emacs -QDostaniesz goły lub „waniliowy” emacs, bez załadowania żadnych lokalnych dostosowań. Czy Twój problem nadal występuje? Jeśli tak, przejdź do „Zapewnienia przepisu na błąd”.

Krok 1b: Co jeśli problem dotyczy pakietu?

Jeśli twój problem dotyczy konkretnego pakietu, to oczywiście nie możesz go odtworzyć bez załadowania tego pakietu. Ale chcesz załadować tylko odpowiedni pakiet, a nie całą konfigurację. Aby to zrobić, uruchom emacs -Qponownie i przygotuj krótki skrypt, taki jak:

(require 'package)
(setq package-load-list
      '((package1 t)))
(package-initialize)

Zamień package1na nazwę pakietu, który chcesz załadować. Jeśli musisz załadować wiele pakietów, odpowiednio zmodyfikuj skrypt:

(require 'package)
(setq package-load-list
      '((package1 t)
        (package2 t)
        (package3 t)))
(package-initialize)

Aby załadować ten kod, możesz go wkleić do *scratch*bufora i wywołać M-x eval-buffer. (lub dowolny bufor, o ile nie ma w nim żadnego innego kodu!).

W tym momencie załadowałeś pakiety, a tylko pakiety, które testujesz. Jeśli możesz teraz odtworzyć problem, przejdź do „Zapewnianie przepisu na błąd”.

Krok 2: Znalezienie błędu w twoim .emacs

Potwierdziłeś, że problem pochodzi z czegoś w twojej konfiguracji („połączenie przychodzi z domu!”). Twoja konfiguracja może mieć wiele tysięcy linii i może ładować wiele różnych plików. Aby znaleźć problem, przeszukujesz dane binarne, komentując połowę kodu na raz, aby zawęzić listę. 1

  1. Otwórz swoje zwykłe emacsy emacs, bez -Qopcji.
  2. Otwórz plik konfiguracyjny (zwykle ~/.emacslub .emacs.d/init.el, jeśli nie możesz go znaleźć, spróbuj C-h v user-init-file)
  3. Wybierz pierwszą połowę pliku: C-spaceaby ustawić znak, przewiń w dół do połowy, aby rozszerzyć region
  4. Skomentuj wybrany region: M-;i zapisz plik
  5. Otwórz nowy emacs ( testowy emacs ), pozostawiając uruchomione pierwsze emacs. test emacs odczyta zredukowaną wersję twojej konfiguracji.
  6. Spróbuj odtworzyć problem w testowych emacsach
  7. Jeśli nie możesz go odtworzyć, zamknij test emacsa , a w oryginalnym emacs undoskomentuj C-/i skomentuj połowę pozostałego kodu. Otwórz nowy emac testowy i spróbuj ponownie.
  8. Jeśli możesz odtworzyć problem, skomentuj połowę pozostałego kodu i sprawdź, czy problem nadal występuje.
  9. Powtarzaj ten proces, aż znajdziesz najmniejszy fragment konfiguracji niezbędny do odtworzenia problemu.

Jeśli twój problem dotyczy konkretnego pakietu, oczywiście musisz zostawić kod, który ładuje ten pakiet, bez komentarza.

Jeśli plik konfiguracyjny ładuje inne pliki, możesz również rozszerzyć wyszukiwanie na te pliki.

W tym momencie być może zauważyłeś, że problem wynika tylko z jednej lub dwóch linii kodu. Być może będziesz w stanie to naprawić samodzielnie. Jeśli tak, gratulacje, nauczyłeś się czegoś! W przeciwnym razie przejdź do kroku trzeciego.

Krok 3: Zapewnienie przepisu na błąd

W tym momencie powinieneś być w stanie podać szczegółowy przepis na błąd, aby opublikować tutaj. Powinien obejmować:

  • Twoja wersja Emacsa (możesz to uzyskać od Emacsa za pomocą M-x emacs-version
  • Twój system operacyjny (Windows #, Mac, dystrybucja Linux)
  • Wersja pakietu, z którym się zmagasz, jeśli dotyczy
  • Konkretne kroki niezbędne do zademonstrowania problemu, w tym to, czego się spodziewasz i co faktycznie się stanie .

Na przykład mogę opublikować takie pytanie:

Mam problem z trybem super. Kiedy korzystam M-x sm-compile-code, dokonuje wypłaty z mojego konta PayPal.

Kroki ku reprodukcji:

Załaduj super-tryb:

(require 'package)
(setq package-load-list
      '((super-mode t)))
(package-initialize)
  • otwórz nowy plik za pomocą C-x C-f my-code
  • wprowadź wiersz kodu:
10 goto 10
  • połączenie M-x sm-compile-code

Spodziewam się, że wywoła to superkompilator i skompiluje mój program. Zamiast tego widzę komunikat w minibuforze „100 $ przeniesione z paypal do autora w trybie super”

GNU Emacs 25.1.50.3
Debian Linux
Super-mode wersja 3.1415


1 Pakiet Bug Hunter może ci w tym pomóc (częściowo) automatycznie podzielony plik init.

Tyler
źródło
Może mógłbyś wspomnieć o Łowisku błędów .
Omar,