autopep8重新格式化emacs / spacemacs中的区域

时间:2015-11-30 15:45:55

标签: emacs autopep8 spacemacs

我最近从vim转换为emacs(spacemacs)。 Spacemacs附带yapf作为python的标准代码重新格式化工具。当代码被破坏时,我发现autopep8在python代码上运行得更好。我无法弄清楚如何使autopep8重新格式化选定的区域,而不是整个缓冲区。在vim中,这相当于在选择或对象上运行gq函数。我们如何在emacs / spacemacs中做到这一点?

1 个答案:

答案 0 :(得分:1)

我不知道你是如何调用autopep8的,但是这个特殊的包装器已经适用于该区域或标记当前函数:https://gist.github.com/whirm/6122031

将要点保存在保留个人elisp代码的任何位置,例如~/elisp/autopep8.el

.emacs中确保您的lisp目录位于加载路径上,加载文件并覆盖键绑定:

(add-to-list 'load-path "~/elisp") ; or wherever you saved the elisp file
(require 'autopep8)
(define-key evil-normal-state-map "gq" 'autopep8)

如果没有区域处于活动状态,则要点中的版本默认为格式化当前函数。要默认使用整个缓冲区,请在文件中重写autopep8函数,如下所示:

(defun autopep8 (begin end)
  "Beautify a region of python using autopep8"
  (interactive
   (if mark-active
       (list (region-beginning) (region-end))
     (list (point-min) (point-max))))
  (save-excursion
    (shell-command-on-region begin end
                             (concat "python "
                                     autopep8-path
                                     autopep8-args)
                             nil t))))

以上设置假设您从头开始使用Emacs中的autopep8。如果你已经在Emacs中使用了几乎可以实现你想要的其他软件包的autopep8,那么如何自定义它的最终答案将取决于代码的来源以及它支持的参数和变量。输入C-h f autopep8以查看现有功能的帮助。

例如,如果现有的autopep8函数接受区域格式化的参数,那么您可以使用上面代码中的交互区域和点逻辑,并定义一个新函数来包装系统上的现有函数。

(define-key evil-normal-state-map "gq" 'autopep8-x)
(defun autopep8-x (begin end)
  "Wraps autopep8 from ??? to format the region or the whole buffer."
  (interactive
   (if mark-active
       (list (region-beginning) (region-end))
     (list (point-min) (point-max))))
  (autopep8 begin end)) ; assuming an existing autopep8 function taking
                        ; region arguments but not defaulting to the
                        ; whole buffer itself

该片段可以全部放入.emacs或您保留自定义的任何位置。