83 myvba.vim (7-1) Vimballを開発者にとって使いやすいものにする
Vimballはユーザにとっては割と使いやすいんだけど、開発者にはどうかなあと思う。なぜって、パッケージの作成がしにくいから。
ユーザなら*.vbaを開いて :so % でインストール、:RmVimball *.vba でアンインストール。これだけなので、割と使いやすいと思う。分かりにくいところもないし、これだけで~/vimfiles(~/.vim)に配置してくれるんだから、それなりに便利だと思う。
ただ、開発者側から見ればあまり良いとは思えない。~/vimfiles(~/.vim)からパッケージに入れたいファイルを改行区切りでバッファに表示しておいて、コマンド実行なんて、Subversionでディレクトリ切ってる場合は面倒すぎる。グローバル変数vimball_homeを使ったオプションもあるけど、いちいち設定するのもなんだかなあという感じ。
というわけで、ざっくり自分用にVimballのための関数を定義してみた。
はじめはコマンドを定義してたんだけど、コマンドに(パッケージするファイルの)リストを与えるいい方法が思い浮かばなかった*1ので、autoloadを使った関数にした。
たぶん居ないと思いますが、使いたい場合は~/vimfiles/autoloadに配置して、関数を呼び出してください。ついでにhowm-mode.vimの場合を一例としてはっておきます。
" myvba.vim ( Vimball をなんとかしてくれるはずのプラグイン ) " " お約束: " このプラグインを使ってなにか起きても知りませんし、責任とりません。 " " 概要: " vimball.vimが'runtimepath'からしか探さないので、g:vimball_homeを活用して、 " それをなんとかするプラグイン " " きっかけ: " Subversion使ってると、開発中のプラグインを~/.vim/の中に放りこんどくのは、 " めんどくせえってなる。かといって、runtimepathに色々追加しても、途中でマッ " チしちゃうと、そっちのファイルを配布なんてしちゃったら困る。 " " 動作: " g:vimball_homeを一時的に変更してから、:MkVimballなんかを呼んじゃう。 " " 対象者: " 自分と、どうみてもゴミとしか思えないスクリプトを必死こいて読んでる暇な方 " scriptencoding utf-8 " install function! myvba#inst(home, file) let save_exists = exists('g:vimball_home') let save_vba_home = (save_exists ? g:vimball_home : '') let g:vimball_home = a:home execute 'new' a:file so % close let g:vimball_home = save_vba_home if !save_exists unlet! g:vimball_home endif endfunction " remove function! myvba#uninst(home, file) let save_exists = exists('g:vimball_home') let save_vba_home = (save_exists ? g:vimball_home : '') let g:vimball_home = a:home execute ':RmVimball' a:file let g:vimball_home = save_vba_home if !save_exists unlet! g:vimball_home endif endfunction " make function! myvba#make(home, file, files) let save_exists = exists('g:vimball_home') let save_vba_home = (save_exists ? g:vimball_home : '') let g:vimball_home = a:home execute 'new' 'myvba' setlocal modifiable call append(0, a:files) normal dd execute ':%MkVimball!' a:file close! let g:vimball_home = save_vba_home if !save_exists unlet! g:vimball_home endif endfunction " NOTE:コマンドにリストをうまく渡せないため削除 " command! -nargs=+ MyVbaInst :call <SID>usvba(<args>) " command! -nargs=+ MyVbaUnInst :call <SID>rmvba(<args>) " command! -nargs=+ MyVbaMake :call <SID>mkvba(<args>) " vim:set et ts=2 sw=2 sts=2:
それぞれのパッケージごとに作成するファイルの一例
function! s:myvba(mode) " パッケージファイル名 let vba_file = 'howm-mode.vba' " パッケージインストール(アンインストール)用ディレクトリ let vba_dst = 'c:/documents/vimfiles/' " パッケージ作成用(開発用)ディレクトリ let vba_src = 'c:/documents/howm_vim/' " パッケージに含むファイルたち let files = [ \ 'plugin/howm-grep.vim', \ 'plugin/howm-date.vim', \ 'plugin/howm-mode.vim', \ 'plugin/howm-pattern.vim', \ 'plugin/howm-search.vim', \ 'syntax/howm_importantdate.vim', \ 'syntax/howm_memo.vim' \ ] if a:mode == 'inst' call myvba#inst(vba_dst, vba_file) elseif a:mode == 'uninst' call myvba#uninst(vba_dst, vba_file) elseif a:mode == 'make' call myvba#make(vba_src, vba_file, files) endif endfunction command! HowmVbaMake :call <SID>myvba('make') command! HowmVbaInst :call <SID>myvba('inst') command! HowmVbaUninst :call <SID>myvba('uninst') " vim:set et ts=2 sw=2 sts=2: