Vim

:terminal に関する小さい Tips

空いてたので割り込み。

君は 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"

実行するとこんな感じになります。

gofv

注目して欲しいのは :terminal の中で Vim が起動したのではなく、:terminal を起動した Vim 側で新しくウィンドウが作られバッファが開いている所です。

つまり Vim から gof の UI を利用してファイルを開きたいのであれば

:terminal ++close gofv

と起動すれば良い事になりますね。

ぜひご活用下さい。