空いてたので割り込み。
君は Tapi を知っているか
Vim に :terminal
機能が実装されている事は全国1億5千万人が知っている事実なのですが、:terminal
の Tapi (Terminal API)機能をご存じの方はそのうち300人くらいしかいません。今日はその Tapi 機能について説明します。
Tapi 機能とは
:terminal
は仮想 pty を用意してコマンドを実行する物で、コマンドを実行した後は :terminal
が自発的に画面を更新します。Vim からはキーボードの操作がそのコマンドに対して渡されます。一見これだけで便利そうなのですが、:terminal
を使っているユーザはよくこう思います。いや、必ずこう思います。
この :terminal で起動したシェルの中から親の Vim に対してファイルを開かせたいよなぁ
ね、思いましたよね。
これを実現するのが Tapi 機能です。
Tapi の仕組み
Tapi は Vim と :terminal
との間でやりとりされるエスケープシーケンスです。詳しくは :help terminal.txt
を参照下さい。フォーマットは以下の通り。
<ESC>]51;msg<07>
msg は JSON の配列を指定します。要素の1つ目がアクション名、それ以降が引数です。現在用意されているアクションは2つあります。
drop
:terminal
の中からそれを実行した Vim に対して「このファイルを開け」を指示します。
call
:terminal
の中からそれを実行した Vim に対して「この関数を実行しろ」を指示します。ただし呼び出せる関数は Tapi_
で始まるユーザ関数でなければなりません。
活用方法
今日はこの drop を利用した便利な Tips を紹介します。全国5千万人くらいは gof というコマンドを知っていると思います。このコマンドは一般的には peco 等と同じセレクタとして働きますが、このコマンドの実行結果を drop に渡す事で :terminal
の中から親の Vim に簡単にファイルを開かせる事が出来ます。
#!/bin/sh
/bin/echo -e "\x1b]51;[\"drop\",\"`gof`\"]\x07"
実行するとこんな感じになります。
注目して欲しいのは :terminal
の中で Vim が起動したのではなく、:terminal
を起動した Vim 側で新しくウィンドウが作られバッファが開いている所です。
つまり Vim から gof の UI を利用してファイルを開きたいのであれば
:terminal ++close gofv
と起動すれば良い事になりますね。
ぜひご活用下さい。