Tôi sử dụng gói được gọi là yasnippet cho một cái gì đó tương tự như thế này. Sau một số thay đổi nhỏ, tôi đã điều chỉnh nó để sử dụng kiểu tài liệu Google thay thế:
Tuy nhiên, lưu ý rằng nó yêu cầu một số thiết lập:
Đoạn mã cần thực thi một số mã elisp tiện ích để tạo văn bản. Điều này thường được giải quyết bằng cách tạo một tệp được gọi .yas-setup.el
với mã bên trong python-mode
thư mục đoạn trích. Tuy nhiên, cũng có thể đặt mã ở đâu đó bên trong của bạn .emacs
.
Mã cho đoạn mã là:
# -*- 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)))}
Mã cho .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"))))
Lưu ý rằng python-split-args
được cung cấp bởi các đoạn tiêu chuẩn . Tức là:
https://github.com/AndreaCrotti/yasnippet-snippets/tree/master Tuy nhiên, bạn nhận được những thứ đó theo mặc định khi bạn cài đặt gói thông qua package.el
.
Với mọi thứ được thiết lập đúng, bạn sẽ có thể viết "defg" theo sau Tabđể mở rộng đoạn trích (Xem hình ảnh để biết ví dụ).
Vẫn còn một vấn đề với việc sử dụng điều này bên trong thụt lề lồng nhau, ví dụ, trong các lớp hoặc như các hàm lồng nhau. Trong những trường hợp đó, chuỗi doc bị sai lệch thụt vào một thời gian thêm vì một số lý do. Tôi sẽ cập nhật bài viết này nếu tôi quản lý để sửa nó.
Đoạn mã bây giờ sẽ hoạt động bên trong các phạm vi khác bằng cách cấm yasnippet
tự động thụt vào bản mở rộng thứ hai.