开发者

How to debug elisp?

开发者 https://www.devze.com 2023-01-08 00:05 出处:网络
Normally the easiest way to debug is using printf. What can I do to debug emacs-lisp? How can I print something to emacs editor from eli开发者_Go百科sp? Or is there any way to debug elisp code?

Normally the easiest way to debug is using printf. What can I do to debug emacs-lisp? How can I print something to emacs editor from eli开发者_Go百科sp? Or is there any way to debug elisp code?

For example, how can I check if the following code is run in .emacs file?

(load "auctex.el" nil t t)


The debugger (edebug) is pretty straight forward to use. Go to the definition of the function, and type M-x edebug-defun. The next time it is called, you'll be able to step through the code as with every other debugger. Type ? for the list of keybindings, or check out the documentation for edebug.


There are two debuggers in GNU Emacs:

  • edebug -- explained in another post here
  • debug

I use debug. These are common entry points (ways to use it):

  • M-x debug-on-entry followed by a function you want to enter using the debugger.

  • M-x toggle-debug-on-error -- Enter the debugger when when an error is raised.

  • M-x toggle-debug-on-quit -- Enter the debugger when the user hits C-g.
  • Place explicit calls to function debug at particular places (breakpoints) in your code, to enter the debugger at those places:
    (debug)

You step through the debugger using d, or c to skip over the details of a particular evaluation.


This is useful for printing values

(message "Hello (%s)" foo)

but doesn't work so well for data structures. For that, use

(prin1 list-foo)

or (prin1-to-string) to embed it in a (message).


The easiest way to debug may be to run your code interactively. You can do that in a lisp buffer by placing your point after the expression and running C-x C-e (eval-last-sexp).

Alternatively:

(message "hello world")

C-h f message to find out more about the built in message function. If you generate lots of messages, you may want to customize the variable message-log-max to a larger value.


To answer your questions one by one:

  • print something: there's a million ways. (message "Hello") puts the string in the echo area; (insert "hello") puts the string into the current buffer at point ...
  • how can I check if the following code is run: I'd just replace "auctex.el" with (say) "frotzumotzulous" (i.e., any string at all, as long as it doesn't name a real file) and then see if you get an error message. If you get no error, then clearly that code isn't being run.
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号