Technology Engineering

178inaba の技術ブログ

Vim Pluginに入門してみた #vim

この記事はVim2 Advent Calendar 2019の19日目の記事です。

Vim Pluginを書こう書こうと思ってずっとできていなかったのでAdvent Calendarをきっかけにhello, world的なPluginを書いてみた。

github.com

: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 に置いた。

ディレクトリ構成

今度はVim Plugin内のディレクトリ構成。

pluginautoload というディレクトリが必要。

├── 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: ならローカルといった具合です。

thinca.hatenablog.com

しかし、引数はちょっと特殊で a: を使います。
a: をつけないで引数にアクセスしようとすると「未定義の変数です」と言われてしまうので注意。

vim-jp.org

まとめ

というわけで駆け足でしたが自分がhello, world的なPluginを書いた時に調べた箇所をご紹介しました。
一度hello, world的なPluginを作ってしまえばそこを足がかりに色々試したりできそうです。
そして試したことを切り出して新たにPluginを作っていけたらいいな。