Vimの便利な画面分割&タブページと、それを更に便利にする方法

  • 1140
    いいね
  • 7
    コメント
この記事は最終更新日から1年以上が経過しています。

この記事はVim Advent Calendar 2013 : ATNDの99日目の記事です。

画面分割・タブページのススメ

みなさん、分割してますか?
みなさん、タブページ使ってますか?

僕はどちらも大好きです。

  • サンプルを見ながら写経する
  • TODOやメモを見ながら編集
  • 関数の定義元などを見ながら編集
  • 編集目的に合わせてタブを分ける

などなど。 ものぐさな僕は、コードを書くときはガシガシ分割したりしながらコードを書いています。

これらの機能は当然設定やプラグインの導入などをしなくても使えますが自分はsキーをprefixとしたキーマッピングをしています。
元は<C-w>の代わりにsを使っていただけですが、タブウィンドウ関連やバッファ関連にも使うようにしたことで、格段に便利になりました。自分の設定例を合わせて掲載するので、良ければ参考にしてください。

各種機能とマッピング

ウィンドウを分割する

sn.gif

項目名 デフォルト オリジナル設定
水平分割 :split ss
垂直分割 :vsplit sv

分割したウィンドウ間を移動する

sj.gif

項目名 デフォルト オリジナル設定
左に移動 <C-w>h sh
下に移動 <C-w>j sj
上に移動 <C-w>k sk
右に移動 <C-w>l sl
次に移動 <C-w>w sw

分割したウィンドウそのものを移動する

sK.gif

項目名 デフォルト オリジナル設定
左に移動 <C-w>H sH
下に移動 <C-w>J sJ
上に移動 <C-w>K sK
右に移動 <C-w>L sL
回転 <C-w>r sr

カレントウィンドウの大きさを変える

so.gif

項目名 デフォルト オリジナル設定
縦に最大化 <C-w>_ なし
横に最大化 <C-w>パイプ なし
縦横最大化 なし so
大きさを揃える <C-w>= sO もしくは s=
幅を増やす <C-w>> s>
幅を減らす <C-w>< s<
高さを増やす <C-w>+ s+
高さを減らす <C-w>- s-

テーブル内で|を表示すると崩れるみたいなので、パイプと表記してます。

またs>系のマッピングは、実際には「vim-submode」というプラグインを使ってs>>>などでサイズ変更出来るようにしてます。詳しくは最後のVimrcを参照してください。

タブページ関連

tab.gif

項目名 デフォルト オリジナル設定
新規タブ :tabnew st
次のタブに切替 gt sn
前のタブに切替 gT sp

閉じる

項目名 デフォルト オリジナル設定
ウィンドウを閉じる :q sq
バッファを閉じる :bd sQ

Unite.vim

unite.png

項目名 デフォルト オリジナル設定
タブ一覧 :Unite tab sT
現在のタブで開いたバッファ一覧 :Unite buffer_tab sb
バッファ一覧 :Unite buffer sB

当然ですが「unite.vim」が必要です。

最後に

ウィンドウとバッファとタブページについて

バッファはファイル等の内容そのもの。
ウィンドウはバッファを表示するもので、別ウィンドウで同じファイルを開いて編集したり出来る。
タブページはウィンドウを束ねるもの。

詳しくは「Vim のバッファとウィンドウを理解する - 反省はしても後悔はしない」で解説されています。
この記事も去年のVACの記事ですね。歴史長い!

sキーの元々の機能について

今回潰したsキーには元々割り当たっている機能がありますが、ヘルプに書かれている通り、他で代用が効くので気にせず潰しています。
まったく別のマッピングをする場合でもsキーはかなり押しやすい位置にあるので、マッピング先に便利でおすすめです。

["x]s [count] 文字を [レジスタ x に入れ] 削除し、挿入を始め
る (s は Substitute --置換 を意味する)。"cl" と同義で
ある (行単位でない|linewise|)。

vimrc

最後に、当該箇所の自分のvimrcを貼っておきます。

nnoremap s <Nop>
nnoremap sj <C-w>j
nnoremap sk <C-w>k
nnoremap sl <C-w>l
nnoremap sh <C-w>h
nnoremap sJ <C-w>J
nnoremap sK <C-w>K
nnoremap sL <C-w>L
nnoremap sH <C-w>H
nnoremap sn gt
nnoremap sp gT
nnoremap sr <C-w>r
nnoremap s= <C-w>=
nnoremap sw <C-w>w
nnoremap so <C-w>_<C-w>|
nnoremap sO <C-w>=
nnoremap sN :<C-u>bn<CR>
nnoremap sP :<C-u>bp<CR>
nnoremap st :<C-u>tabnew<CR>
nnoremap sT :<C-u>Unite tab<CR>
nnoremap ss :<C-u>sp<CR>
nnoremap sv :<C-u>vs<CR>
nnoremap sq :<C-u>q<CR>
nnoremap sQ :<C-u>bd<CR>
nnoremap sb :<C-u>Unite buffer_tab -buffer-name=file<CR>
nnoremap sB :<C-u>Unite buffer -buffer-name=file<CR>

call submode#enter_with('bufmove', 'n', '', 's>', '<C-w>>')
call submode#enter_with('bufmove', 'n', '', 's<', '<C-w><')
call submode#enter_with('bufmove', 'n', '', 's+', '<C-w>+')
call submode#enter_with('bufmove', 'n', '', 's-', '<C-w>-')
call submode#map('bufmove', 'n', '', '>', '<C-w>>')
call submode#map('bufmove', 'n', '', '<', '<C-w><')
call submode#map('bufmove', 'n', '', '+', '<C-w>+')
call submode#map('bufmove', 'n', '', '-', '<C-w>-')

追記(2014/03/10 8:36)

@hisatake_i
最初の 画像が コロンとセミコロンが間違ってるな。

:;をノーマルモードでのみ入れ替えるマッピングをしているため、画像上では;を打ったと表示されています。紛らわしくてすみません。実際には:を打つ必要があります。

英字キーボードではオススメの設定なので、あわせてどうぞ。

" コロンとセミコロンを入れ替え
noremap : ;