Eu uso o pacote chamado yasnippet para algo semelhante a isso. Após algumas pequenas alterações, eu o adaptei para usar o estilo de documentação do Google:
Observe, no entanto, que isso requer alguma configuração:
O trecho em si precisa executar algum código elisp do utilitário para gerar o texto. Isso geralmente é resolvido com a criação de um arquivo chamado .yas-setup.el
com o código dentro do python-mode
diretório do snippet. No entanto, também é possível colocar o código em algum lugar dentro do seu .emacs
.
O código para o snippet é:
# -*- 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)))}
O código para .yas-setup.el
é:
(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"))))
Observe que python-split-args
é fornecido pelos trechos padrão . Ou seja:
https://github.com/AndreaCrotti/yasnippet-snippets/tree/master No entanto, você os obtém por padrão ao instalar o pacote package.el
.
Com tudo configurado corretamente, você poderá escrever "defg" seguido de Tabpara expandir o trecho (veja a imagem para obter um exemplo).
Ainda existe um problema ao usar esse recuo aninhado interno, por exemplo, dentro de classes ou como funções aninhadas. Nesses casos, a doutrina é recuada erroneamente por um tempo extra por algum motivo. Vou atualizar este post se conseguir consertar isso.
Agora, o trecho de código deve funcionar em outros escopos, proibindo yasnippet
o recuo automático da segunda expansão.