Yo uso el paquete llamado yasnippet para algo similar a esto. Después de algunos cambios menores, lo adapté para usar el estilo de Google Docstring:
Sin embargo, tenga en cuenta que requiere cierta configuración:
El fragmento en sí necesita ejecutar algún código de utilidad elisp para generar el texto. Esto generalmente se resuelve creando un archivo llamado .yas-setup.el
con el código dentro del python-mode
directorio de fragmentos. Sin embargo, también es posible colocar el código en algún lugar dentro de su .emacs
lugar.
El código para el fragmento es:
# -*- 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)))}
El código para el .yas-setup.el
es:
(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"))))
Tenga en cuenta que python-split-args
lo proporcionan los fragmentos estándar . Es decir:
https://github.com/AndreaCrotti/yasnippet-snippets/tree/master Sin embargo, los obtiene de forma predeterminada cuando instala el paquete package.el
.
Con todo configurado correctamente, debería poder escribir "defg" seguido de Tabexpandir el fragmento (vea la imagen para ver un ejemplo).
Todavía hay un problema con el uso de esta sangría anidada, por ejemplo, dentro de clases o como funciones anidadas. En esos casos, la cadena de documentos se sangra erróneamente un tiempo extra por alguna razón. Actualizaré esta publicación si logro arreglar eso.
El fragmento ahora debería funcionar dentro de otros ámbitos al prohibir yasnippet
la sangría automática de la segunda expansión.