Vim の :terminal がもたらすもの

追記

本記事を書いた後いろいろ状況が変わって :terminal コマンドが使える Vim が配布されるようになったので、 とりあえず現時点(2017/09/15)での状況を書きました。

tyru.hatenablog.com

序文

今絶賛開発中の Vim の :terminal コマンドについて書こうと思う。

:terminal コマンドを実行するとシェルが開き、Vim 上で操作することができる、というもの。 つまり実質的に Vim は端末ソフトウェアとなった。 その上 Vim script で端末上の様々な内容にアクセスしたり変更することができる。

expect コマンド、parallel-ssh のようなツールを Vim script で自作することも可能となった。 しかし、すでにそれらのコマンドがある以上 Vim プラグインで実現する必要性は薄いだろう。

Vim の :terminal がもたらすもの、それは外部コマンドとのさらなる相互運用性(interoperability)だと思う。

Vim 8 リリース時にも多数の機能が追加された。 job 機能や JSON パーサー/シリアライザーも他プロセスと通信するための大きな前進となった。 それが今度は :terminal によって端末まで内包してしまった。 つまり Vim ユーザは直接プロセスを起動する UI も手に入れた。*1

mattn さんが作った vim-fz というプラグインがある。 これは言ってみれば denite.vim(unite.vim)のような機能を外部コマンドにより実現したものだ。 これまで Vim script で実現するしかなかった部分を外部コマンドで代替することができるようになった。 vim-fz を見ると、これからは Vim プラグインの作り方も大きく変わってくる、そんな気がする。

Windows Subsystem Linux

最近 Vim 以外で嬉しいニュースもあった。 Windows Subsystem Linux(以下 WSL)がベータ版じゃなくなったことだ。

blogs.msdn.microsoft.com

もともと自分は Linux 環境を手に入れるために MSYS2 を使っていたが、WSL が正式にサポートされたことによりちょっとの手順でサクッと Linux 環境が手に入る。

しかし今度は端末ソフトがない。 なので MSYS2 で使っていた mintty の WSL 版である wsltty という端末ソフトを仕方なく使っていた。

tyru.hatenablog.com

そこにちょうどタイミング良く Vim が端末機能を実装した。

mattn.kaoriya.net

慣れ親しんだ Vim のキーストロークでコピペができる。 ウィンドウ分割ができる。 これがどんなに嬉しいことか…

ちなみに自分はこれまでシェルを複数起動したい場合、端末を複数起動していた。 同じように tmux や screen をただの多画面でシェルを起動するだけの使い方をしていた Vim ユーザはその必要もなくなった(セッション機能は Vim には無いが…)。

ある Windows ユーザーが Linux を求める旅が終わりを告げようとしている。

Vim を初めて見たのは Linux でのことだった。 その時はなんて質素なエディタだと思ったけど、:syntax on したら色がつくようになって、これでいいかと使い続けた。 それから約10年。 こんなに使い続けるとは思わなかった。

いつの間にかプラグインを書くようになってて、vim-jp ができてリポジトリGitHub に移って、Vim が随分と変わった。*2 これまで Vim のことが頭おかしくなるくらい好きだったけど、頭は無事おかしくなって今までよりももっともっと Vim のことが好きになってきた気がする。

:terminal コマンドを使える Vim を手に入れる

そんな Vim の :terminal コマンドはどうすれば使えるのかというと、 まだ現状配布されている Vim で使えるようになっているものはない(はず)。 Kaoriya 版も :terminal コマンドが使えるバージョンはまだ配布されていない。 Vim の nightly build でも --enable-terminal 付きでビルドされていないので使えなかった。

まだ現状どんどん仕様が変わっている最中のため仕方ないかもしれない。 けどベータ版であっても使ってみたい!と思う人はきっといっぱいいるはず。 WindowsVim をビルドする環境整えるのは結構大変だから、ベータ版を配布してもらえるとかなり嬉しいのですがどうでしょうかね…?(チラッ

Windows はそんな感じでビルドしんどいのでやってないけど、Linux や WSL 環境ではビルドできて(まぁ他の方も言ってる通り)Vim から普通に ssh したりできてるのを確認してます。 手順は以下の記事を参考にしてください。

vim-jp.org

私は毎回 configure にオプション付けたり更新したりめんどいので自作のビルドスクリプトを使ってビルドしてます。

Vim のビルドスクリプト - Humanity

そんな感じで、WSL が入ってて WSL 上で :terminal が使える Vim にパスが通っているなら、 ファイル名を指定して実行から bash --login -c "vim +terminal +only" でとりあえず WSL 上の Vim で端末を開始した状態で起動することはできる。 ただ MSYS2 だとそんなことないんだけど、WSL からはクリップボードレジスタが使えず、コピペするには端末(この場合 cmd.exe)のコピペ機能を使うことになる。 どうにかできるものかも分からないけどどうにかしたい。

バグ報告

ちなみに使ってみたけどなんかこの挙動おかしくない? って場合はここに投稿するといいです。 現状端末機能(だけじゃないけど)に関するパッチを書いてるメインコントリビュータの方々が見てる(というか書き込んでる)ので直してもらえるはず。

github.com

ちなみに

この記事を公開して日付見て初めて気付いたのですが、明日誕生日なのでなにかください(WindowsGVim +terminal でもいいです)。

https://www.amazon.co.jp/registry/wishlist/2DPWFJWB4GSNY/ref=cm_sw_r_tw_ws_x_XQ3dybZ1HC14Hwww.amazon.co.jp

*1:もちろんこれまでも :!cmd のように外部コマンドを実行することはできたが、対話プログラムは無理だった

*2:http://tyru.hatenablog.com/entry/20130326/vimmers_over_vim_jp