Saya menggunakan paket yang disebut yasnippet untuk sesuatu yang mirip dengan ini. Setelah beberapa perubahan kecil saya mengadaptasinya untuk menggunakan gaya Google docstring sebagai gantinya:
Namun perlu dicatat bahwa ini memerlukan beberapa pengaturan:
Cuplikan itu sendiri perlu menjalankan beberapa kode elisp utilitas untuk menghasilkan teks. Ini biasanya diselesaikan dengan membuat file yang disebut .yas-setup.el
dengan kode di dalam python-mode
direktori snippet. Namun dimungkinkan juga untuk menempatkan kode di suatu tempat di dalam Anda .emacs
sebagai gantinya.
Kode untuk cuplikan adalah:
# -*- 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)))}
Kode untuk .yas-setup.el
is:
(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"))))
Catatan yang python-split-args
disediakan oleh cuplikan standar . Yaitu:
https://github.com/AndreaCrotti/yasnippet-snippets/tree/master Namun Anda mendapatkannya secara default saat Anda menginstal paket melalui package.el
.
Dengan pengaturan semuanya dengan benar, Anda harus dapat menulis "defg" diikuti oleh Tabuntuk memperluas cuplikan (Lihat gambar sebagai contoh).
Masih ada masalah dengan menggunakan indentasi bersarang di dalam ini, misalnya, di dalam kelas atau sebagai fungsi bersarang. Dalam kasus-kasus itu, docstring secara keliru diberi indentasi waktu tambahan untuk beberapa alasan. Saya akan memperbarui posting ini jika saya berhasil memperbaikinya.
Cuplikan sekarang harus bekerja di dalam lingkup lain dengan melarang yasnippet
dari indentasi ekspansi kedua.