Как ограничить первую строку в docstrings Python до максимальной длины строки во время заполнения абзаца в Emacs?

Моя настройка - Emacs 24.4.1, Linux, исходный код Python открыт в буфере, Python mode 0.24.4 (поставляется с Emacs), fill-column установлен в 70, python-fill-docstring-style установлен в nil. Я вызываю fill-paragraph (M-q) из класса docstring класса, чтобы переформатировать docstring таким образом, чтобы строка не превышала 70 символов. Но первая строка docstring всегда длиннее. Похоже, что отступ (8 пробелов) не включен в вычисление длины строки. Что я могу сделать, чтобы ограничить длину линии до 70? Должен ли я использовать python-mode.el вместо?

Пример:

class MyClass(object):
    def my_method(self):
        """Some long line with more than 70 characters in the docstring.  Some more text."""

После M-q в docstring это выглядит так. Первая строка docstring метода заканчивается в столбце 78 (а вторая строка не имеет отступов, но другая проблема):

class MyClass(object):
    def my_method(self):
        """Some long line with more than 70 characters in the docstring.  Some
more text."""

Но с длиной строки 70 она должна быть такой:

class MyClass(object):
    def my_method(self):
        """Some long line with more than 70 characters in the
        docstring.  Some more text."""

Ответ 1

Мой ответ состоит из двух частей:

  • Это ошибка в python.el, которая поставляется с Emacs. См. Билеты GNU # 20860 и # 21254. Обходной путь заключается в форматировании docstring вручную.
  • В первой строке должно быть одно предложение, длина которого не превышает максимальную длину строки, за которой следует пустая строка. Все используемые стили docstring (django, onetwo, pep-257, pep-257-nn, симметричные) следуют этому правилу. Первое предложение не обязательно должно быть обернуто в этом случае, и первая строка не может быть слишком длинной по определению.

Ответ 2

С текущей строкой python-mode.el, r1993 и стилем по умолчанию pep-257-nn он M-q дает

class MyClass(object):
    def my_method(self):
        """Some long line with more than 70 characters in the docstring.

        Some more text.
        """