vim-users.jp

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