docstring を挿入するプラグインを作った
Vim を使って PHP スクリプトを作成しているときに phpdoc.vim というプラグインがもの凄く重宝してた。
何をするものかというと、例えば以下のようなコードがあったとする。
<?php class Foo { pubilic function __construct($arg1, $arg2) { } }
class や function の行にカーソルがある場合に
:call PhpDocSingle()
と実行すると
<?php class ClassName { /** * __construct * * @param mixed $arg1 * @param mixed $arg2 * @access public * @return void */ public function __construct($arg1, $arg2) { } }
といった感じでヘッダーコメントが挿入される。
この機能が地味に便利で、Python なコードを書いている時も自動で docstring が挿入して欲しい。
少し探してみたが無かったので、自分で作ってみた(Vim Script を一から書いたのは初めて)。
https://github.com/heavenshell/vim-pydocstring
# -*- coding: utf-8 -*- def foo(arg): pass
これで :Pydocstring を呼ぶと
def foo(arg): """foo :param arg: """ pass
というのが挿入される。
引数が無い場合は
def foo(): """foo""" pass
ワンラインの docstring となる。
\ によって改行が入ってる場合は
def foo(arg1, \ arg2): """foo :param arg1: :param arg2: """ pass
となる。
差し込む docstring はテンプレートファイルになっているので、デフォルトのが気に入らなければ書き換える事ができる。
またテンプレートファイルの場所は
let g:pydocstring_templates_dir = '/path/to/temlate/'
といったようにテンプレートディレクトリを指定できる。
デフォルトでは ~/.vim/template/pydocstring/ としている。
# pathogen とかを使っていると、~/.vim/bundle/vim-pydocstring/template/pydocstring/
テンプレート内で使用できる変数は {{_header_}} と {{_args_}} の二つだけ。
{{_header_}} はクラス名|関数名|メソッド名で、{{_args_}} は引数が全て挿入される。
Python のメソッドやクラスメソッドは引数の一つめを self や cls といったキーワードを設定する。
そのため docstring には表示しないようにデフォルトではなっている。
let g:pydocstring_ignore_args_pattern = 'self\|cls'
cls は docstring として表示したい場合は self といったように Vim 正規表現を設定する。
キーマップはデフォルトで
nmap <silent> <C-l> <Plug>(pydocstring)
と設定している。
class や def の上で
class や def が無い所で
let g:pydocstring_enable_comment = 0
とする事でコメントを挿入しないようになる。
Vim Script を初めて書いていて、こういう書き方でいいのかなと悩みながら書いたので正直全く自信がない。
書いている途中で分からない事を呟いてたら、[twitter:@kaoriya] さんや [twitter:@mattn_jp] さんにアドバイス頂きました。
ありがとうございます!