while ("im the true Vim master");

2008-07-03

id:ujihisa作quickrunの修正、あるいはVim scriptを書くときのノウハウ集

15:15

予告通り、pull requestを送りました。なんかもー根本的にアレだったのであまり原型を留めていませんが。どの辺がアレだったというと:

  • 内容的にglobal pluginにすべきなのにfiletype pluginとしていた。これでは該当する'filetype'のバッファが作成される度に:autocmdが無意味に増殖してしまう。
    • →:augroupで括る。
    • →:augroup内の冒頭でリセットもしておく(開発中にリロードし易くするため)。
  • 黙って<Leader>rを:nnoremapしていた。
    • →:silent nmap <unique> <Leader>r ...として既存mapを上書きしない。
    • →:nnoremap <Plug>(quickrun) ...というインターフェースとなるmapを用意しておいて、ユーザーにはそれを:nmapさせる。他のプラグインでよく見受けられるg:quickrun_open_keyのような変数によるキーの指定はダサい。
  • 全体をif !exists('b:did_quickrun')〜endifで括ってロード済みのチェックとスキップを行っていた。
    • →普通、冒頭でif exists('g:loaded_quickrun') | finish | endifとする。:finishを使わないと全体的に一段階余分にインデントされて見難い。
    • →global pluginのロード済み云々のマーカー用変数はg:loaded_{plugin-name}とするのが慣習。
  • :writeしてた。
    • →スクリプトで自動的に保存する場合は:updateを使う方が良い。
  • 別ファイルへの保存に:call writefile()を使っていた。
    • →特殊な要件でもない限り、このケースでは:write another-filenameで十分。
  • ファイルの削除に:call system('rm file')を使っていた。
    • →:call delete('file')
  • 外部コマンドの実行結果の取り込みをsystem()とappend()で行っていた。
    • →:read !{command}
  • コマンドの実行結果を表示するバッファ(以下result buffer)の作成方法がダサい。
    • →説明するの面倒だからコードを見てください。
  • result bufferのオプション設定に本質的でないものが混ざっていた。
    • →そういうのは:autocmd経由でユーザー側にやらせる。:setfiletype {foo}が使えるなら:autocmd FileType {foo}でやらせればいい。使えない場合は:autocmd User plugin-quickrun-initialize-result-buffer等でやらせればいい(サンプル: scratch - Emacs like scratch buffer : vim online)。
トラックバック - http://vim.g.hatena.ne.jp/ka-nacht/20080703
最近のコメント
あわせて読みたいブログパーツ
AX