Vim の window resize を連打しやすくする
Vim の標準キーバインドを崩さずに
1. はじめに
Vim の window resize は標準で以下のキーバインドが用意されています。
<C-w>-
<C-w>+
<C-w><
<C-w>>
それぞれ window の高さや幅を 1 ずつ変更する操作です。
標準機能としては十分なのですが、少し大きめに resize したいときに毎回 <C-w> を押すのがやや面倒です。
<C-w>-<C-w>-<C-w>-
気持ちとしては、最初の <C-w> だけ押して、あとは resize 方向のキーを連打したい。
<C-w>---
これを実現する mapping のメモです。
2. 設定
vimrc に以下のように書きます。
vimrc
" Resize Window
nmap <C-w>- <C-w>-<SID>ws
nmap <C-w>+ <C-w>+<SID>ws
nmap <C-w><lt> <C-w><lt><SID>ws
nmap <C-w>> <C-w>><SID>ws
nmap <SID>ws <Nop>
nnoremap <script> <SID>ws- <C-w>-<SID>ws
nnoremap <script> <SID>ws+ <C-w>+<SID>ws
nnoremap <script> <SID>ws<lt> <C-w><lt><SID>ws
nnoremap <script> <SID>ws> <C-w>><SID>ws
これで以下のように resize できます。
<C-w>----
<C-w>++++
<C-w><<<
<C-w>>>>
< は key notation の開始記号として扱われるので <lt> と書きます。 一方で > はそのまま書けます。
3. 仕組み
最初の mapping は標準の resize 操作を実行したあと、<SID>ws という script-local な中継地点に入ります。
nmap <C-w>- <C-w>-<SID>ws
<SID>ws 自体は何もしない mapping です。
nmap <SID>ws <Nop>
ただし、<SID>ws- や <SID>ws+ のような続きの mapping も定義しておきます。 そのため、<SID>ws に入った直後に - を押すと、もう一度 <C-w>- が実行されます。
nnoremap <script> <SID>ws- <C-w>-<SID>ws
そして RHS の最後でまた <SID>ws に戻るので、- を押し続けるだけで resize を繰り返せます。
<script> を付けているのは、RHS の <SID>ws だけをこの script-local mapping として解決したいからです。 通常のユーザー定義 mapping と混ざりにくくなります。
4. キーを変える場合
標準の <C-w>-, <C-w>+, <C-w><, <C-w>> を尊重したい場合は上の設定でよいです。
もし Vim のデフォルトにこだわらないなら、H, J, K, L に割り当てる形にもできます。
vimrc
" Resize Window
nmap <C-w>H <C-w><lt><SID>ws
nmap <C-w>J <C-w>-<SID>ws
nmap <C-w>K <C-w>+<SID>ws
nmap <C-w>L <C-w>><SID>ws
nmap <SID>ws <Nop>
nnoremap <script> <SID>wsH <C-w><lt><SID>ws
nnoremap <script> <SID>wsJ <C-w>-<SID>ws
nnoremap <script> <SID>wsK <C-w>+<SID>ws
nnoremap <script> <SID>wsL <C-w>><SID>ws
ただし、この形は <C-w>H などの Vim 標準の window 移動系キーバインドを上書きします。 そのため、標準キーバインドを残したい場合は -, +, <, > のままにするのが無難です。
5. おわりに
私の dotfiles では今は不要になったので外しましたが、設定としてはちゃんと動くのでメモとして残しておきます。