Edited at

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

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


コンテナを管理

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

コーディング中にコンテナを操作したいことがあります。

そこで、ぼくが作ったdocuiというTUIツールを使用することでターミナル上でインタラクティブにコンテナやイメージなどを管理することができます。

lazygitと同様:vert term ++close docuiでコンテナを操作しつつコーディングできます。

vim-terminal-docui.gif

ちなみに、コンテナを操作するだけならdocker.vimというプラグインがあります。

こちらはターミナルを使わずにVimのインターフェイスのみで操作できるようになっています。

興味ある方はぜひ使ってみてください。


tmuxの代わりに使う

tmuxを使うことで、画面を分割したり、ターミナルソフトを終了してもセッションを復帰することで状態を復元できます。

Vimはセッションと言う機能があり、ターミナルと組み合わせることでtmuxと近いことができます。

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


スターウォーズ

コーディング中にスターウォーズを見たくなるときがあります。

そんなときはgo-starwarsを導入して、:term ++close go-starwarsを実行してコーディングしながら見ます。

vim-terminal-starwars.gif


翻訳(追記分)

たまにmanコマンドでコマンドのマニュアルを読むことがあります。例えばman sshとかでsshのマニュアルを読むとすべて英語で書かれたります。

そんなとき、ターミナルノーマルモードにして、ぼくが作った翻訳プラグインtranslate.vimを使用することでブラウザを開くことなく翻訳して読むことができます。

vim-terminal-translate.gif


補足

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

本書はVim初心者から中級者向けにVimの基本機能から便利なコマンドについて解説しています。

現在執筆中のため、一部の目次を紹介します。無料版も有料版もオンラインと会場で配布する予定です。




まとめ

Vimのターミナルは便利です。

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

つまりVim最高!