如何调试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"]]")
	 ))))

调试过程

  1. 首先将光标放在这段程序 (ian/winlink-to-orglink-test)的中。运行 M-x edebug-defun
  2. 在你需要运行这个程序的地方运行这个程序。
  3. 运行各类指令
    1. n:执行下一行代码。
    2. c:继续执行直到下一个断点。
    3. q:退出调试模式。
    4. b:在当前行设置或取消断点。
    5. d:在当前行设置或取消条件断点。
    6. e:在当前行评估表达式。
    7. r:重新执行当前行。
    8. s:进入当前行的子函数。
    9. u:退出当前子函数。
    10. ?:显示调试命令的帮助信息。

由于目前我写的程序都相对较为简单,因此,我使用n基本就够了。

海上一民工

Related