この記事はVim Advent Calendar 2013 : ATNDの99日目の記事です。
画面分割・タブページのススメ
みなさん、分割してますか?
みなさん、タブページ使ってますか?
僕はどちらも大好きです。
- サンプルを見ながら写経する
- TODOやメモを見ながら編集
- 関数の定義元などを見ながら編集
- 編集目的に合わせてタブを分ける
などなど。 ものぐさな僕は、コードを書くときはガシガシ分割したりしながらコードを書いています。
これらの機能は当然設定やプラグインの導入などをしなくても使えますが自分はsキーをprefixとしたキーマッピングをしています。
元は<C-w>
の代わりにs
を使っていただけですが、タブウィンドウ関連やバッファ関連にも使うようにしたことで、格段に便利になりました。自分の設定例を合わせて掲載するので、良ければ参考にしてください。
各種機能とマッピング
ウィンドウを分割する
項目名 | デフォルト | オリジナル設定 |
---|---|---|
水平分割 | :split | ss |
垂直分割 | :vsplit | sv |
分割したウィンドウ間を移動する
項目名 | デフォルト | オリジナル設定 |
---|---|---|
左に移動 | <C-w>h | sh |
下に移動 | <C-w>j | sj |
上に移動 | <C-w>k | sk |
右に移動 | <C-w>l | sl |
次に移動 | <C-w>w | sw |
分割したウィンドウそのものを移動する
項目名 | デフォルト | オリジナル設定 |
---|---|---|
左に移動 | <C-w>H | sH |
下に移動 | <C-w>J | sJ |
上に移動 | <C-w>K | sK |
右に移動 | <C-w>L | sL |
回転 | <C-w>r | sr |
カレントウィンドウの大きさを変える
項目名 | デフォルト | オリジナル設定 |
---|---|---|
縦に最大化 | <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を参照してください。
タブページ関連
項目名 | デフォルト | オリジナル設定 |
---|---|---|
新規タブ | :tabnew | st |
次のタブに切替 | gt | sn |
前のタブに切替 | gT | sp |
閉じる
項目名 | デフォルト | オリジナル設定 |
---|---|---|
ウィンドウを閉じる | :q | sq |
バッファを閉じる | :bd | sQ |
Unite.vim
項目名 | デフォルト | オリジナル設定 |
---|---|---|
タブ一覧 | :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を貼っておきます。
nnoremaps<Nop>nnoremapsj<C-w>jnnoremap sk <C-w>knnoremapsl<C-w>lnnoremapsh<C-w>hnnoremap sJ <C-w>J
nnoremap sK <C-w>K
nnoremap sL <C-w>L
nnoremap sH <C-w>H
nnoremapsn gt
nnoremapsp gT
nnoremapsr<C-w>rnnoremaps=<C-w>=nnoremapsw<C-w>wnnoremapso<C-w>_<C-w>�|nnoremap sO <C-w>=nnoremapsN :<C-u>bn<CR>nnoremap sP :<C-u>bp<CR>nnoremapst :<C-u>tabnew<CR>nnoremap sT :<C-u>Unite tab<CR>nnoremapss :<C-u>sp<CR>nnoremapsv :<C-u>vs<CR>nnoremap sq :<C-u>q<CR>nnoremap sQ :<C-u>bd<CR>nnoremapsb :<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 : ;