如何调试elisp代码——解锁elisp调试技能
缘起
在写了一些elisp函数后,一定会遇到无法运行,或并未达到预想结果的情况。这个时候就需要使用debug的功能了,但是网上似乎关于这方面的资料很少。研究了一段时间后,找到几个视频,但感觉还是云里雾里,最后还是在人工智能的帮助下,找到了方法。
edebug
我要使用的场景通常是这样,如我自己写了一个函数,并希望在未来可以使用,如:
(defun ian/winlink-to-orglink-test()
"Change the windows format absolute link to file+sys file link in Emacs."
(interactive)
(beginning-of-line)
(delete-horizontal-space) ;;以防行首有空格
(let ((filepath (thing-at-point 'line)))
(when filepath
(let(
(filename (string-trim-right (file-name-nondirectory filepath)))
(p1 (line-beginning-position))
(p2 (line-end-position)))
(save-restriction
(narrow-to-region p1 p2)
(goto-char p1)
(while (search-forward "\\" nil t)
(replace-match "/" "FIXEDCASE" "LITERAL")))
(goto-char p1)
(insert "[[file+sys:")
(end-of-line)
(insert "][")
(insert filename)
(insert"]]")
))))
调试过程
- 首先将光标放在这段程序 (ian/winlink-to-orglink-test)的中。运行
M-x edebug-defun
- 在你需要运行这个程序的地方运行这个程序。
- 运行各类指令
- n:执行下一行代码。
- c:继续执行直到下一个断点。
- q:退出调试模式。
- b:在当前行设置或取消断点。
- d:在当前行设置或取消条件断点。
- e:在当前行评估表达式。
- r:重新执行当前行。
- s:进入当前行的子函数。
- u:退出当前子函数。
- ?:显示调试命令的帮助信息。
由于目前我写的程序都相对较为简单,因此,我使用n基本就够了。