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 или там, где вы храните свои настройки.