Vimのターミナルの真の力お見せしますよ
始めに
みなさん、こんにちは
個人ブログにVimの記事しかないゴリラです。 そして今回、またしてもVimです。
Vimの高度な編集を行うことができる上、ターミナルを操作することもできてしまいます。 エディタでありながら端末でもある、夢のようなエディタです。
そんなVimのターミナル機能について触れている記事をあまり見かけたことがないので、 今回はVimのターミナルの便利な使い方についていくつか紹介していきます。
端末の起動
:termでターミナルを起動できます。

デフォルトでは画面上部にターミナルウィンドウを表示します。 分割方向を変えたい場合は次のようにします。
| コマンド | 説明 | 
|---|---|
| :vert term | 垂直分割して開く | 
| :bo term | 水平分割して画面最下部にウィンドウを開く | 
| :top term | 水平分割して画面最上部にウィンドウを開く | 
他にもいくつかコマンドがありますので、:h vertでヘルプを引いてそのあたりを参照してください。
ターミナルでの操作
ターミナルでは入力したキーはそのまま端末に送られます。
ウィンドウのフォーカスの移動などに関しては特別な操作が必要です。
最低限の操作は次になります。CTRL-Wが接頭辞キーになっています。
| キーマップ | 説明 | 
|---|---|
| CTRL-W w | 次のウィンドウにフォーカスを当てる | 
| CTRL-W N | ターミナルノーマルモードに移行 | 
| CTRL-W . | 端末にCTRL-Wを送る | 
| CTRL-W : | コマンドラインモードに移行 | 
| CTRL-W " {reg} | レジスタの中身を貼り付ける | 
端末の内容をヤンク
VimのターミナルウィンドウでCTRL-W Nを押下するとターミナルの出力を一時的に保留します。
この状態をターミナルノーマルモードと言います。このモードは普通のウィンドウと同様カーソル移動、ヤンク、検索を行うことができます。
ただ、iやAなどのコマンドは挿入モードではなく、通常のターミナルモードに戻るようになっています。

ターミナルノーマルモードを使用することで、lessやtailコマンドの出力、また作業ログを簡単にメモに残すことができます。
外部コマンドとの連携
Vimでは:!echo gorillaというように:!を使用することで外部コマンドを実行できます。しかし、それだとコマンドの実行が完了するまでVimを操作できないです。とてもツライ。
そこでターミナルを使えば非同期で外部コマンドを実行できます。 コマンドを実行している間にVimの操作がブロックされないのはとても大きいですね。 では、いくつか例を紹介します。
Git log
:vert term ++close git logでGitのログを確認できます。
単にターミナル上で動いているので、いつも通りqでgit logを終了できます。
この例だと++closeというオプションを私ていますが、これは外部コマンドが終了するとウィンドウを自動で閉じるオプションです。

Git blame
:term ++close git blame %でファイルの変更履歴を確認できます。
%は現在開いているファイル名になります。

インタラクティブにGitを操作
Gitコマンドの実行方法を紹介しましたが、Gitをインタラクティブに操作できるlazygitというTUIツールがあります。
こちらも同様に:vert term ++close lazygitで実行できます。
こちらのツールはとても便利ですので、ぜひ試してみてください。

REPLを使う
コーディング中に言語の細かい動きやちょっとしたサンプルコードの実行をしたいときがあります。
REPL1を使用することで、インタラクティブにコードを実行できます。
有名ところだと、PHP -aやnodeなどがあります。
ぼくは普段Goを書いたりするので、goreを使っています。
goreの場合、:vert term ++close goreで起動できます。

コンテナを管理
コンテナ技術がインフラを支える様になった昨今、開発も環境もコンテナを使用することが増えていきました。 コーディング中にコンテナを操作したいことがあります。
そこで、ぼくが作ったdocuiというTUIツールを使用することでターミナル上でインタラクティブにコンテナやイメージなどを管理できます。
lazygitと同様:vert term ++close docuiでコンテナを操作しつつコーディングできます。

ちなみに、コンテナを操作するだけならdocker.vimというプラグインがあります。 こちらはターミナルを使わずにVimのインタフェースのみで操作できるようになっています。 興味ある方はぜひ使ってみてください。
スターウォーズ
コーディング中にスターウォーズを見たくなるときがあります。
そんなときはgo-starwarsを導入して、:term ++close go-starwars -s 20を実行してコーディングしながら見ます。

tmuxの代わりに使う
tmuxを使うことで、画面を分割したり、ターミナルソフトを終了してもセッションを復帰することで状態を復元できます。 Vimはセッションと言う機能があり、ターミナルと組み合わせることでtmuxと近いことができます。
こちらについては先日にVimをtmuxの代わりに使うという記事を書いたので、そちらを参照してください。
補足
本記事で紹介した内容は技術書典7で出す予定の「Vimが好きになる本」の一部です。

本書はVim初心者から中級者向けにVimの基本機能から便利なコマンドについて解説しています。 現在執筆中のため、一部の目次を紹介します。無料版も有料版もオンラインと会場で配布する予定です。

まとめ
Vimのターミナルは便利です。 そのままターミナルを使うのも良いですが、外部コマンドと連携するのもまた便利です。 つまりVim最高!
Read-Eval-Print Loopの略、入力・評価・出力のループのこと。 ↩︎