かなりすごいブログ

VimShellが動的プロンプトに対応しました(やばい)

VimAdventCalendar 2012 228日目

VimAdventCalendar 2012 228日目の記事になります。昨日227日目は@manga_osyoさんの「Vim script でもラムダを使いたい!」でした。

VimShellが動的プロンプトに対応しました

結構要望が多かったと思われます、動的プロンプト。これがついに実装されました。 動的プロンプトとは状況によって内容が変わるプロンプトのことで、例えば現在のディレクトリを表示させたり、現在のユーザー名を表示させたり、といった用途が一般的です。

これまでプロンプトの位置特定などの事情から動的プロンプトはサポートされず、代わりにユーザープロンプトや右プロンプトといった手段が用意され、それらのプロンプトは動的に内容を変更できるようになっていました。しかし、この場合プロンプト全体がどうしても複数行になってしまうため、やはり単一行での動的プロンプトサポートの要望は多かった様です。

そして数日前、VimShellがついに動的プロンプトに対応しました。便利でやばいです。今回の記事では、VimShellの動的プロンプトの設定方法やサンプルをご紹介します。

動的プロンプトを有効にする方法

g:vimshell_prompt_expr及びg:vimshell_prompt_patternというグローバル変数を設定することで、動的プロンプトが自動で有効になります。

g:vimshell_prompt_exprには、プロンプトに表示する文字列を返す式を文字列で指定します。VimShell側が適切なタイミングで適時eval(評価)するため、文字列での指定となっています。

g:vimshell_prompt_patternには、g:vimshell_prompt_exprをevalした結果返される文字列を、正規表現パターンで指定します。こうすることで、VimShellがプロンプトである行とそうでない行を見分けられるようになります。

この方式は、私がEmacsで愛用しているeshellと同じですね。ちなみにeshellはzshの様な動的右プロンプト(プロンプトと同じ行の右端に表示される動的なプロンプト)に対応しておらず、これはVimShellも同様です。これの実装は恐らくeshellなら頑張れば可能かと思われますが、Vimではかなり困難を極めそうです。動的右プロンプトが使いたい方は、単一行プロンプトはおとなしく諦めましょう。

設定サンプル

というわけで、現在のディレクトリを表示する設定サンプルを置いておきますね。

let g:vimshell_prompt_expr = 'getcwd()." > "'
let g:vimshell_prompt_pattern = '^\f\+ > '

vimshell-dynamicprompt-1

設定サンプル2

くるくるさせる設定サンプルを置いておきますね。

let g:my_vimshell_prompt_counter = -1
function! g:my_vimshell_dynamic_prompt()
  let g:my_vimshell_prompt_counter += 1
  let anim = [
        \        "(´・_・`)",
        \        "( ´・_・)",
        \        "(  ´・_)",
        \        "(   ´・)",
        \        "(    ´)",
        \        "(     )",
        \        "(     )",
        \        "(`    )",
        \        "(・`   )",
        \        "(_・`  )",
        \        "(・_・` )",
        \    ]
  return anim[g:my_vimshell_prompt_counter % len(anim)]
endfunction
let g:vimshell_prompt_expr = 'g:my_vimshell_dynamic_prompt()." > "'
let g:vimshell_prompt_pattern = '^([ ´・_・`]\{5}) > '

べんりすぎる…

元ネタ:unite.vim でアニメーション

VimAdventCalendar 2012 229日目は

明日229日目の担当は@manga_osyoさんです。 あれ、昨日もおしょーさんだったような…

Lingr

oh…