Help us understand the problem. What is going on with this article?

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最高!


gorilla0513
https://twitter.com/gorilla0513
https://github.com/skanehira
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした