有没有办法在emacs中通过按键格式化整个python缓冲区?
我想找个方法,让Emacs通过按几个键就能格式化Python代码。这里的格式化是指:
- 把制表符替换成4个空格
- 把所有超过79个字符的长行正确换行。这包括长字符串的换行和连接、长评论的换行、列表的换行、函数头的换行等等。
- 另外,当我按下回车键时,光标能自动缩进就更好了。
总的来说,我希望能按照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
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。这其实要看你的具体环境。