はじめに
Vimはキーボードで全ての操作を行えて速いとはよく言いますが、ことウィンドウの移動に関しては弱点があります。それはプレフィックスの<Ctrl + w>
を毎回入力しなければいけないのが面倒な事です。
例えば四分割したウィンドウの右上から左下へ移動したい場合には、<Ctrl + w> + h
→<Ctrl + w> + j
と合計で4回もキータイプしなくてはなりません。マウスよりか速いかもしれませんが、これでは指が疲れてしまいます。今回はこのプレフィックスの入力を最初の一回のみでVimを操作する方法をまとめたいと思います。
ちなみに「ウィンドウの移動」というよりは「アクティブなウィンドウ内のペインの移動」という方が言葉として正しいかもしれません。ウィンドウだと別タブ内のウィンドウも含むのかという誤解を招くからです。ただし説明が楽なのでここではウィンドウという表現をそのまま使わせて頂きます。
プレフィックスの入力を減らす方法
vim-submodeというプラグインを使います。Vimプラグインのインストールについてはこちらをご確認下さい。vim-submodeプラグインはサブモードを定義する事を可能にしてくれるVimプラグインです。
例えば先に述べたウィンドウの移動の際に<C-w>h<C-w>h…と繰り返しウィンドウ操作プレフィックスを入力するのではなく、ウィンドウモードという独自のサブモードを定義して<C-w>hなどのウィンドウ操作時に遷移することで、<C-w>hhjkl…と入力を減らしてウィンドウの移動が出来るということです。
想像すると難しそうですが百聞は一見に如かずということで、vim-submodeプラグインをインストールしましたら下記のコードを.vimrcに追記してみて下さい。
"" ウィンドウ移動系
call submode#enter_with('winmove', 'n', '', '<C-w>h', '<C-w>h')
call submode#enter_with('winmove', 'n', '', '<C-w>j', '<C-w>j')
call submode#enter_with('winmove', 'n', '', '<C-w>k', '<C-w>k')
call submode#enter_with('winmove', 'n', '', '<C-w>l', '<C-w>l')
call submode#enter_with('winmove', 'n', '', '<C-w>w', '<C-w>w')
call submode#enter_with('winmove', 'n', '', '<C-w>t', '<C-w>t')
call submode#enter_with('winmove', 'n', '', '<C-w>b', '<C-w>b')
call submode#map('winmove', 'n', '', 'h', '<C-w>h')
call submode#map('winmove', 'n', '', 'j', '<C-w>j')
call submode#map('winmove', 'n', '', 'k', '<C-w>k')
call submode#map('winmove', 'n', '', 'l', '<C-w>l')
call submode#map('winmove', 'n', '', 'w', '<C-w>w')
call submode#map('winmove', 'n', '', 't', '<C-w>t')
call submode#map('winmove', 'n', '', 'b', '<C-w>b')
"" ウィンドウサイズ系
call submode#enter_with('winsize', 'n', '', '<C-w>>', '<C-w>>')
call submode#enter_with('winsize', 'n', '', '<C-w><', '<C-w><')
call submode#enter_with('winsize', 'n', '', '<C-w>+', '<C-w>+')
call submode#enter_with('winsize', 'n', '', '<C-w>-', '<C-w>-')
call submode#map('winsize', 'n', '', '>', '<C-w>>')
call submode#map('winsize', 'n', '', '<', '<C-w><')
call submode#map('winsize', 'n', '', '+', '<C-w>+')
call submode#map('winsize', 'n', '', '-', '<C-w>-')
これでVimでウィンドウ移動する際に最初の一回だけ<Ctrl + w>
プレフィックスを入力したら後はhjklを続けても移動出来るようになったかと思います。後半はウィンドウサイズ変更のための設定です。
タブ移動とかにも
vim-submodeプラグインはある入力に対して自分で名付けたサブモードに遷移させて、Escapeキーやキーマッピングの設定されていないキーが入力されるまでは後続の設定(submode#map()
)でマッピングしたキーバインドを実行するというものです。
つまりこのフォーマットに則って記述すればウィンドウ操作以外にも応用が効きます。先程と同様に下記のコードを.vimrcに追記するとタブ移動も楽になります。
call submode#enter_with('changetab', 'n', '', 'gt', 'gt')
call submode#enter_with('changetab', 'n', '', 'gT', 'gT')
call submode#map('changetab', 'n', '', 't', 'gt')
call submode#map('changetab', 'n', '', 'T', 'gT')
終わりに
vim-submodeプラグインのおかげで大分移動が楽になったかと思います。ですがそもそもの話Vimでウィンドウを開きすぎるのは良くないと言われます。目まぐるしく上下左右に目を動かすという状況自体目が疲れてしまうので好ましくないからです。
ctagsとかジャンプを利用するのがベストプラクティスのようですが、私は鳥頭なので関連ファイルを全て開きたくなってしまう性分なのです。