autopep8 переформатирует регион в emacs/spacemacs

Я недавно перешел из vim в emacs (spacemacs). Spacemacs поставляется с yapf в качестве стандартного инструмента переформатирования кода для Python. Я считаю, что autopep8 лучше работает на коде Python, когда код не работает. Я не могу понять, как заставить autopep8 переформатировать выбранную область, а не весь буфер. В VIM это эквивалентно запуску gq функция на выбор или объект. Как мы это делаем в emacs/spacemacs?

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)

Версия в GIST по умолчанию форматирует текущую функцию, если ни одна область не активна. По умолчанию для всего буфера, переписать функцию 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))))

Приведенная выше настройка предполагает, что вы начинаете с нуля с autopep8 в Emacs. Если у вас уже есть autopep8 в Emacs из какого-либо другого пакета, который почти выполняет то, что вы хотите, окончательный ответ на вопрос о том, как настроить его, будет зависеть от того, откуда поступает код, а также от того, какие аргументы и переменные он поддерживает. Тип 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 или там, где вы храните свои настройки.

Другие вопросы по тегам