【vimめも】 11. バッファとウィンドウ

# バッファとウィンドウ

**バッファ**とは、vimがファイルを読み込んだ後に
ファイル内容をコピーするメモリ領域のこと

**ウィンドウ**とはバッファの内容を表示するための表示領域のこと

通常のテキストエディタでは、バッファとウィンドウは1:1の関係のため意識することはないが
vimではバッファとウィンドウは別々に扱える

1度開いたファイルはバッファに残り、同じウィンドウに別のバッファを開くように切り替えるなども可能
そのため未保存の状態で、別バッファをいまのウィンドうに表示させることができ
後から保存したりすることができる

イメージするならば、**テレビ**と**チャンネル**のようなもので
テレビを消さない限りは、別チャンネルに切り替え操作することができる

1ファイル毎にvimを立ち上げるのは、チャンネル毎にテレビを複数台買うようなもの

１つのファイルを画面分割し複数箇所を確認しながら、編集なども行える

# バッファの操作

### 読み込み

既にバッファにあれば、同じものが使用され
バッファになければ新しく読み込まれる

`:e[dit] [file]` カレントウィンドウに指定したファイルを開く(バッファに読み込み)
`:sp[lit] [file]` カレントウィンドウから水平分割したウィンドウに指定したファイルを開く(バッファに読み込み)
`:vs[plit] [file]` カレントウィンドウから垂直分割したウィンドウに指定したファイルを開く(バッファに読み込み)

### 新規作成

`:ene[w]` カレントウィンドウに新しいバッファを作成する
`:new` カレントウィンドウから水平分割したウィンドウに新しいバッファを作成する
`:vne[w]` カレントウィンドウから垂直分割したウィンドウに新しいバッファを作成する

### 分割

同じバッファを分割した新しいウィンドウでも開く

`:sp[lit]` or `<C-w>s` or `<C-w><C-s>`
いま開いているバッファをカレントウィンドウを2つに水平分割し表示する

`:vs[plit]` or `<C-w>v` or `<C-w><C-v>`
いま開いているバッファをカレントウィンドウを2つに垂直分割し表示する

### 確認

`:ls`(`:buffers`や`:files`も同じ)で現在のバッファが確認できる

バッファには一意な番号と、バッファの状態を表す指標がある

**指標の見方**

<table><thead><tr><td colspan="5" style="text-align:center">指標</td><td rowspan="2">内容</td></tr><tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td></tr></thead><tbody><tr><td>u</td><td> </td><td> </td><td> </td><td> </td><td>リストされていないバッファ ([!] が使われたときのみ表示される) </td></tr><tr><td> </td><td>%</td><td> </td><td> </td><td> </td><td>カレントウィンドウにあるバッファ</td></tr><tr><td> </td><td>#</td><td> </td><td> </td><td> </td><td>":e #" や CTRL_^ で使われる代替バッファ</td></tr><tr><td> </td><td> </td><td>a</td><td> </td><td> </td><td>アクティブバッファ:ロードされていて、表示されている</td></tr><tr><td> </td><td> </td><td>h</td><td> </td><td> </td><td>隠れバッファ:ロードされているが、現在はウィンドウに表示されていない </td></tr><tr><td> </td><td> </td><td> </td><td>-</td><td> </td><td>'modifiable' がオフのバッファ</td></tr><tr><td> </td><td> </td><td> </td><td>=</td><td> </td><td>リードオンリーのバッファ</td></tr><tr><td> </td><td> </td><td> </td><td> </td><td>+</td><td>変更のあるバッファ</td></tr><tr><td> </td><td> </td><td> </td><td> </td><td>x</td><td>読み込みエラーのあるバッファ</td></tr></tbody></table>

`:ls`で確認する際に、指標を指定することで表示対象を絞ることができる（指標は複数指定可能）

```vim
" 未保存の非表示バッファ
ls h+
```

### 切り替え

`:[N]b[uffer] [N]` 指定した番号のバッファを現在のウィンドウに表示させる

```vim
" どちらでも可能
:3b
:b 3
```

`:sb[uffer] [N]` ウィンドウを分割し指定した番号のバッファを表示させる

### 削除

`:bd[elete][!] [N]` バッファをメモリから取り除き、バッファリストから削除する（編集中の場合は失敗する）
編集中のものも強制的に削除するさいは`!`を付ける

削除したバッファを表示しているウィンドウはすべて閉じられる

    実際は、バッファは完全に削除されていない。バッファリストから削
    除され 、バッファに対するオプションの値、変数、マッピング・略語が消去される。

```vim
" 指定したバッファを削除
:bd 3

" 指定したバッファを強制削除
:bd! 2

" 複数指定でまとめて削除(6と8を削除する)
:bd 6 8

" 範囲を指定して削除(6~8が削除される)
:6,8bd

" すべてを削除
:%bd
```

完全にバッファをメモリから取り除く`:bw[ipeout][!]`があるが、理解していない人は使わないほうがよいらしい

    bw[ipeout][!]

    :bdelete に似ているが、本当にバッファを削除する。このバッ
    ファに関するすべてが失われる。例えば、このバッファ中のすべての
    マークが無効になり、オプション設定が失われるなど。このことの意
    味がわからなければ使わないこと。


# ウィンドウの操作

### 閉じる

`:q[uit]` or `<C-w>q` or `<C-w><C-q>`
ウィンドウを閉じる。最後のウィンドウを終了するとvimも終了する

### カーソル移動

カーソルをカレントウィンドウからの相対位置に移動する

`<C-w>j` or `<C-w><C-j>`
下に移動

`<C-w>k` or `<C-w><C-k>`
上に移動

`<C-w>h` or `<C-w><C-h>`
左に移動

`<C-w>l` or `<C-w><C-l>`
右に移動

---

カーソルを絶対位置に移動する

`<C-w>t` or `<C-w><C-t>`
1番左上に移動

`<C-w>b` or `<C-w><C-b>`
1番右下に移動

### ウィンドウ移動

`<C-w>J` カレントウィンドウを最下段に移動する
`<C-w>K` カレントウィンドウを最上段に移動する
`<C-w>H` カレントウィンドウを最左列に移動する
`<C-w>L` カレントウィンドウを最右列に移動する

`<C-w>r` ウィンドウ位置を下・右へ回転させる
`<C-w>R` ウィンドウ位置を上・左へ回転させる

### ウィンドウのサイズ変更

`:res[ize] +[N]` カレントウィンドウの高さを指定した行数分増加させる
`:res[ize] -[N]` カレントウィンドウの高さを指定した行数分減少させる

`:res[ize] [N]` カレントウィンドウの高さを指定した行数分にする（省略すると最大まで）
`:vertical res[ize] [N]` カレントウィンドウの幅を指定した桁数分にする（省略すると最大まで）

---

`<C-w>+` カレントウィンドウの高さを1行分増やす
`<C-w>-` カレントウィンドウの高さを1行分減らす

`<C-w>>` カレントウィンドウの幅を1桁分減らす
`<C-w><` カレントウィンドウの幅を1桁分増やす

例)
`10<C-w>+` のように複数回分指定することもできる

`<C-w>_` or `<C-w><C-_>`
カレントウィンドウの高さを最大までにする

`<C-w>|`
カレントウィンドウの幅を最大までにする

`<C-w>=`
すべてのウィンドウの高さ・幅を同じにする
ただし、カレントウィンドウは`winheight` `winwidth`オプションに設定されているサイズになる

前回: [【vimめも】 10. マッピング](https://qiita.com/r12tkmt/items/b89df403f587216802f1)

次回: [【vimめも】 12. タブ](https://qiita.com/r12tkmt/items/a5ae637d5c73b0da03e0)