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:

*1:今開いているバッファから取り込むなんて、応急処置かなにかかなって思う。それがVimの標準パッケージの作成方法なんて狂ってる!