Vim Pluginに入門してみた #vim
この記事はVim2 Advent Calendar 2019の19日目の記事です。
Vim Pluginを書こう書こうと思ってずっとできていなかったのでAdvent Calendarをきっかけにhello, world的なPluginを書いてみた。
:Hello foobar
と打つと hello, foobar
と返してくれるだけのPluginです。
今回はこのPluginを書くときにわからなくて調べた部分をご紹介します。
Plugin名
特に決まりは無くてvim-foobar、foobar-vim、foobar.vimの3つの流派が居るっぽい。
自分はvim-go、vim-lspを参考にvim-helloと名付けた。
Vim Pluginの開発ディレクトリは決まっている
Vim起動時に読み込まれるディレクトリが決まっている。
そのディレクトリは何個かあるが、ユーザが一番使いやすそうなのは ~/.vim/pack/*/start/
です。
*
は1つのディレクトリ。
(複数ディレクトリあると読み込まれないので注意。)
自分は ~/.vim/pack/plugins/start/vim-hello
に置いた。
ディレクトリ構成
plugin
と autoload
というディレクトリが必要。
├── autoload │ └── hello.vim └── plugin └── hello.vim
plugin
配下にあるファイルはVim起動時に読み込まれるファイル。
autoload
配下にあるファイルは必要になった時に読み込まれる。
コマンド定義は plugin
で関数は autoload
というように覚えておけば良さそう。
-nargs
で引数ありコマンドを定義
コマンドの引数を取得したい場合 -nargs
を使って引数を何個取るのか設定できます。
-nargs=0 引数なし -nargs=1 引数 1 個 -nargs=* いくつでも -nargs=? 引数なし、もしくは 1 個 -nargs=+ 引数 1 個以上
自分は引数1個以上取りたかったのでこんな感じで書きました。
command! -nargs=+ Hello call hello#hello(<q-args>)
また、<q-args>
は特殊文字が入っていても適切にエスケープしてくれる引数指定です。
クオートの例が紹介されていて、クオートを適切に表示するなら <q-args>
の方が良さそうだったので使用しています。
関数の引数は a:
でアクセス
Vim Scriptではよく g:
や l:
がついた変数を見ます。
これはスコープを指していて g:
ならグローバル、l:
ならローカルといった具合です。
しかし、引数はちょっと特殊で a:
を使います。
a:
をつけないで引数にアクセスしようとすると「未定義の変数です」と言われてしまうので注意。
まとめ
というわけで駆け足でしたが自分がhello, world的なPluginを書いた時に調べた箇所をご紹介しました。
一度hello, world的なPluginを作ってしまえばそこを足がかりに色々試したりできそうです。
そして試したことを切り出して新たにPluginを作っていけたらいいな。