Hack #106: 一つのウインドウに集中する
Posted at 2009/12/03ツイート
問題
通常、Vimでは縦横に画面を分割して複数のファイルを同時に閲覧しながら編集することになります。
常に一つのウインドウのみ表示して他のバッファに:bn
などで移動することもできますが、画面分割を行なうことで編集対象のウインドウ群を平面上の位置関係で認識することにより、人間にとって直感的な管理ができ、画面分割したままウインドウの移動で複数ファイルを同時に対処するという方法が好ましいシーンが多いです。
さて、ディスプレイのサイズやフォントサイズによっては、たとえばたった6分割するだけで各ウインドウがとても小さくなってしまいます。 とりわけプレゼンテーションを行なう際には、フォントサイズを通常よりもとても大きくするため、ウインドウサイズの制限がより厳しくなります。
1タブ1ファイルという1次元空間上にバッファ群を配置することで管理することもできますが、二次元空間上で行ないたい場合、どのようにすればいいのでしょうか。
解決
コマンドBig
を定義します。以下の設定を~/.vimrc
に記述します。
command! Big wincmd _ | wincmd |
以後、:Big
でそのウインドウサイズを可能な限り広げます。
逆に全てのウインドウサイズを同程度に戻したいときは、Vim標準機能である<C-w>=を使用します。
発展
著者は以下の関数とコマンドを定義し、<Space>aoで編集中バッファを別の単独のタブに切り出すようにしています。
" kana's useful tab function {{{
function! s:move_window_into_tab_page(target_tabpagenr)
" Move the current window into a:target_tabpagenr.
" If a:target_tabpagenr is 0, move into new tab page.
if a:target_tabpagenr < 0 " ignore invalid number.
return
endif
let original_tabnr = tabpagenr()
let target_bufnr = bufnr(''
)
let window_view = winsaveview()
if a:target_tabpagenr == 0
tabnew
tabmove " Move new tabpage at the last.
execute target_bufnr 'buffer'
let target_tabpagenr = tabpagenr()
else
execute a:target_tabpagenr 'tabnext'
let target_tabpagenr = a:target_tabpagenr
topleft new " FIXME: be customizable?
execute target_bufnr 'buffer'
endif
call winrestview(window_view)
execute original_tabnr 'tabnext'
if 1 < winnr('$')
close
else
enew
endif
execute target_tabpagenr 'tabnext'
endfunction " }}}
" <space>ao move current buffer into a new tab.
nnoremap <silent> <Space>ao :<C-u>call <SID>move_window_into_tab_page(0)<Cr>
ujihisa
もどる
blog comments powered by Disqus