はじめに
vim scriptでpythonが使えるという
街の噂を聞いたので、
急にvim プラグインを作りたくなりました。
そこでvimプラグインの作り方を調べてみたので、
まとめておきます。
vimプラグインのひな形を作る
vimプラグインには、
ディレクトリ構成やファイルの配置が
ある程度に決まっているので
自分は下記のvimプラグインのひな形を作るための
vimプラグインを使うことにしました。
使い方は(Neobundleを使っている場合)、
vimrcに
NeoBundleLazy 'mopp/layoutplugin.vim', { 'autoload' : { 'commands' : 'LayoutPlugin'} }
と書いて、
:NeoBundleInstall
して、vim上で
:LayoutPlugin sample.vim
とすると、sample.vimというプラグインディレクトリができます。
あとはGithubなどにリポジトリを作って、
このディレクトリをコミット&pushするようにすれば
誰でも使えるようになります。
そして、そのプラグインを使いたい場合はvimrcで
NeoBundle 'AtsushiSakai/sample.vim'
のようにユーザ名とプラグイン名を指定して、
NeoBunbleInstallすれば、
自作のvimプラグインが/bundle/pluginの下に
インストールされます。
autoloadとpluginフォルダ
先ほど作成したvim pluginのフォルダには、
README以外に、autoloadとpluginフォルダがあると思います。
どちらもvimスクリプトを入れる場所なのですが、
使用する用途が違います。
まず、pluginフォルダは
毎回vimが立ち上がる時に読み込まれるvimスクリプトを入れます。
しかし、このpluginフォルダスクリプトの数が多かったり、
処理が重かったりすると、
vimを立ち上げるのに時間がかかってしまいます。
そこで使用されるのがautoloadフォルダです。
この中のフォルダのvimscriptは、
そのvimscript内で定義されたメソッドが呼ばれた時に、
初めてロードされるようになります。
(使う時にしか処理されないようになる)
ですので、これらのフォルダの使い分けとしては、
- pluginフォルダ
commandの設定など、そのプラグインを呼ぶための
必要最小限の処理を記述するスクリプトを置く
- autoloadフォルダ
プラグインのメインの処理を書いたスクリプトを置く
といった感じです。
詳しいことは下記の資料が参考になります。
vim pluginのお約束
先ほどのLayoutPluginで生成される
.vimファイルを見ると、
.vimファイルのvim pluginでのお約束を勉強することができます。
"============================================================================= " File: bookmarklet.vim " Author: AtsushiSakai " Created: 2015-07-24 "============================================================================= scriptencoding utf-8 if exists('g:loaded_bookmarklet') finish endif let g:loaded_bookmarklet = 1 let s:save_cpo = &cpo set cpo&vim " vim script let &cpo = s:save_cpo unlet s:save_cpo
まず、最初の行は文字のエンコーディングです。
続いて、loaded_というグローバル変数をチェックする所は、
プラグインのロードを管理するグローバル変数を使って、
すでにロードしていたら、下記のコードは実行しないようにしています。
最後に、save_cpoという部分は
下記の記事のように、
ユーザの設定を一時的に無効化するおまじないです。
これをすることで、ユーザの設定に影響されずに
vim pluginを動作できるようにしているようです。
ですので、プラグインの処理コードは
"vim scriptというコメントを
書いた所に書く必要があります。
注意点
個人的にハマったところなど
vimのコマンドにアンダーバー(_)は使えない かつ 先頭は大文字
プラグイン名に.vimと付けた場合は、それより前の名前をautoloadの#の前につける
参考資料
【Vim Advent Calendar 2012】Vim プラグインを github で公開するまで【1日目】 - C++でゲームプログラミング
MyEnigma Supporters
もしこの記事が参考になり、
ブログをサポートしたいと思われた方は、
こちらからよろしくお願いします。