Vimのターミナルの真の力お見せしますよ

始めに

みなさん、こんにちは

個人ブログにVimの記事しかないゴリラです。 そして今回、またしてもVimです。

Vimの高度な編集を行うことができる上、ターミナルを操作することもできてしまいます。 エディタでありながら端末でもある、夢のようなエディタです。

そんなVimのターミナル機能について触れている記事をあまり見かけたことがないので、 今回はVimのターミナルの便利な使い方についていくつか紹介していきます。

端末の起動

:termでターミナルを起動できます。

image.png

デフォルトでは画面上部にターミナルウィンドウを表示します。 分割方向を変えたい場合は次のようにします。

コマンド説明
: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を押下するとターミナルの出力を一時的に保留します。 この状態をターミナルノーマルモードと言います。このモードは普通のウィンドウと同様カーソル移動、ヤンク、検索を行うことができます。

ただ、iAなどのコマンドは挿入モードではなく、通常のターミナルモードに戻るようになっています。

vim-terminal-yank.gif

ターミナルノーマルモードを使用することで、lesstailコマンドの出力、また作業ログを簡単にメモに残すことができます。

外部コマンドとの連携

Vimでは:!echo gorillaというように:!を使用することで外部コマンドを実行できます。しかし、それだとコマンドの実行が完了するまでVimを操作できないです。とてもツライ。

そこでターミナルを使えば非同期で外部コマンドを実行できます。 コマンドを実行している間にVimの操作がブロックされないのはとても大きいですね。 では、いくつか例を紹介します。

Git log

:vert term ++close git logでGitのログを確認できます。 単にターミナル上で動いているので、いつも通りqgit logを終了できます。 この例だと++closeというオプションを私ていますが、これは外部コマンドが終了するとウィンドウを自動で閉じるオプションです。

vim-terminal-git-log.gif

Git blame

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

vim-terminal-git.gif

インタラクティブにGitを操作

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

vim-terminal-lazygit.gif

REPLを使う

コーディング中に言語の細かい動きやちょっとしたサンプルコードの実行をしたいときがあります。 REPL1を使用することで、インタラクティブにコードを実行できます。 有名ところだと、PHP -anodeなどがあります。

ぼくは普段Goを書いたりするので、goreを使っています。 goreの場合、:vert term ++close goreで起動できます。

vim-terminal-repl.gif

コンテナを管理

コンテナ技術がインフラを支える様になった昨今、開発も環境もコンテナを使用することが増えていきました。 コーディング中にコンテナを操作したいことがあります。

そこで、ぼくが作ったdocuiというTUIツールを使用することでターミナル上でインタラクティブにコンテナやイメージなどを管理できます。 lazygitと同様:vert term ++close docuiでコンテナを操作しつつコーディングできます。

vim-terminal-docui.gif

ちなみに、コンテナを操作するだけならdocker.vimというプラグインがあります。 こちらはターミナルを使わずにVimのインタフェースのみで操作できるようになっています。 興味ある方はぜひ使ってみてください。

スターウォーズ

コーディング中にスターウォーズを見たくなるときがあります。 そんなときはgo-starwarsを導入して、:term ++close go-starwars -s 20を実行してコーディングしながら見ます。

vim-terminal-starwars.gif

tmuxの代わりに使う

tmuxを使うことで、画面を分割したり、ターミナルソフトを終了してもセッションを復帰することで状態を復元できます。 Vimはセッションと言う機能があり、ターミナルと組み合わせることでtmuxと近いことができます。

こちらについては先日にVimをtmuxの代わりに使うという記事を書いたので、そちらを参照してください。

補足

本記事で紹介した内容は技術書典7で出す予定の「Vimが好きになる本」の一部です。 image.png

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

image.png image.png

まとめ

Vimのターミナルは便利です。 そのままターミナルを使うのも良いですが、外部コマンドと連携するのもまた便利です。 つまりVim最高!


  1. Read-Eval-Print Loopの略、入力・評価・出力のループのこと。 ↩︎


Vim

2019/08/12 00:00