Faire en sorte que le paragraphe de remplissage dans la docstring en python laisse les triples guillemets sur une ligne séparée

16

Je tape une docstring python sur une seule ligne comme ceci:

"""
This is a long docstring. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur. Donec ut libero sed arcu vehicula ultricies a non tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor. Pellentesque auctor nisi id magna consequat sagittis.
"""

puis je frappe Mq ( fill-paragraph), et j'obtiens ceci:

"""This is a long docstring. Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Donec a diam lectus. Sed sit amet ipsum
mauris. Maecenas congue ligula ac quam viverra nec consectetur ante
hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas
mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem
lacinia consectetur. Donec ut libero sed arcu vehicula ultricies a non
tortor. Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed,
adipiscing id dolor. Pellentesque auctor nisi id magna consequat
sagittis.

"""

J'ai deux problèmes avec ceci:

  1. Le docstring commence sur la même ligne que le """- Je préfère que la citation triple reste sur sa propre ligne.
  2. (Priorité beaucoup plus faible.) La docstring se termine par une ligne vierge.

L'exemple ci-dessus est artificiel, mais je rencontre cela fréquemment, en particulier lors de l'édition de docstrings existants où j'aimerais simplement M-qet faire refluer l'ensemble du para.

bstpierre
la source

Réponses:

15

Personnalisez en python-fill-docstring-styleconséquence, en supposant que vous utilisez le mode Python intégré dans Emacs 24.4. La valeur par défaut est pep-257, ce qui conduit au style que vous avez observé, c'est-à-dire pas de nouvelle ligne au début et deux nouvelles lignes avant la fin d'une docstring.

Modifiez cette variable en symmetricou djangopour que le mode Python obéisse à votre style préféré, c'est-à-dire une nouvelle ligne au début de la docstring et une nouvelle ligne avant la fin:

(setq python-fill-docstring-style 'django)

Sinon, définissez-le via Variables de répertoire , pour configurer le style de docstring individuellement par projet.

symmetricet djangosont différents docstrings sur une seule ligne. Le premier met les guillemets triples sur la même ligne si une docstring tient sur une seule ligne, tandis que le second met les guillemets triples sur des lignes distinctes dans ce cas.

Jetez un œil à la docstring depython-fill-docstring-style pour voir toutes les options disponibles.

lunaryorn
la source
-1

À la fin de la ligne vide, cela ressemble à un bug simple, veuillez le signaler avec M-x report-emacs-bug. Mais pour le premier élément, je ne sais pas si c'est un bogue ou une fonctionnalité, donc vous voudrez peut-être le mentionner dans votre rapport de bogue, mais peut-être que la réponse sera qu'il suit simplement la convention "PEP-NNN".

Cela dit, vous pourrez peut-être résoudre le premier problème avec les éléments suivants:

(add-hook 'python-mode-hook
          (lambda ()
            (set (make-local-variable 'paragraph-separate)
                 (concat paragraph-separate "\\|^[ \t]*\"\"\"[ \t]*$"))))
Stefan
la source
1
Ce n'est ni un bug, ni un changement paragraph-separate. Le style docstring de python.elest personnalisable.
lunaryorn
Wow, je n'aurais jamais deviné qu'une ligne vide supplémentaire à la fin de docstring pourrait être quelque chose imposé par une norme.
Stefan
1
La norme (PEP 257) n'applique pas réellement cela, c'est juste une interprétation (courante) de celle-ci. Emacs prend également en charge la variante sans retour à la ligne, comme pep-257-nndans python-fill-docstring-style.
lunaryorn
1
Ironiquement, la raison du lien vide est la suivante: à moins que toute la docstring ne tienne sur une ligne, placez les guillemets de clôture sur une ligne par eux-mêmes. De cette façon, la commande fill-paragraph d'Emacs peut être utilisée dessus.
Felipe