Vim

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

More than 5 years have passed since last update.

この記事は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 : ;