Jak debugować elisp?

Zwykle najprostszym sposobem debugowania jest użycie printf. Co mogę zrobić, aby debugować emacs-lisp? Jak Mogę wydrukować coś do edytora emacs z elisp? Lub czy jest jakiś sposób na debugowanie kodu elisp?

Na przykład, Jak mogę sprawdzić, czy poniższy kod jest uruchamiany w pliku .emacs?

(load "auctex.el" nil t t)
Author: AdrieanKhisbe, 2010-07-15

5 answers

Debuger (edebug) jest dość prosty w użyciu. Przejdź do definicji funkcji i wpisz M-x edebug-defun . Następnym razem, gdy zostanie wywołany, będziesz mógł przejść przez KOD, jak w przypadku każdego innego debugera. Typ ?Aby uzyskać listę skrótów klawiszowych, zapoznaj się z dokumentacją edebug.

 79
Author: Trey Jackson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-15 17:26:41

W GNU Emacs są dwa debuggery:

  • edebug -- wyjaśnione w innym poście tutaj
  • debug

Używam debug. Są to wspólne punkty wejścia (sposoby jego wykorzystania):

  • M-x debug-on-entry po którym następuje funkcja, którą chcesz wprowadzić za pomocą debuggera.

  • M-x toggle-debug-on-error -- Wprowadź debugger, gdy wystąpi błąd.

  • M-x toggle-debug-on-quit -- Wprowadź debugger, gdy użytkownik naciśnie C-G.
  • umieszczanie jawnych wywołań funkcji debug w określonych miejscach (punktach przerwania) w kodzie, aby wprowadzić debugger w tych miejscach:
    (debug)

Przechodzisz przez debugger używając d , lub c , aby pominąć szczegóły konkretnej oceny.

 33
Author: Drew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-21 02:16:06

Jest to przydatne do drukowania wartości

(message "Hello (%s)" foo)

Ale nie działa tak dobrze dla struktur danych. W tym celu użyj

(prin1 list-foo)

Lub (prin1-to-string), aby osadzić go w (wiadomości).

 16
Author: jplindstrom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-10 18:05:26

Najprostszym sposobem debugowania może być interaktywne uruchamianie kodu. Możesz to zrobić w buforze Lispu, umieszczając swój punkt za wyrażeniem i uruchamiając C-x C-e (eval-last-sexp).

Alternatywnie:

(message "hello world")

C-h F message aby dowiedzieć się więcej o wbudowanej funkcji wiadomości. Jeśli generujesz dużo wiadomości, możesz chcieć dostosować zmienną message-log-max do większej wartości.

 7
Author: Dave Bacher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-15 17:29:25

Aby odpowiedzieć na twoje pytania jeden po drugim:

    Wydrukuj coś: jest milion sposobów. (wiadomość "Hello") umieszcza łańcuch w obszarze ECHA; (insert "hello") umieszcza łańcuch w bieżącym buforze w punkcie...
  • Jak mogę sprawdzić, czy następujący kod jest uruchomiony: po prostu zamieniłbym " auctex.el "z (powiedzmy)" frotzumotzulous "(tzn. dowolny ciąg znaków, o ile nie nazywa prawdziwego pliku), a następnie sprawdź, czy otrzymasz komunikat o błędzie. Jeśli nie pojawi się błąd, to wyraźnie, że kod nie jest bycie uciekającym.
 3
Author: offby1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-15 23:08:46