vimとneovimとターミナル操作

こんにちは。最近、バドミントンにハマっているrsudoです。

今回の記事では、vimでファイル編集しながらターミナル操作もしたいときにどうすればいいのか考えていきます。

いくつか方法が考えられますが、設定が楽な順番で紹介した上で今の自分の運用方法について説明します。 一応、vimとneovim両方について書きますが、筆者はneovimを使用しており、vimの使用歴が短いためvimについては詳しく説明できません。

Ctrl-zでvimを一時中断

Ctrl-zを入力することでプロセスに対しシグナルを送信し、中断させることができます。停止したプロセスはfgコマンドで再開させることができます。つまり、Ctrl-zfgでターミナルとvimを高速で行き来することが可能になります。

メリット

  • 設定が不要

デメリット

  • ターミナルを操作している間にvimを中断させてることを忘れる(自分だけかも)
  • 画面分割でターミナル操作はできない

iTermの機能で操作する

iTermを使用してい方であれば画面分割や複数ウィンドウの機能がターミナルの機能として使用できます。自分はiTermを使用していないので詳しいことは分かりません。

操作方法についての参考記事: iTerm2ショートカット備忘録 - Qiita

メリット

  • 設定が不要

デメリット

  • iTermを使ってないとできない(それはそう)

tmuxで操作する

tmuxを使用すると画面分割や複数のタブでターミナルを操作することができるようになります。 キーバインドに関する設定は以下のようにしています。

# prefixキーをCtrl-qに変更
set -g prefix C-s

# C-bのキーバインドを解除
unbind C-b

## ペインのキーバインド
#prefix + c で新しいウィンドウを開く
bind c new-window -c '#{pane_current_path}'

# prefix+\でペインを垂直分割する
bind \\ split-window -h -c '#{pane_current_path}'

# prefix+-でペインを水平分割する
bind - split-window -v -c '#{pane_current_path}'

# prefix+r で設定のリロード
bind r source-file ~/.tmux.conf \; display "Reloaded!"

tmuxのコマンドに関してはこちらの記事が簡潔にまとまっていました。

qiita.com

複数ウィンドウを開いて作業

  1. prefix + cで新しいウィンドウを開く
  2. prefix + nprefix + pでウィンドウを切り替える。

画面分割して作業

  1. prefix + \で縦分割もしくはprefix + -で横分割
  2. prefix + 矢印キーで画面を移動

マウス操作

設定でマウス操作を有効にしておくと、右クリックで下のようなウィンドウが表示されて画面分割などの操作が行えます。

f:id:rio_1:20220129145141p:plain

メリット

  • 画面分割と複数ウィンドウの好きな方法で操作ができる

デメリット

  • デフォルトのキーバインドがやや打ちづらい
  • 分割した画面を移動するときに矢印キーを打つのが面倒(設定でどうにかできるかも)

vimのターミナル機能を使う

vimのターミナル機能はオプションで、対応しているかどうかはecho has('terminal')の結果が1かどうかで判断することができます。対応してなかったら最新版のvimを入れ直したらできるようになるかも。

vim ターミナルの公式ドキュメント: terminal - Vim日本語ドキュメント

neovim ターミナルの公式ドキュメント: Nvim documentation: nvim_terminal_emulator

起動

:termもしくは:terminalで起動できます。 ターミナルを開くときの分割方法やシェルの種類を指定することができます。

コマンド 意味
:vert term 垂直分割
:bo term 水平分割して下でターミナル起動
:top term 水平分割して上でターミナル起動
:term bash bashを起動

操作方法

vimのターミナルには、ファイル操作の時のようにnormalモードとtarminalモードが存在します。 ただし、neovimではなくノーマルのvimの場合、tarminalモードを基本として操作することになっているため画面移動などはtarminalモードのまま行えます。

モード変更

normal -> tarminal insert -> tarminal
i もしくは a Ctrl-\ + Ctrl-n

insertモードからtarminalモードに移行するためのコマンドがかなり押しづらいので、使いやすいようにキーマッピングした方がいいと思います。

自分の場合は、jjノーマルモードに移行できるようにしています。

tnoremap <silent> jj <C-\><C-n>

設定

vimrcinit.vimなどを編集してターミナルを使いやすいように設定することが可能です。 自分はこちらの記事を参考にしました。Neovim内でのターミナル利用を快適にするVimscript - Kotaro7750's diary

また、neovimには:terminalコマンドをラップしたneotermというプラグインがあるようで、こちらを導入してもいいかもしれません。(自分は使っていないです)

neotermのリポジトリはこちら github.com

vimのターミナルまとめ

vimのターミナル機能については設定をいじらないと快適に使えないと思うので少しハードルが上がると思います。 ただ、ターミナルを開きつつvimのコマンドも使えるのでできることはかなり広がります。

例えば、こちらの記事の記事で紹介されているようにvimプラグインを使用してmanコマンドの出力を日本語訳するのは便利だと思いました。

個人的ターミナル運用方法

自分のターミナルの運用方法としては、

  • 基本はtmuxの複数ウィンドウを開き、neovimの編集画面とターミナルの操作画面で使い分け
  • ターミナルとファイルを同時に見たいときはneovimのターミナルを起動する

となっています。なぜこうしているかは、

  • 画面いっぱいでファイル編集を行いたい。
  • 一回開いたターミナルバッファがどこにあるか分からなくなる。

といった理由があるのですが、設定次第でneovimのターミナルがかなり使いやすくなるのでneovimのターミナルをもっと使用していきたいと思っています。