Есть ли какой-нибудь способ отформатировать полный буфер python в emacs нажатием клавиши?

StackOverflow https://stackoverflow.com/questions/1288474

  •  18-09-2019
  •  | 
  •  

Вопрос

Я ищу любой способ заставить Emacs отформатировать буфер Python, нажав несколько клавиш.Под форматом я подразумеваю:

  1. Замените табуляцию на 4 пробела
  2. Правильно оберните все длинные строки в 79 символов.Это включает в себя перенос и конкатенацию длинных строк, перенос длинных комментариев, перенос списков, заголовков функций и т.д.
  3. Не связано, но когда я нажимаю enter, было бы неплохо, если бы курсор автоматически вставлялся в табуляцию.

В общем, я бы хотел просто отформатировать все в соответствии с PEP 8.

Я искал симпатичный принтер / средство для украшения кода / форматировщик кода для Python для запуска буфера, но не могу найти с открытым исходным кодом.

Мой .emacs - это здесь.

Для тех, кто собирается ответить "Вам не нужен форматировщик для Python, он прекрасен по природе языка", я говорю вам, что это неверно.В реальных программных системах комментарии должны быть автоматически обернуты для вас, строки должны быть длиннее 79 символов, уровни табуляции должны быть глубже 3 +.Пожалуйста, просто помогите мне решить мою проблему напрямую, без каких-либо философских дискуссий о достоинствах форматирования исходного кода Python.

Это было полезно?

Решение

Чтобы заменить табуляции пробелами и одновременно заполнить комментарии, вы можете использовать эту команду:

(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 по умолчанию используется некоторыми другими редакторами).Если это так, вы могли бы просто установить его равным 4 в 'python-mode-hook.Это отчасти зависит от вашего окружения.

Другие советы

О вашем пункте 3:

Не связано, но когда я нажимаю enter, было бы было бы неплохо, если бы курсор был переведен на вкладку автоматически.

По-видимому, мой режим emacs Python делает это по умолчанию.Это просто называется python-режим...

Используя Слой Python Spacemacs для Python с привязками по умолчанию:

Последовательность , = будет бежать yapfify-buffer наложить форматирование PEP8 на весь буфер.

Вы можете установить

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

чтобы включить автоматизацию переформатирования при сохранении.

Лучший способ избежать символов табуляции в вашем файле - это вообще не вставлять их.Следующий оператор всегда будет вставлять правильное количество пробелов, а не символы табуляции

;; Turn off tab insertion in favor of space insertion
(setq-default indent-tabs-mode nil)

Я вижу, у вас это уже есть в вашем файле .emacs

autopep8 и оболочка emacs для него должны выполнить ваше желание.. https://github.com/paetzke/py-autopep8.el

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top