vim 初心者が使ってて便利だと思ったコマンドをまとめておく


# はじめに
vi / vim を使い始めてまだ数ヶ月の初心者ですが、ここ数ヶ月、テキスト編集やスクリプト作成等にvim を使うようにしてました。
そんな初心者がvim すげーと思い始めてきたので、使ってて便利だと思うコマンド達をまとめておこうと思います。

# カーソル操作

### 
* `h, j, k, l` で順に左、下、上、右へ移動。
    * それぞれ前に数字をつけることで、その文字数 / 行数移動できます。
* `0`で行頭に移動、`^`でインデントを除いた行頭に移動、`$`で行末に移動。
* `Ctrl-u`で半ページ上へ移動、`Ctrl-d`で半ページ下に移動。
    * up とdown で覚えやすいし使いやすいです。
    * この2つがあれば1行とか1ページとかスクロールするコマンドは使わないです（個人的に）。
* `gg` でファイルの先頭に移動、`G` でファイルの最後に移動。
* `:<数字>`で数字の行に移動。`<数字>G` でも数字の行に移動。
* `b` でカーソル上の単語の先頭に移動、`w` でカーソル上の単語の次の単語の先頭に移動。
* `f<文字>` で同じ行で順方向の文字の部分に移動。`F<文字>` で逆方向に移動。
  * 同じ行に検索文字が複数ある場合、`;` で順方向、`,` で逆方向に繰り返し移動。

`Ctrl-d`とか`Ctrl-u`みたいなページ送りはスクロールが滑らかになるプラグイン入れるといい感じです。
自分は[accelerated-smooth-scroll](https://github.com/yonchu/accelerated-smooth-scroll) 入れてます。


# モード切り替え
### ノーマルモード -> インサートモード
* `i`か`a`でノーマル->インサートへの切り替え。
* ノーマルモードで`o`で選択行の下に空行を入れ、インサートモードへ切り替え。
* `O`で選択行の上に空行を入れ、インサートモードへ。
* `s` でカーソル上の文字を1文字削除してインサートモードへ。
* `ci"` で""の中身を削除してインサートモードへ。HTML とかのタグ上で`cit` と打つと、タグの中身を削除してインサートモードに。
* `cw` でカーソル上の単語のカーソルから右部分を削除してインサートモードへ。単語の先頭への移動`b` と合わせて`bcw` とすることで、カーソル上の単語を削除してインサートモードへ(`ciw` も同じ)。

最初は`i` `a`ばっかり使ってました。
`o` `O`の2つがめちゃ便利でよく使います。
単語とかを削除しながらインサートモードへの切り替えも使いやすくてベネです。

`o` は便利なんですが、インサートモードにならずに空行挿入のみを行いたい時も多いので、以下の設定をしています。

```~/.vimrc
noremap <Space><CR> o<ESC>
```
コレでスペース+エンターキーを押すだけで`o`+`Esc` を行ってくれて便利です。

### インサートモード -> ノーマルモード
* `Esc` 、`Ctrl-[`、`Ctrl-c`
 
`Ctrl-c` は打ちやすくて便利です。
`.vimrc` の編集が必要ですが、`jj` を`Esc` に割り当てておくとかなり捗ります。  

```~/.vimrc
inoremap <silent> jj <ECS>
```

### ノーマルモード -> ビジュアルモード
vim でのテキスト選択機能。
最初はテキスト選択にいちいちモードなんてめんどくさいと思ってましたが、ビジュアルモードではいろいろできて便利です。

* `v` で普通にビジュアルモード、`V (Shift-v)` で行単位で選択、`Crtl-v` で矩形選択

選択してから文字列操作をできますが、上記三種類を使い分けることでいろいろできて便利です。
縦に矩形選択後`I` でインサートモードに、何か入力後に`Ecs` を押すことで、入力内容が複数行に反映されます。
複数行にまとめて何かを追加したい時に便利です。


# 文字列操作
### 検索
* `/<検索したい文字列>`で後方検索、`?<検索したい文字列>`で前方検索。
    * 検索結果は`n`で順方向にジャンプ、 `N` で逆方向にジャンプ
    * 検索した後のハイライトは`:noh` で消せます。

### 置換
* `:%s/<置換前>/<置換後>/` または `:%s/<置換前>/<置換後>/g`
    * `g` オプションがあると1行中に複数`<置換前>`が存在する場合、すべて置換してくれまう。
* `:<開始行>,<終了行>s/<置換前>/<置換後>/g`とすることで、開始行から終了行の間までで置換。
    * 個人的に行数を指定したものの方がよく使います。

### 削除
* `:%s/<置換前>/<置換後>/` または `:%s/<置換前>/<置換後>/g`
* `dd` でカーソル行の削除。`:<開始行>,<終了行>d` で開始行から終了行まで削除。
    * ビジュアルモードで範囲選択、`d`で範囲選択部分の削除もできます。
* `D` でカーソル行のカーソル位置から行末までを削除。
* `x` でカーソル上の文字を削除。
    * `<数字>x`で数字分野地削除。
* `dw` でカーソル上の単語削除、`di"`や `dit`で""内、HTMLタグ内を削除。
    * 上の方に書いてる`ci`と違ってインサートモードにならずに削除できます。



# その他

* `u` でアンドゥ、`Ctrl-r` でリドゥ。
* `:tabnew` で新規タブを開く。
    * `gt`、`gT` でタブ間の移動。
* `>>` でインデント、`<<` でその反対(インデントの反対って何ていうんでしょうか)。
* `.` で直前の操作の繰り返し。
* `Ctrl-n` 、`Ctrl-p` で補完（単語入力中にこのコマンドで続きの候補を表示してくれます）
* `<数字><コマンド>`で数字の数だけコマンドを繰り返します。

タブ機能が結構便利です。
自分はタブ開いたりタブ間を移動したりに以下のキーをマッピングしています。

* ノーマルモードでスペースを押し、`c` 入力でタブを開く
* `Ctrl-n` で次のタブ、`Ctrl-p` で前のタブを開く

tmux っぽくタブ操作できるので使いやすくなります。


```~/.vimrc
nnoremap <Space>c  :tabnew<CR> 
nnoremap <C-n> gt
nnoremap <C-p> gT
```

タブ機能は[NERDTree](https://github.com/scrooloose/nerdtree) と一緒に使ってます。
`Ctrl-n` とかの補完は最初はよく使っていましたが、[neocomplete](https://github.com/Shougo/neocomplete.vim) 導入後はほとんど使わなくなりました。


# 終わりに
書いているうちに思ってたよりだいぶ長くなりました。
また後で見直した時にvim レベルが上がってたらなーと思います。
.vimrc の設定とかプライグインについてとかもメモっておこうと思っていましたが、また気が向いた時にでも書こうと思います。