これに似たものには、yasnippetというパッケージを使用します。いくつかのマイナーな変更の後、代わりにGoogleのdocstringスタイルを使用するように変更しました。
ただし、いくつかの設定が必要です。
スニペット自体は、テキストを生成するためにいくつかのユーティリティelispコードを実行する必要があります。これは通常.yas-setup.el
、python-mode
スニペットディレクトリ内のコードで呼び出されるファイルを作成することで解決します。ただし、.emacs
代わりにコードを自分の内部のどこかに配置することもできます。
スニペットのコードは次のとおりです。
# -*- 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)))}
のコード.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"))))
標準のスニペットpython-split-args
によって提供されることに注意してください。すなわち:https :
//github.com/AndreaCrotti/yasnippet-snippets/tree/masterただし、を介してパッケージをインストールすると、デフォルトでこれらが取得されます。package.el
すべてが適切に設定されていれば、 "defg"に続けTabてスニペットを展開できます(例については画像を参照してください)。
これをネストされたインデントの内側、たとえばクラス内またはネストされた関数として使用することにはまだ問題があります。これらの場合、何らかの理由でdocstringが誤って余分にインデントされます。なんとか修正できたら、この投稿を更新します。
yasnippet
2番目の展開の自動インデントを禁止することで、スニペットが他のスコープ内で機能するようになりました。