はじめてのvim 基本の動作まとめ

vim初心者のため、使い方に慣れるための自分用のメモになります。
（ざっくりとまとめているため間違っている場合はご指摘いただけますと幸いです。。。）

# vimとは・・・
UNIX系のエディターのこと
慣れると色々とパワフルに動いてくれるものらしい（？）
（早く使いこなせるようになりたい。。。）

# vimのモード説明
<dl>
<dt>ノーマルモード</dt>
<dd>vim起動してすぐの状態</dd>
<dt>インサートモード</dt>
<dd>[i]を入力でインサートモードになる。<br>
通常のエディタ同様に文字を入力できるようにした状態。<br>
[esc]キーでノーマルモードに戻る。</dd>
<dt>コマンドモード</dt>
<dd>コロン[:]を入力でコマンドモードになる。<br>
[esc]キーでノーマルモードに戻る。</dd>
<dt>ビジュアルモード</dt>
<dd>[v]を入力でビジュアルモードになる。<br>
エディタ内を選択できるようになる。<br>
[esc]キーでノーマルモードに戻る。</dd>
</dl>

# vimの起動と終了
ターミナルから`＄viｍ`で起動。
`$vim ファイル名`でvimの起動と同時にファイルを開くこともできる。
```vim:例
$vim index.php
```
終了するときは、コマンドモードで`：ｑ`を入力する。

#### 補足
`＄vimtutor`で日本語のチュートリアルを表示できる。

# ファイルの保存と読み込み方法
インサートモードでファイルを編集後、コマンドモードでファイルを操作するときに使えるコマンド

* ファイルの保存
`:w` ・・・　上書き保存　
`:w 新規ファイル名` ・・・　名前をつけて保存する。
`:wq` ・・・　保存して終了する。
`:q!` ・・・　変更を無視して強制終了

* 別のファイルを開く
`:e ファイル名` ・・・　編集するファイルを変更することができる。

# カーソルの移動
ノーマルモードでカーソルを移動させたいときに使えるコマンド

* `▲▼◀︎ ▶︎`（もしくは`kjhl`）　・・・　カーソルキー上下左右の移動 
* `gg`/`G`　・・・　先頭/末尾の移動
* `^`/`$`　・・・　行頭/行末の移動
* `CTRL+b`/`CTRL+f`　・・・　1画面単位の移動 (上/下)
* `b`/`w`　・・・　単語単位の移動(左/右)
* `f 文字` ・・・　任意の文字まで移動
（補足）例えば、「abcabc」の「c」に行きたい場合、f+cで移動できる。
　　　　`;`で次の「c」に移動する。
* `%`　・・・ 　プログラム中に対応するかっこまで移動

# 選択について
ビジュアルモードでの便利なコマンドについて

* `v` ・・・　小文字、通常のビジュアルモード。
* `V` ・・・　大文字、ビジュアルラインモード、行選択ができる。
* `CTRL+v` ・・・　ビジュアルブロックモード、矩形選択ができる。
* `gg` `V` `G` ・・・　先頭から末尾までを一括選択できる。

ビジュアルモードと編集を組み合わせることもできる。

* `CTRL+v`で矩形選択後、`shift+i`でインサートモードで文字を入力し、`ESC`キーを押すと矩形選択した箇所に一括で文字を挿入することができる。

# カット、コピー、貼り付けについて

* `x` ・・・ 1文字単位でカット
* `dd` ・・・ 1行単位でカット
* `数字 dd` ・・・ 複数行単位でカット（5dd とすると5行まとめてカット）
* `yy` ・・・ １行単位でコピー
* `数字 yy` ・・・ 複数行単位でコピー
* `p` ・・・ 貼り付け

また、カットやコピーした操作を繰り返したい場合は、
ノーマルモードで`.`ピリオドを打つと直前で行った操作を繰り返すことができる。

# 検索について

* `/ 検索文字` ・・・ ノーマル検索(/hello とするとhelloが検索できる)
* `N`/`n` ・・・ 上方向に検索/下方向に検索
* `#`/`*` ・・・ カーソル位置の単語を検索できる（上/下）

#### 補足
コマンドモードで`:set ignorecase` を設定しておくと、小文字大文字区別せず検索できるようになる。`:set noignorecase`で解除できる。

# 置換について
コマンドモードで文字の置換ができる。
fooをbarに置換したい場合下記のようにする。

* `:s/foo/bar` ・・・ カーソル位置の1箇所置換
* `:s/foo/bar/g` ・・・ カーソル位置の行を置換
* `:%s/foo/bar/g` ・・・ 全行全て置換
* `:%s/foo/bar/gc` ・・・ 置換前に全ての箇所を確認する。

# 操作の取り消しについて

* `u` ・・・ UNDO処理
* `CTRL+r` ・・・ REDO処理

# 画面の分割について
コマンドモードでウィンドウの分割を行い、複数のファイルを並べて見ることができる。

* `:sp` ・・・ 上下に分割する。
* `:vs` ・・・ 左右に分割する。
* `:close`  ・・・ 分割画面を閉じる。

画面間は、`CTRL+w`で移動することができる。

タブエディターのようにタブ表示をすることもできる。

* `:tabnew` ・・・ 新規タブ表示
*  `:tabe ファイル名` ・・・ タブ表示するファイル名が分かっている場合
*  `:tabclose` ・・・ タブを閉じる。

タブ間は、`gt`で移動することができる。

# インデントを揃える&便利なコマンドモード設定

インデントを揃えてコードを見やすくするための方法
ノーマルモードからコマンドを入力する。

* `=` ・・・ カーソル位置のインデントを揃える。
* `gg` `V` `G` `=` ・・・ 先頭から末尾まで全選択して、全てのインデントを揃える。

#### 補足
:::note warn
OSによっては、~/.vimrc ファイルに

```vim:~/.vimrc
:filetype indent on
```
という記述がないと、インデントがきかない場合があるらしい。。。

（.vimrc ファイルが存在しない場合は、ホームディレクトリに「.vimrc」というファイル名で作成する。）
:::

その他、コマンドモードから便利な設定ができる

* `:set number` ・・・ 画面に行番号を表示できる。
（`:set nonumber` で非表示）
* `:syntax on` ・・・ テキストをシンタックス表示にできる。
（ `:syntax off` で非表示）
* `:set tabstop=4` ・・・ テキスト内のタブ数を制限できる。

# 補完機能について

テキスト内の変数や関数名を補完してくれる機能
インサートモードで変数名等を途中まで入力し、`CTRL+n`を打つと補完予測された候補が表示される。

# テキストオブジェクトを扱う

テキスト内のタグの中身だけ変更したり、"で囲まれた文字列を変更したりする方法について。
ノーマルモードから1〜3のコマンドを組み合わせて、挿入まで行うことができる。
(ここら辺はまだよく分かっていないので、メモ書き程度になります。。)

1.  `c` or `d` or `y` ：c = change(delete & inssert)
1.  `i` or `a` ： inner or all → タグ内かタグ含め全部か
1.  `t` or `"` or `)` or `]` ： タグやオブジェクトの種類を選ぶ

例えば、titleタグにカーソルを合わせて`cit`とコマンド打つと、タグの中身だけ変更できる
```diff_html
<head>
  <meta charset="UTF-8">
  - <title>タイトル</title>
  + <title>ここが変えられる</title>
</head>
```
`cb`/`cw`のように単語単位で削除しつつインサートモードで書き換えすることもできる。