有没有办法在emacs中通过按键格式化整个python缓冲区?

4 投票
5 回答
7353 浏览
提问于 2025-04-15 13:39

我想找个方法,让Emacs通过按几个键就能格式化Python代码。这里的格式化是指:

  1. 把制表符替换成4个空格
  2. 把所有超过79个字符的长行正确换行。这包括长字符串的换行和连接、长评论的换行、列表的换行、函数头的换行等等。
  3. 另外,当我按下回车键时,光标能自动缩进就更好了。

总的来说,我希望能按照PEP 8的标准来格式化所有内容。

我找过一些Python的美化工具或者代码格式化工具,但没找到开源的。

我的.emacs文件在这里

对于那些会说“你不需要格式化工具,Python本身就很美”的人,我想说这不对。在实际的软件系统中,评论应该自动换行,字符串会超过79个字符,缩进层级会有3层以上。请直接帮我解决我的问题,不要讨论格式化Python代码的哲学问题。

5 个回答

1

使用 Spacemacs 的 Python 组件,并且使用默认的快捷键:

输入 , = 会执行 yapfify-buffer,这样就可以对整个代码文件进行 PEP8 格式化。

你可以设置

(setq-default dotspacemacs-configuration-layers '(
  (python :variables python-enable-yapf-format-on-save t)))

来实现保存时自动重新格式化代码。

1

关于你提到的第三点:

这虽然不相关,但我希望按下回车键后,光标能自动缩进。

我的 Emacs 编辑器中的 Python 模式默认就这样做。这个模式叫做 python-mode...

4

如果你想把制表符(tabs)换成空格,同时填充注释,可以使用这个命令:

(defun my-format-python-text ()
  "untabify and wrap python comments"
  (interactive)
  (untabify (point-min) (point-max))
  (goto-char (point-min))
  (while (re-search-forward comment-start nil t)
    (call-interactively 'fill-paragraph)
    (forward-line 1)))

你可以把这个命令绑定到你喜欢的快捷键上,可能像这样:

(eval-after-load "python"
  '(progn
     (define-key python-mode-map (kbd "RET") 'newline-and-indent)
     (define-key python-mode-map (kbd "<f4>") 'my-format-python-text)))

注意设置 RET 键为自动缩进。

如果你想用内置命令把所有的制表符换成空格,可以按照这个步骤操作:

C-x h           ;; mark-whole-buffer
M-x untabify    ;; tabs->spaces

为了让填充列和制表符宽度符合你的需求,可以在你的 .emacs 文件中添加:

(setq fill-column 79)
(setq-default tab-width 4)

一般来说,制表符宽度应该设置为 8,这取决于你所在环境中其他人是如何缩进代码的(8 是一些其他编辑器的默认值)。如果是这样的话,你可以在 'python-mode-hook 中把它设置为 4。这其实要看你的具体环境。

撰写回答