vi自分用メモ

# vi自分用メモ

- [編集効率を上げるTips](#編集効率を上げるtips)
- [トラブル対応](#トラブル対応)
- [似たようなコマンドの違い](#似たようなコマンドの違い)

　viを使うにあたり、自分が忘れそうだったり調べたことをまとめる文書。
　なお、viの操作を体系的に学びたい場合は[入門vi 第6版](http://amzn.to/2oXNCRD)がとても詳しいので、そちらをお勧め。



## 編集効率を上げるTips

### 空白を含む検索

　シングルクォートまたはダブルクォートでくくる。

- `/'hoge hoge'`
- `/"hoge hoge"`

　あるいは空白をバックスラッシュする。

- `/hoge\ hoge`


### vi編集中にUNIXコマンドを実行したい

　コロンに続けてUNIXコマンドをタイプすることで実行可能。

　`:sh`でシェルを実行することもできる

　任意の行をコマンドの入力として渡して、出力結果で入替ることも可能。`:1,4!sort`とすると1～4行目を`sort`に渡して、その4行を`sort`の出力と入替る。




### しおりを挟めたい
|コマンド     |効果                                                                |
|:-----------:|:-------------------------------------------------------------------|
| `m`_x_      | 現在の位置に_x_というマークをつける（_x_は任意の**1**文字）        |
| `'`_x_      | （シングルクォート）＋_x_で、_x_とマークした行の先頭にカーソル移動 |
| `` ` `` _x_ | （バッククォート）＋_x_で、_x_とマークした文字にカーソル移動       |
| ``` `` ```  | （バッククォート2個）移動して直前のマークまたは文脈の位置に戻る    |
| `''`        | （シングルクォート2個）直前のマークまたは文脈のある行の先頭に戻る  |


### 単語の略記

　単語の省略形を登録し、それをタイプすると自動的に展開されるようにできる。

``` sh:書式
:ab abbr phrase
```

- abbr：phraseの省略形　（※phraseに登場する文字列を避けたほうがよい）
- phrase：任意の文字列

　入力例は次の通り。

``` sh:例
:ab sugdwb super ultra great delicious wonderful bomber
```

|キー入力 |展開された結果                                |
|:-------:|:---------------------------------------------|
| sugdwb  | super ultra great delicious wonderful bomber |

　単語の略記の注意点について。

- `:unab ` _abbr_ とすることで、_abbr_が展開されることを防ぐ
- `:ab` とだけすると、現在定義されている省略形の一覧表示
- 略記したいフレーズの末尾にある文字列は省略形として使えない
- 略記したいフレーズに含まれる文字列は省略形として使えたり使えない場合があるが、なるべく使わない


### キーマッピング

　奥が深いので、おすすめのキーマッピングに乗ってしまうのがよさそう。

- [Vimのキーマッピングを書いた \- Qiita](http://qiita.com/mizukmb/items/ddb5a5bfa2ce223057cb)
- [Vim入門\(3\): Vimのおすすめの基本設定 \| Simplie Post](http://post.simplie.jp/posts/57)
- [【図解Vim】mapとnoremap \| ここぽんのーと](http://cocopon.me/blog/?p=3871)
   - mapとnoremap の違いの説明が非常によく分かりやすかった。普段使いする分にはnoremapでよさそう。


### ctagsの利用

　どのファイルにどの関数定義が入っているのか把握するのが大変なので、ctagsコマンドと:tagコマンドの組み合わせで確認できるようになっている。
　これまたよくまとまったリンクがあるためそちらを利用。

- [ctagsをちゃんと使う \- Qiita](http://qiita.com/soramugi/items/7014c866b705e2cd0b95)


### ウィンドウ分割

　`:split`でウィンドウが分割され、Ctrl+wを2回押すことでウィンドウ間を移動できる


### 制御コードを入力したい

　Ctrl+vに続けて、Ctlr+（[制御コード対応アルファベット](http://ash.jp/code/ctrltbl.htm)）。
　たとえば、Line Feed（LF）を入力したいときはCtrl+vに続けて、Ctlr+jとするとよい　


### 制御コードを表示させたい

　Vimであれば`:set list`コマンドで表示可能。制御文字を特定の文字で置き換えて表示したい場合は、`:set listchars`コマンドで可能。

``` Vim:listcharsの例(改行を表示)
set listchars=eol:↲
```



## トラブル対応

### 編集を保存できない場合

　なぜ保存できないのかを確認したうえで、編集内容を保持したい場合に利用。

- `:w!` _file_	……	既存のファイルに上書きしたいとき
- `:w!` _newfile_	……	新規ファイルに転記
- `:pre`	……	バッファを強制的にセーブ



## 便利なコマンド・オプション

### 便利な起動オプション（抜粋）

| コマンド                 | 効果                                                                                          |
|:------------------------:|:----------------------------------------------------------------------------------------------|
| $ `vi` _+n file_         | n行目の位置でファイルオープン                                                                 |
| $ `vi` _+ _file_         | 最終行の位置でファイルオープン                                                                |
| $ `vi` _+/pattern _file_ | 最初に_pattern_が見つかった位置でファイルオープン                                             |
| $ `vi -R` _file_         | 読み込み専用で開く。 $ `view` _file_も同様。変更結果を保存したくなった場合は `:w!`で保存可能` |
| $ `vi -r`                | システムが保存してくれているファイル（バッファ）の一覧表示                                    |
| $ `vi -r` _file_         | _file_の編集バッファを指定して復旧                                                            |


### 便利なコマンド（抜粋）

|コマンド|効果                                                                                 |
|:------:|:------------------------------------------------------------------------------------|
|`J`     | 現在の行と次の行を連結する。`3J`とすると3行分（現在の行、次の行、その次の行）を連結 |


### gコマンドの面白い使い方

　ファイルの1・2行目をファイルの末尾に10回コピー

	:1,10g/^/ 1,2t$



## 似たようなコマンドの違い

### e!とq!の違い

　どちらも編集内容を帳消しにするが、以下の点が異なる。

|コマンド|効果                                                           |
|:------:|:--------------------------------------------------------------|
|`:e!`   | 編集内容を帳消しにして、最後に保存されたファイルを読み込み直す|
|`:q`    | 編集内容を帳消しにして、そのままviを終了させる                |

　vi hoge.txt などとして、しばらく編集した後「保存せずに」上記コマンドをそれぞれ実行すると違いが分かる


### ddとDの違い
|コマンド|効果                                        |
|:------:|:-------------------------------------------|
|`dd`    | 行全体を削除する                           |
|`D`     | カーソル位置から行末（改行除く）を削除する |

　行の途中でそれぞれのコマンドをタイプしてみると違いがよく分かる。


### `:s` のgオプションの有無について

　以下文字列を`:s/hoge/fuga/`にて変更すると、次のようになる。

``` vi:変換前
hoge hoge fuga fuga
```

``` vi:変換後
fuga hoge fuga fuga
```

　`:s/hoge/fuga/g`とすると、次のようになる。

``` vi:変換前
hoge hoge fuga fuga
```

``` vi:変換後
fuga fuga fuga fuga
```