vim-users.jp

Hack #42: 縦分割で画面が狭くなりすぎないようにする

Posted at 2009/07/16
このエントリーをはてなブックマークに追加

問題

:vsp:vnewなどで画面を縦に分割し、Vimの中で左右にウインドウが配置されます。 <C-w>h<C-w>lでウインドウ間を左右に渡り歩きながらバッファを編集することが可能です。

しかしVimのヘルプ文書など、画面横幅が80字以上であることを仮定した文書は多数あり、これを縦分割によって狭くなった横幅の画面で閲覧すると非常に読みにくくなります。

例

解決

以下の設定を~/.vimrcに記述します。

nnoremap <C-w>h <C-w>h:call <SID>good_width()<Cr>
nnoremap <C-w>l <C-w>l:call <SID>good_width()<Cr>
nnoremap <C-w>H <C-w>H:call <SID>good_width()<Cr>
nnoremap <C-w>L <C-w>L:call <SID>good_width()<Cr>
function! s:good_width()
  if winwidth(0) < 84
    vertical resize 84
  endif
endfunction

これで、今後<C-w>hなどでウインドウ間の移動を行なうと、自動的にウインドウ横幅を修正してくれます。

また、横幅指定を80ではなく84とすこし多めにしているのは、行番号部分に対応するためです。

議論

<C-w>hの挙動を上書きせずとも、'winminwidth'を設定した方が良いのでは、と勘ぐった人も多いのではないでしょうか。 具体的には以下のように指定します。

set winminwidth=84

あるいは、以下のようにWinEnterイベントにウインドウ幅の変更を指定するという方法もあります。 具体的には以下のように指定します。

augroup MyWinEnterWidth
  autocmd!
  autocmd WinEnter * if winwidth(0) < 84 | vertical resize 84 | endif
augroup END

しかし本Hackではこの手法を意図的に避けました。 ウインドウの新規生成時や、自動的なウインドウの移動のときにはデフォルトの挙動のままにしておきたいためです。

もちろん、全てのウインドウのフォーカスの移り変わりに対して横幅の再設定を行ないたい場合には上記autocmdを使った設定の方が好ましいでしょう。

なお、著者はCTRLキーを回避するため、以下のようにsをプレフィックスにしたウインドウの移動キーを割り当てています。

nnoremap sh <C-w>h:call <SID>good_width()<Cr>
nnoremap sj <C-w>j
nnoremap sk <C-w>k
nnoremap sl <C-w>l:call <SID>good_width()<Cr>
nnoremap sH <C-w>H:call <SID>good_width()<Cr>
nnoremap sJ <C-w>J
nnoremap sK <C-w>K
nnoremap sL <C-w>L:call <SID>good_width()<Cr>
function! s:good_width()
  if winwidth(0) < 84
    vertical resize 84
  endif
endfunction

そして、ウインドウの大きさを変えずに移動したいときには、shなどではなく<C-w>hとして本来のウインドウ移動キーを使用するようにしています。

参考

ujihisa

もどる
blog comments powered by Disqus