新人さんに贈るvim入門一歩前。

ネタが尽きればvimを語る。
===
負荷試験の傍しこしことアドベントカレンダーを埋めてます。
古今東西vim使いなれば、記事に困ればvimについて書くのが決まりのようなもので(あるいは最終手段)、それに習って今日もvim記事です。

[ソニックムーブ](https://www.sonicmoov.com/)のバックエンドは基本的にPHPを使っているのでエディタは大抵Phpstormを使用しています。
なので新卒や未経験で入社された人だとあまりvimを触ることがなく、いざサーバ作業のときにvimの操作がおぼつかないということがあります。
今回はそんな普段IDEしか使わない人が(サーバ作業などで)仕方なくvimを使わざるを得ないときに、最低限これだけ知っているとイライラも少しは減るのでは？(そして気づけばvimに染まるのでは？)といったライトなトピックスをお送りします。

はじめにまとめ。
===
仕方なくvimを使わざるを得ないという際は以下のコマンドが使えればとりあえずファイルの編集はできると思います。

## コマンドラインで。
`vim {file path}` ファイルをvimで開く

## vim内で。
`i` 文字入力を始める(カーソル位置一文字前から)
`a` 文字入力を始める(カーソル位置一文字後から)
`esc` 文字入力を終わる
`v` 範囲選択
`u` アンドゥ
`crtl + r` リドゥ
`y` コピー
`p` ペースト
`:w` 保存
`:q` 終了
`:q!` 編集を保存せず終了

こまったら　`esc` 連打してノーマルモードに戻ろう。

**`shift + q` は押さない！！**

以下では上記コマンド+aをある程度細かく紹介していきます。

vimで開く。
===
`vim {file path}` で指定のファイルが開けます。
多くの環境では `vi {file path}` でも開けます。
ただ、たまにviはないよって怒られることもあるので `vim` で開いたほうが確実です。

vimでカーソル移動する。
===
基本はカーソルキーで問題ないです。
まれにカーソルキーが使えない環境もあるのでその場合は `h` `j` `k` `l` がそれぞれ左下上右に対応します。

## 発展。
`jjjjjjjjjjj...` あるいはカーソル下押しっぱなしなりで多数行移動していると「vimめんどくさいなあ、なんで画面スクロールできないんだ」とイライラするかもしれません。
そんな時は以下のコマンドでイライラを解消できるかもしれません。

`ctrl + d` 半画面分下へ
`ctrl + u` 半画面分上へ

`ctrl + f` 1画面分下へ
`ctrl + b` 1画面分上へ

## 余談。
実はスクロールできます(マウスの真ん中コロコロではないですが)
`ctrl + e` 下へスクロール
`ctrl + y` 上へスクロール

vimで文字入力する。
===
vimを普段使いしない方が一番戸惑うのはモードの概念だと思います。
だいたい代表的なモードとして

- ノーマルモード
- インサートモード
- ビジュアルモード
- exコマンドモード

の4つが挙げられます。
が、ときどき(サーバ作業などで)使わざるを得ない時くらいしか使用しないのであれば

- ノーマルモード (開いた時点の基点となるモード)
- インサートモード

の2モードだけ意識すればよいと個人的に思います。
というのも他の2つはそのモードに入ったときもそこまで意識せずノーマルモードに戻れます。
それと比べるとインサートモードは多少扱いにくさを感じるかと思います。

ノーマルモードはファイルを開いた時にいるモードです。
紹介している操作は基本的にノーマルモードでの実行を想定しています。
基本的にはこのモードを介して他のモードへ遷移します。

インサートモードは文字を入力するためのモードです。
このモードにいる際は他のテキストエディタのように文字入力ができます。
最初のうちはたぶんこのモードに滞在している時間が長いと思います。
インサートモードへ入るためには以下のコマンドを使用します。

`i` カーソル位置の1文字前から入力
`a` カーソル位置の1文字後から入力

どちらもインサートモードへ入るコマンドですが入力開始位置が異なります
例えば以下の文書のdの位置にカーソルがあるとします。

```
abcdefg
```

その際 `i` あるいは `a` でインサートモードへ入ったのちに!を入力した場合それぞれ以下のようになります。

```
# iでインサートモードに入った場合
abc!defg

# aでインサートモードに入った場合
abcd!efg
```

入力開始位置がカーソルの前か後ろかという差があるので行頭行末に文字を追加したい時は意識するとよいかと。

インサートモードからノーマルモードに戻るには `esc` で戻れます。

## 発展。
`o` 今いる行の下に新しい行を挿入し、その行の先頭から入力
`shift + o` 今いる行の上に新しい行を挿入し、その行の先頭から入力

vimでアンドゥ・リドゥ。
===
`u` でアンドゥ、 `ctrl + r` でリドゥができます。
戻る編集単位はコマンド単位になります。
`i` や `a` などでインサートモードに入って入力した文字をアンドゥ・リドゥする場合は `esc` でノーマルモードに戻るまでが1単位になるので注意が必要です。

vimでコピペ。
===
vimではコピー&ペーストではなく、ヤンク&ペーストです。
yankにはぐっと引っ張るという意味があるそうです。今知りました。

`y` というコマンドでヤンクできます。
がこのコマンド、これ単体だと機能しません。
`yy` と二回続けると今いる一行をヤンクできます。

しかしもう少し狭い範囲をヤンクしたいことも多々あるかと思います。
そんな時は `v` コマンドとカーソルキーを組み合わせて範囲を指定してから `y` を押せば希望の範囲をヤンクできます。

<img width="752" alt="スクリーンショット 2017-11-27 17.24.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/75617/00a2ff5e-5ab3-6aa2-146a-3842ebdd71bb.png">

画像の例はJの位置にカーソルを持ってきた状態から `v` を押して続けてMの位置までカーソルを移動させました。
ここで `y` を押せば `JKL M` という文字列がヤンクできます。

ヤンクした文字列は `p` でペーストできます。
ペースト位置はカーソルの一文字後です。
また `shift + p` の場合だと一文字前にペーストします。
(行単位でヤンクした場合はそれぞれ一行上、一行下になります)

vimでファイル保存・編集終了。
===
`:w` で編集の保存ができます。
`:q` でファイルを閉じます。　注意として、保存前のファイルは `:q` で閉じることができません。
もし編集をなかったことにしてファイルを閉じたい場合は `:q!` でできます。

またこれらのコマンドはまとめることができるので `:wq` とすれば保存して終了と処理をまとめることができます。
入力された順で処理されるので `:qw` だとエラーになります。(終了してから保存しようとしてる)

補足。
===
大抵のモードからノーマルモードに戻る、あるいは大抵のコマンドを途中でなかったことにしたい場合は `esc` を何度か押せば叶います。
なにかおかしいと思ったらビーブ音がなるまで `esc` 連打でとりあえずノーマルモードまで戻って落ち着きましょう。

ただし `shift + q` で移行するexモードだけは `esc` が効きません。
初めの頃は間違って入力してしまってやむなく `:q` でファイルを閉じたものです。 (`:vi` でノーマルモードに戻れます)
少なくとも初めのうちは使うことはないと思いますので、自身のマシンであればvimrcからキーマッピングを潰してしまうのも手だと思います。
自分はそうして今も潰したままです。
(vimrcについては気になれば調べてみてください)

〆
===
なれるまではなかなか扱いづらいエディタだと思います。
その割にバックエンドエンジニアであれば避けてはいられないツールなので、最低限の操作ができるレベルになって損はないです。

あなたのvim道に幸あれ。

*
*
*

この記事は 株式会社ソニックムーブ Advent Calendar 2017 12日目の記事です。
アドベントカレンダーはこっち。 -> https://qiita.com/advent-calendar/2017/sonicmoov
ソニックムーブについてはこっち。 -> https://www.sonicmoov.com