こんにちは。
ゴリラ.vimを運営しているゴリラです。

前回の記事では、コマンドラインモードについて解説しました。:%!jq でテキストを整形したりと外部コマンド連携が得意なモードではありますが、コマンドの実行が完了するまでVimを操作できないというデメリットがあります。コマンドを非同期で実行したい場合は多々あるので、そういった場合はVimのTerminal-Jobモードを使用します。VimではターミナルのことをTerminal-Jobモードと呼びますが、分かりづらいので以降はターミナルと記載します。

本記事では、ターミナルの基本的な操作方法と実践的な使い方について解説していきます。Vimで更に作業効率を上げたい方はぜひ最後まで読んでみてください。

ターミナルの起動

Vimでターミナルを起動するのはとても簡単です。:terminalもしくは短縮形の:termで起動することができます。次の動画はVimでターミナルを開き、echoコマンドを実行する例になります。

ターミナル起動時に使用するシェルは:set shell?で確認できます。ちなみに筆者の場合はshell=/bin/bashになっています。起動時に使用するシェルを変更したい場合は:term fishのように引数にシェルコマンドを指定するか、:set shell=fishでVimで使用するデフォルトシェルを変更できます。

なお、デフォルトシェルを永続的に変更したい場合は:set shell=fishvimrc(Vimの設定ファイル)に設定する必要があります。vimrcについては次回の記事で解説します。また、引数はシェルコマンドだけではなく、PATHが通っているコマンドであれば実行することができます。次の動画はechoコマンドをシェルを介さずに実行した例になります。

:terminalには次のように、いくつかオプションがあります。

オプション 説明
++close ターミナルを終了する際にウィンドウを閉じる
++noclose ターミナルを終了してもウィンドウを閉じない
++curwin 現在のウィンドウでターミナルを開く
++rows={height} ターミナルウィンドウの縦幅を指定する
++cols={width} ターミナルウィンドウの横幅を指定する

引数なしで:terminal を実行する場合、シェルの実行を終了するとウィンドウも閉じますが、echoコマンドの例の通り、引数で指定したコマンドの実行が終了してもウィンドウは自動で閉じないので、自動で閉じたい場合は++closeを使用する必要があります。

++curwinで現在のウィンドウをターミナルウィンドウとして使用することができます。なお、未保存の変更がある場合はターミナルウィンドウを開くことができないので、変更を保存するか、:terminal! ++curwinのようにコマンドに!をつけることでターミナルウィンドウを開くことができます。ただ、変更が未保存の状態は維持されますが、保存はされないので誤ってVimを終了しないように注意してください。

ターミナルウィンドウの分割

デフォルトではターミナルウィンドウは水平分割した状態で開きますが、次のように画面分割方法を指定することもできます。

Exコマンド 説明
:vert terminal 垂直分割してターミナルを起動
:bo terminal 水平分割して最下部にターミナルを起動
:top terminal 水平分割して最上部にターミナルを起動
:tab terminal 新たなタブページを開いてターミナルを起動

次の動画は上記の画面分割の例になります。

ターミナルでの特別な操作

ターミナルでは基本的に入力したキーがそのまま送られますが、CTRL-wを除いて通常のターミナルとほぼ同じ動作になります。VimではCTRL-wを使用してウィンドウ間の移動を行ったりします。そのため、CTRL-wはそのままターミナルに送られないようになっています。

ターミナルにCTRL-wをそのまま入力したい場合はCTRL-w .のように.を続けて入力する必要があります。このようにターミナルウィンドウにおいてCTRL-wをプレフィックスキーとした特別な操作は次の通りです。

キーマップ 説明
CTRL-w . ターミナル上でCTRL-wを入力する
CTRL-w : コマンドラインモードに切り替え
CTRL-w j 下のウィンドウに移動
CTRL-w k 上のウィンドウに移動
CTRL-w h 左のウィンドウに移動
CTRL-w l 右のウィンドウに移動
CTRL-w gt 次のタブページに移動
CTRL-w gT 前のタブページに移動
CTRL-w N Terminal-Normalモードに切り替え(後述)

筆者は普段ターミナルで単語を削除するのにCTRL-wを使用することが多いので、Vim上でターミナルで単語を削除するのにCTRL-w .はとても不便と感じています。そこで、:set termwinkey=<C-g>でプレフィックスキーをCTRL-gに割り当てることで、Vim上のターミナルでもCTRL-wで単語を削除することができるようにしています。termwinkeyの設定も永続化するにはvimrcに記載する必要があります。次の動画ではtermwinkey変更前のと後の差異を確認する例になります。

Terminal-Normalモード

Vimのターミナルの強みの一つはTerminal-Normalモードです。このモードはターミナルの出力を一時的に保留し、Vimの制御下に置きます。Vimの制御下に置くことでウィンドウ内の内容をヤンクしたり、検索することができます。例えばコマンドの実行ログをメモとして残すときに便利です。

次の動画ではTerminal-Normalモードでテキストヤンク、検索する一例になります。

ターミナルの実用例

ターミナルの基本操作について一通り解説しましたので、本節ではターミナル実用例をいくつか紹介していきます。どれも普段筆者がよく行っていることです。

HTTPサーバー

VimでHTMLやJSのコーディングをするときに動作確認用に簡易HTTPサーバーを立てることがあります。node.jsにhttp-serverという簡易HTTPサーバーパッケージがあるのでそれを利用して、:term ++close http-serverで簡易HTTPサーバーを立てることができます。

しかし、これでは画面半分がターミナルウィンドウに占められてしまうため、全画面をコーディングに使用できず効率が下がります。そこで++hiddenオプションを使用して:term ++hidden http-serverでターミナルウィンドウを出さずにHTTPサーバーを実行することができます。ただ、このままではHTTPサーバーを止めることができないので、:ls!で隠れているターミナルを見つけ:b {buf_num}で番号を指定することでターミナルウィンドウを出してHTTPサーバーを止めます。

次の動画ではバックグラウンドでHTTPサーバーを立てた後、ターミナルウィンドウを画面に出しサーバーを止める例になります。

Git

ターミナルを使用することで:term ++close git logのように直接Gitコマンドを実行することもできますが、筆者はlazygitというGitのTUIツールを愛用しています。このlazygitを使用することでターミナル上でGUIと近い操作感でGitを使用することができます。次の動画ではlazygitを使用してGitを操作する例になります。

Docker

近年、Dockerはインフラのみならず開発でも多くの方が使用するようになってきました。筆者もその一人です。Dockerは簡単に環境を作れる上、開発環境の差分を無くせるのでとても便利ですが、コマンドとオプションが多く慣れるまでに時間がかかるので、もっと手軽にDockerを操作できるTUIツールdocuiを作りました。

lazygitと同じ要領で:tab term ++close docuiでVim上でGUIに近い操作感でDockerを操作することができます。控えめに言ってとても便利なのでみなさんにおすすめです。次の動画はdocuiを使用してDockerを操作する一例になります。

REPL

コーディング中に関数の詳細な動きを確認したり、サンプルコードをサクッと実行したい場合があります。REPL(Read-Eval-Print Loop)ツールを使用することコードの動作を確認できるのでとても便利です。次の動画ではVimのターミナル上でnode.jsのインタプリタを使用してJSのコードを実行する例になります。

翻訳

翻訳プラグインを導入することで、例えばコマンドのmanページの説明を日本語に訳して読むことができます。筆者は主に翻訳でTerminal-Normalモードを使用することが多いです。翻訳は筆者が作成したtranslate.vimという翻訳プラグインを使用すると便利です。プラグインの導入方法については本連載にて後日執筆予定のプラグイン編で詳しく解説するので、ここではこういった使い方があるんだということを知って頂ければと思います。

次の動画は翻訳プラグインを使用してコマンドの詳細説明を翻訳する例になります。

最後に

本記事ではVimでのターミナルの基本操作から使用例を元に解説してきました。筆者はVimのターミナルは毎日一回は起動しているくらい使用しています。それくらい便利です。ターミナルがあるかないかで作業効率が俄然変わるので、みなさんもぜひターミナルを使用してみてください。また、こういった使い方もあるよといった知見があればぜひご教示いただけると嬉しいです。

次回の記事はVimの設定編です。Vimをカスタマイズする方法について解説します。お楽しみにして頂ければと思います。

vim