読者です 読者をやめる 読者になる 読者になる

vim pluginを作ってみる

vim scriptの勉強で以下のページを見ていたところ、plugin化のチュートリアルにちょうど良さそうなスクリプトを見つけたのでやってみた。plugin化の手順をメモ。
Vim エディターのスクリプトの作成: 第 5 回 イベント駆動型のスクリプト作成と自動化

plugin化した機能は存在しないディレクトリにファイルを書き込もうとした際にmkdirしてくれるというもの。詳細は↑のページで。
以下に書いたコードはほとんど上記ページからの引用。

1. .vimrcに書いて動作確認
まずは.vimrc上にすべてのコードを書いて思った通り動くか確認する。

augroup automakedir
    autocmd!
    autocmd BufWritePre * :call s:automkdir()
augroup END
function! s:automkdir()
    let dir = expand("%:h")
    if (!isdirectory(dir))
        call s:askQuit("Directory " . dir . " does not exist.", "&Create?")
        try
            call mkdir(dir, 'p')
        catch
            call s:askQuit("Failed to mkdir: " . dir, "&Edit anyway?")
        endtry
    endif
endfunction
function! s:askQuit(msg, action)
    if (confirm(a:msg, "&Quit?\n" . a:action) == 1)
        exit
    endif
endfunction


2. pluginとして分離
.vim/plugin/に上記のコードを移し、plugin用の定形処理を書く。
定形処理は以下の2つ。:h write-pluginに書いてある通り。
a. 複数回読み込まれるのを防ぐ処理

if exists("g:loaded_automkdir")
  finish
endif
let g:loaded_automkdir = 1

b. 改行して書けるようにするための設定変更

let s:save_cpo = &cpo
set cpo&vim
"ここにコード本体
let &cpo = s:save_cpo
unlet s:save_cpo


3. autoloadを使うよう変更
githubに上げたいのでそれ用のディレクトリを用意しplugin, autoloadディレクトリを作る。こんな構成
automkdir.vim/plugin/automkdir.vim
automkdir.vim/autoload/automkdir.vim

autoloadを適用するため、plugin/automkdir.vimから呼ぶ関数の名前をfilename#functionnameの形に変更する。
コード全体はこちらで。
plugin of automkdir · y-kamiya/automkdir.vim@76172ab · GitHub


4. neobundleでinstall
他のpluginと同じように.vimrcに設定を書いてNeoBundleInstallでOK

参考

細かい部分についてはhelpを見るのが最も確実でわかりやすい。vimはhelpが充実していて助かる。