Ich benutze das Paket namens yasnippet für etwas Ähnliches. Nach einigen geringfügigen Änderungen habe ich es angepasst, um stattdessen den Google Docstring-Stil zu verwenden:
Beachten Sie jedoch, dass einige Einstellungen erforderlich sind:
Das Snippet selbst muss einen Dienstprogramm-Elisp-Code ausführen, um den Text zu generieren. Dies wird normalerweise gelöst, indem eine Datei .yas-setup.el
mit dem Code im python-mode
Snippet-Verzeichnis erstellt wird. Es ist jedoch auch möglich, den Code .emacs
stattdessen irgendwo in Ihrem zu platzieren.
Der Code für das Snippet lautet:
# -*- 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)))}
Der Code für .yas-setup.el
lautet:
(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"))))
Beachten Sie, dass python-split-args
dies durch die Standard- Snippets bereitgestellt wird . Dh:
https://github.com/AndreaCrotti/yasnippet-snippets/tree/master Diese erhalten Sie jedoch standardmäßig, wenn Sie das Paket über installieren package.el
.
Wenn alles richtig eingerichtet ist, sollten Sie in der Lage sein, "defg" zu schreiben und anschließend Tabdas Snippet zu erweitern (ein Beispiel finden Sie im Bild).
Es gibt immer noch ein Problem bei der Verwendung dieser in verschachtelten Einrückungen, z. B. innerhalb von Klassen oder als verschachtelte Funktionen. In diesen Fällen wird die Dokumentzeichenfolge aus irgendeinem Grund fälschlicherweise um eine zusätzliche Zeit eingerückt. Ich werde diesen Beitrag aktualisieren, wenn ich das behebe.
Das Snippet sollte jetzt in anderen Bereichen funktionieren, indem verhindert wird, dass yasnippet
die zweite Erweiterung automatisch eingerückt wird.