J'utilise le package appelé yasnippet pour quelque chose de similaire à cela. Après quelques modifications mineures, je l'ai adapté pour utiliser le style de docstring Google à la place:
Notez cependant qu'il nécessite une configuration:
L'extrait lui-même doit exécuter du code elisp utilitaire pour générer le texte. Cela est généralement résolu en créant un fichier appelé .yas-setup.el
avec le code dans le python-mode
répertoire d'extraits de code . Il est cependant également possible de placer le code quelque part à l'intérieur de votre .emacs
.
Le code de l'extrait est:
# -*- mode: snippet -*-
# Insert Google style docstring and function definition.
# name: Python Google style Docstring
# key: defg
# type: snippet
# contributor: Xaldew
# --
def ${1:name}($2):
\"\"\"$3
${2:$(python-args-to-google-docstring yas-text t)}
${5:Returns:
$6
}
\"\"\"
${0:$$(let ((beg yas-snippet-beg)
(end yas-snippet-end))
(yas-expand-snippet
(buffer-substring-no-properties beg end) beg end
(quote ((yas-indent-line nil) (yas-wrap-around-region nil))))
(delete-trailing-whitespace beg (- end 1)))}
Le code pour le .yas-setup.el
est:
(defun python-args-to-google-docstring (text &optional make-fields)
"Return a reST docstring format for the python arguments in yas-text."
(let* ((indent (concat "\n" (make-string (current-column) 32)))
(args (python-split-args text))
(nr 0)
(formatted-args
(mapconcat
(lambda (x)
(concat " " (nth 0 x)
(if make-fields (format " ${%d:arg%d}" (cl-incf nr) nr))
(if (nth 1 x) (concat " \(default " (nth 1 x) "\)"))))
args
indent)))
(unless (string= formatted-args "")
(concat
(mapconcat 'identity
(list "" "Args:" formatted-args)
indent)
"\n"))))
Notez que cela python-split-args
est fourni par les extraits standard . C'est-à-dire:
https://github.com/AndreaCrotti/yasnippet-snippets/tree/master Vous les obtenez cependant par défaut lorsque vous installez le package package.el
.
Avec tout configuré correctement, vous devriez pouvoir écrire "defg" suivi Tabde développer l'extrait de code (voir l'image pour un exemple).
Il y a toujours un problème avec l'utilisation de cette indentation imbriquée, par exemple, dans des classes ou en tant que fonctions imbriquées. Dans ces cas, la docstring est indentée par erreur un temps supplémentaire pour une raison quelconque. Je mettrai à jour ce message si je parviens à résoudre ce problème.
L'extrait devrait maintenant fonctionner dans d'autres étendues en interdisant l' yasnippet
auto-indentation de la deuxième extension.