Vimが難しいって固定概念をあなたの中から無くします

## はじめに
- 本記事は知識０の初心者がvimtutorで基本的なことを学び、実際にVimエディタを使いQiita記事を書くまでの挑戦記です
- 本記事ではVimtutorを学習してきた中でぶつかった
エラーについて解説していきます
学習内容
  - 1日目vimtutorで基本的な操作をインプット
  - 2日目Qiita記事作成

この記事を読むことで得られるもの
[Vimエディタが最低限使えるようにならないといけない理由](#なぜvimエディタを学ぶべきなのか)
[Vimエディタが使えるようになる基本的なコマンド](#vim超基本コマンド)
[出会ったエラーの説明・解決策](#エラー対応)  


## なぜVimエディタを学ぶべきなのか?
**開発者にとって「Vim」は使えなければならないエディタです**
記事を読んでくれている方の中に最近は「VScode」「cursor」のようなリッチなエディタを使えば「Vim」なんて必要ないって思っている人も少なくないと思います。
その考え、ちょっとまった！！
もし「VScode」「cursor」のようなエディタが使えなかったら？
そんな環境にで開発しないといけなくなった場合みなさんはどうしますか？
「そんな環境無いよ」って思っていませんか？

実は「VScode」「cursor」が使えない。そんな環境は存在します。
「VScode」「cursor」が使えない環境で
一番身近にあるのはサーバー構築環境です。

**サーバーのOSにはWindowsでもmacOSではなく、
多くの場合Linuxが使用されます。**

このLinuxと呼ばれるOSは軽量で作くられているため
とことん無駄は省いてありGUI環境がありません。
GUI環境が無いということは
「VScode」「cursor」を使用することはできません。
ここで登場するのが「Vim」です。「Vim」はGUIを持たないエディタです。
サーバーの構築は開発者にとって避けては通れません。
だから「Vim」を学ぶ必要があります。



## Vim超基本コマンド
それではVimの基本コマンドについて紹介します。<br>
### 移動コマンド

|コマンド|効果|
|:---------|:----|
|h|カーソルを左へ|
|j|カーソルを下へ|
|k|カーソルを上へ|
|l|カーソルを右へ|

今まで使ってきたエディタで上記のようにカーソルを動かすエディタがあったでしょうか？
初めからいきなりくせがある操作になっていますが、これはなれるしか無いでしょう。逃げずに**何度も使って行くことをおすすめします。**


### Vimのモードと移行コマンド

|名前|できること|移行コマンド|
|:--------|:---------|:----|
|NormalMode|コマンド入力（カーソルの移動、他のモードへ移行）|ESC|
|InsertMode|テキストの入力、編集|i/a/A/c|
|VisualMode|テキストや行の選択|v|


### 入力と保存コマンド

|コマンド|効果|
|:---------|:----|
|i|カーソルの位置からinserModeに入る|
|a|カーソルを１つ進めた位置からinsertModeに入る|
|I|カーソルのある行の最初にinsertModeで行く|
|A|カーソルのある行の最後にinsertModeで行く|
|o|カーソルの位置のひとつ下に行を挿入しinsertModeに入る|
|O|カーソルの位置のひとつ上に行を挿入しinsertModeに入る|
|:q|実行中のファイルと閉じる|
|:w|ファイルの保存(⌘ + s)|
|:x|変更があれば保存して終了|
|:xa|変更があるタブを保存して全てのタブを閉じる|
|:!w|!マークを付けることでその操作を強制することができる|

※:wqのようにコマンド組み合わせて使うこともできる


### 削除・置き換え・コピーコマンド
大前提：d~ →削除（モード移行なし）c~ →置き換え(削除してInsertModeに移行)

|コマンド|効果|
|:-------|:-------------|
|x|カーソルがある文字１文字を削除|
|dd|カーソルがある行をすべて削除|
|dw|カーソルより右に有る1単語を削除 例test eの部分で実行するとtのみ残る|
|daw|カーソルの1単語を削除 例test eの部分で実行すると全て消える|
|D|カーソル位置から末尾まで削除|
|c|VisualModeで選択されている範囲を置き換え|
|cw|カーソル位置から単語の末尾までを置き換え|
|c0|カーソル位置から行頭まで置き換え|
|c$|カーソル位置から行末まで置き換え|
|cc|行全体を置き換え|
|ci+(,{,"|(,{,"の囲まれた部分のみを置き換え|
|cit|HTMLのタグの中を置き換え 例<div>こんにちは</div>こんにちはの部分が置き換えられる|
|r{char}|カーソルの位置の一文字を{char}で置き換える|
|R{text}|{text}に入力されて文字で上書きする|
|y|選択されてテキストをコピーする|
|yy|カーソルがある行を全てコピーする|


### カーソル移行

|コマンド|効果|
|:-----|:------|
|$|行末に移動|
|0（ゼロ）|行頭に移動|
|gg|ページの一番上に行く|
|G|ページの一番下に行く|
|:{num}|{num}に入力された行に行く|
|H|表示されている画面の一番上に行く|
|M|表示されている画面の真ん中に行く|
|L|表示されている画面の一番下に行く|


### カーソルの動きを絞る

|コマンド|効果|
|:----|:-----|
|w|カーソルの位置から1単語右へ進める（単語外）|
|e|カーソルの位置から1単語右へ進める（単語内）|
|b|カーソルの位置から1単語左へ進める（単語外）|

### 便利コマンド

|コマンド|効果|
|:------|:-------|
|/ {検索ワード} |{検索ワード}を検索する(⌘ + f)|
|n|/ {検索ワード}で検索したワードの次の候補に飛ぶ|
|N|/ {検索ワード}で検索したワードの前の候補に飛ぶ|
|u|直前のコマンドを取り消す（⌘ + z)|
|.|直前にやった作業を繰り返す|
|%|カッコがにカーソルがある時(カッコ初め　→　カッコ終わり)に飛ぶ。逆でも可能|
|*|カーソルが置いてある1単語を検索する（/testのtestがカーソルが置いてある1単語に置き換わる感じ）|
|CTRL-R|取り消しを取り消し|
|v+{移動キー}|範囲選択（+y,dでコピーや削除ができる）|
|ggVG|全て選択(⌘ + a)|
|U|選択した範囲の大文字小文字を切り替える|
|:!ls|ls等のLinuxコマンド（外部コマンド）を実行する|
|:e {編集したいファイル}|編集したいファイルを開いく|
|CTRL-D|補完する|
|m|m + (a~Z)で好きな行をマーキング ` + (a~Z)で飛べる|
|:help|ドキュメントの先頭を表示させる:help cとすることでcコマンドの説明を表示さる|
<br>

Vimにはなんと数百〜数千のコマンドが有るみたいです。初心者に全てを覚えろというのは無理な話です。
Vimを好んで使われているvimmerの方であってもコマンド全てを覚えている人はいないと思います。<br>
それにコマンドをたくさん知っていても使えないと意味がありません。
まずは上記で紹介した基本的なコマンド約60個を使って
ブログを書いたり、Qiita記事を書いたり、まずはVimは上級者のエディタと言う**固定概念を取り除いて触ってみること大切**だと思います。



## エラー対応
### エラーコード(E140:Use ! to write partial buffer)
日本語訳；を使用して部分バッファを書き込む(DeepL翻訳)
<br>
**いつ起きたエラー？？**
```vim.text
|/ {検索ワード} |{検索ワード}を検索する(⌘ + f)|
|n|/ {検索ワード}で検索したワードの次の候補に飛ぶ|
|N|/ {検索ワード}で検索したワードの前の候補に飛ぶ|
|u|直前のコマンドを取り消す（⌘ + z)|
|.|直前にやった作業を繰り返す|
|%|カッコがにカーソルがある時(カッコ初め　→　カッコ終わり)に飛ぶ。逆でも可能|
|*|カーソルが置いてある1単語を検索する（/testのtestがカーソルが置いてある1単語に置き換わる感じ）|
|CTRL-R|取り消しを取り消し|
|v+{移動キー}|範囲選択（+y,dでコピーや削除ができる）|
|ggVG|全て選択(⌘ + a)|
```
上記(vim.text)のn・N・uの行全体をv+(移動キー)で選択しその範囲の文字を新たないvim.textファイルに書き出そうとした時
(v+(移動キー):'<,'>w vim.textとコマンドを実行した時)
<br>

**原因**
Vimが部分的なテキスト（バッファーの一部）を書き込もうとしたときに、対象のファイルが既に存在しているため発生している
今回の場合はファイル名（vim.text）が既に存在しており、上書きができないため発生している

Vimは安全に設計されているため、上記のような状況の場合
```:w vim.text```はファイル全体を書き込む時は上書き可能です。しかし```:'<,'>w vim.text```のような範囲を指定して
書き出す場合はファイルが既に存在しているとVimは「うっかり上書きしたくないですよね？」と言った具合にエラーを出します。
このエラーこそが、**E140**です
<br>


**解決方法**
```
:'<,'>w! TEST
```
上記のコマンドを実行する。
ただし、!をつけると強制的に実行される（ファイルが上書きされる）
ことに注意！


vim.textで```:w```を実行して保存して再度
```v+(移動キー):'<,'>w vim.textと```を実行する
こちらの解決方法はvim.textに上書きされない




### エラーコード（E37: No write since last change (add ! to override)）
日本語訳：最後の変更から書き込みなし（オーバーライドに!）(DeepL翻訳)
**いつ起きたエラー？？**
ファイルを保存せずに```:e ~/.vimrc```と入力してVimの設定ファイルを開こうとした時
<br>

**原因**
現在編集中のファイルに変更を加えたまま保存していない状態で、:e ~/.vimrc のように別のファイルを開こうとしたことが原因。
Vimは、現在の作業中ファイルに変更があるのに保存していない状態で他のファイルを開こうとすると、
データが失われないように警告してブロックします。
このエラーが**E37**です。
<br>

**解決方法**
```:w```を実行（保存）した後```:e ~/.vimrc```を実行（設定ファイルを開く）する


### エラーコード(E486: Pattern not found: best)
日本語訳：パターンが見つかりません：ベスト(DeepL翻訳)
**いつ起きたエラー？？**
ページ内検索(```:best```)を実行した時
<br>
**原因**
このエラーが出た時は単に単語が存在していないだけ

## 最後に
Vimはサーバーの構築やLinuxOSでなにかをする際に時より必要になる（使わざる終えない）エディタとであることが分かっていただけたと思います。
まさか、エンジニアを目指しているのに
サーバーの構築はしませんと言う人はいないですよね？
そんな人がいたら素人ながら大丈夫？と思っちゃいます。

Vimはなんとなく上級者の人が使っていて
初心者の人が使うのはハードルが高いと思われがちです。
確かに上級者のようなVimを使って何でも書くレベルに
なるのはハードルが高いです。しかし、最低限使えてブログや簡単なコードをすぐ書けるようになります。

実際、僕も最初は難しそうだなー、移動から意味わかんねーなー、癖強いなー、思ってました。
しかし、触ってみると意外と単純でした。細かいコマンドまで使いこなせなくても今回紹介したコマンドだけでも
なんだかんだ使えちゃいます。

その証明にこの記事は全てVimを使用して書きました。
また、この記事は僕自身これからVim使を使う時の
チートシートとして使おうと思ってます。
短時間で最低限のコマンドを習得したい人は
参考にしていただけるとありがたいです。
みなさん、Vimくんとお友達になりましょう〜

2日間みっちりVimの勉強お疲れ様でした〜。

## 参考資料
[知識0から始めるVim講座](https://qiita.com/JpnLavender/items/fabcc79b4ab0d52e1f6d)
[【vim入門】vimtutorはいいぞ](https://qiita.com/Hiyajo/items/9f87c5687652da42f275)