Emacs: 设置/重置 Python 调试断点

5 投票
2 回答
2717 浏览
提问于 2025-04-15 19:42

我在用 Python 调试器 pdb。我用 emacs 来编写 Python 程序,并且使用 python-mode.el。我希望让 emacs 更加直观易用。所以我需要一些关于 Python 程序(.py)的帮助:

  1. 每当我按下 'F9' 键时,emacs 应该在当前行插入 "import pdb; pdb.set_trace();" 这句话,并把当前行移动到下一行。这样这句话就能在同一行,智能缩进可能会很有帮助。

  2. 无论在 Python 代码的哪里出现 "import pdb; pdb.set_trace();" 这句话,emacs 应该在左侧显示一个指示器,并高亮显示那一行。

  3. 当我在当前行按下 'Alt-F9' 键,emacs 如果找到 "import pdb; pdb.set_trace();" 这句话,就应该把这一行删除,并把当前行移动到上一行。

  4. 每当我按下 "F8" 键时,emacs 应该跳转到同一文档中的 "import pdb; pdb.set_trace();"。

我正在努力学习 elisp,希望能尽快掌握 lisp,以便自己定制 emacs。非常感谢你的回答。

这个答案对我和其他找到这个解决方案的人来说都将非常有用。

2 个回答

0

我发现Xah的Elisp教程是了解Emacs Lisp编程基础的一个很好的起点。那里还有一些SteveY的文章,这些文章讲述了一些你可能会觉得有用的学习基础的技巧。

如果你认真想要制作一个改进版的Python模式,建议你看看编写GNU Emacs扩展,这个资料可以下载成PDF格式。

最后,对我来说,最有用的资源其实就是Emacs本身。我经常使用M-x aproposM-x describe-key来弄清楚内置函数是怎么工作的,以及是否已经有现成的功能可以满足我的需求。

你想要实现的具体功能,其实可以通过简单使用insert和一些搜索/替换的功能来完成,所以这将是一个很好的起点。

9

待办事项 1)

(defun add-py-debug ()  
      "add debug code and move line down"  
    (interactive)  
    (move-beginning-of-line 1)  
    (insert "import pdb; pdb.set_trace();\n"))  

(local-set-key (kbd "<f9>") 'add-py-debug)

待办事项 2) 你可能需要更改Python模式的语法高亮,或者自己写一个小模式。你需要了解一下font-lock,才能获取更多信息。抱歉。

待办事项 3) 我把这个设置成了C-c F9,而不是Alt-F9。

(defun remove-py-debug ()  
  "remove py debug code, if found"  
  (interactive)  
  (let ((x (line-number-at-pos))  
    (cur (point)))  
    (search-forward-regexp "^[ ]*import pdb; pdb.set_trace();")  
    (if (= x (line-number-at-pos))  
    (let ()  
      (move-beginning-of-line 1)  
      (kill-line 1)  
      (move-beginning-of-line 1))  
      (goto-char cur))))  

(local-set-key (kbd "C c <f9>") 'remove-py-debug)

还有待办事项 4)

(local-set-key (kbd "<f3>") '(lambda ()  
                                 (interactive)   
                                 (search-forward-regexp "^[ ]*import pdb; pdb.set_trace();")   
                                 (move-beginning-of-line 1)))

请注意,这段elisp代码并不是世界上最好的,但我尽量让你明白发生了什么,而不是让它变得完全符合规范。如果你想在elisp上做更多的事情,GNU Elisp书是一个很好的起点。

希望这对你有帮助。

撰写回答