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を作っていけたらいいな。