dumper.vim 改め prettyprint.vim 作った。

2009/06/26 追記: id:ka-nacht さんのアドバイスを受けて名称を変更しました。変えるなら早いうちに、と言うことで。


普通の人はまず必要ないだろう prettyprint.vim と言うプラグインを作った。

http://github.com/thinca/vim-prettyprint/tree/master

prettyprint.vim とは

Vim の変数を整形して出力するためのプラグインです。

見た方が早い

例えば QuickRun.vim をインストールしているときに*1

PP g:QuickRunConfig

などとすると、

{
  '*': {
    'exec': '%c %s %a',
    'output_encode': '&fenc:&enc',
    'shebang': 1,
    'split': '{winwidth(0) * 2 < winheight(0) * 5 ? "" : "vertical"}',
    'tempfile': '{tempname()}'
  },
  'awk': {'exec': '%c -f %s %a'},
  'bash': {},
  'c': {
    'command': 'gcc',
    'exec': ['%c %s -o %s:p:r', '%s:p:r %a', 'rm -f %s:p:r'],
    'tempfile': '{tempname()}.c'
  },
  'cpp': {
    'command': 'g++',
    'exec': ['%c %s -o %s:p:r', '%s:p:r %a', 'rm -f %s:p:r'],
    'tempfile': '{tempname()}.cpp'
  },
  'dosbatch':
    {'command': '', 'exec': 'call %s %a', 'tempfile': '{tempname()}.bat'},
  'eruby': {'command': 'erb', 'exec': '%c -T - %s %a'},
  'groovy': {'exec': '%c -c {&fenc==""?&enc:&fenc} %s %a'},
  'haskell': {'command': 'runghc', 'tempfile': '{tempname()}.hs'},
  'io': {},
  'java': {'exec': ['javac %s', '%c %s:t:r', ':call delete("%S:t:r.class")']},
  'javascript': {'command': 'js', 'tempfile': '{tempname()}.js'},
  'lua': {},
  'ocaml': {},
  'perl': {
    'eval':
      'print eval{use Data::Dumper;$Data::Dumper::Terse = 1;$Data::Dumper::Indent = 0;Dumper %s}'
  },
  'php': {},
  'python': {'eval': 'print(%s)'},
  'r': {'command': 'R', 'exec': '%c --no-save --slave %a < %s'},
  'ruby': {'eval': ' p proc {^@%s^@}.call'},
  'scala': {},
  'scheme': {
    'command': 'gosh',
    'eval': '(display (begin %s))',
    'exec': '%c %s:p %a'
  },
  'sed': {},
  'sh': {},
  'vim': {'command': ':source', 'exec': '%c %s'},
  'zsh': {}
}

こんな感じで出力してくれる(g:prettyprint_width = 78 g:prettyprint_indent = 2の場合)。:PP コマンドの他 PP() 関数もあるので、

:put =PP(g:QuickRunConfig)

とすればバッファに出力することもできる。
'verbose' を使えば辞書関数の中身も見れる。

let d = {}
function! d.func()
  echo 'hello!'
endfunction
verbose PP d
{
  'func': 
   function 225()
1    echo 'hello!'
   endfunction
}

あ、1 は行番号ね。念の為。
ちなみに :PP PP() は省略形で、:PrettyPrint PrettyPrint() もある、けど、まあ多分使わないね。機能は全く同じです。

何に使うのか

プラグインを作るとき、やたらとコンテナを使って辞書関数まで使ったりしてるとデバッグが大変だったので。元々 vimrc に書いてた奴を分離して体裁を整えたのがこれ。
これで関数呼び出しのバックトレースが 66..67..65 とかなって何言ってんのお前ってなってもある程度対処できるはず。

プラグインの作成スタイルを変えればいい?それは言わない約束。

*1:単に大きめの辞書変数が欲しかっただけ