vimの基本操作と実際に使う手順

## はじめに

プログラミング学習の過程でvimについて学んだため、復習も兼ねて操作になれるまでにやったことなどをまとめてみます。

## vimとは
テキストエディタの一つです。
特徴としてはCLI上から起動して使う、文字挿入以外に複数のモードがある、全ての操作をキーボードで行えるなどがあります。Linuxなどのマウス操作ができない環境下だと確実にvim操作が必要になる場面があるので、基本的な操作は習得しておいた方がいいと思います。


## 基本的な操作方法

| コマンド | 説明 |
|---|---|
| `i` | 挿入モードに切り替えます。 |
| `a` | 隣から挿入モードに切り替えます。 |
| `Esc` | ノーマルモードに切り替えます。 |
| `:` | コマンドラインモードに切り替えます。 |
| `h` | カーソルを左に移動します。 |
| `j` | カーソルを下に移動します。 |
| `k` | カーソルを上に移動します。 |
| `l` | カーソルを右に移動します。 |
| `dd` | 現在の行を削除します。 |
| `yy` | 現在の行をコピーします。 |
| `p` | クリップボードの内容をペーストします。 |
| `:wq` | ファイルを保存して終了します。 |
| `:q!` | 変更を保存せずに終了します。 |

#### モードの切り替え
vimではモードという概念があり、モードごとに操作の役割が別れています。
##### インサートモード(挿入モード)
一番わかりやすいものだとインサートモードです。キーボードを押すとカーソルがあるところに文字が入力されてるという、いわば通常のエディタを使っているときの操作感だと思っていただければいいかと思います。vimでは挿入モードでは文字の入力を行います。
インサートモードからノーマルモードに移るときは``esc``キーを押します。

##### ノーマルモード
次にノーマルモード。こちらは主にカーソルの移動、文字、行の削除、コピー等を行います。``i`` ``a``などを使うと挿入モードに移行します。

##### ビジュアルモード
ビジュアルモードはノーマルモードの状態に``v``を押すことで移行できます。カーソルを移動させて選択のみできます。
自分はコピーや削除、書き換えを行うときは先にビジュアルモードに入ってから視覚的にコピーする対象を確認してから``y``などのコマンドを使っています。

##### コマンドラインモード
ノーマルモードの状態で``:``を押すと移行します。続けてコマンドを入力して``Enter``で実行できます。
``:wq``などのファイルを保存するコマンドなどを使うときに使います。
``:55``などで55行目に移動など、の操作や``:s/thee/the/g``でtheeをtheに置き換えるなどの操作も行えるため割と使います。
vimで編集して保存したファイルを閉じないでコマンドラインモードから実行してみるということもできます。

#### カーソル移動
``h``,``j``,``k``,``l``をそれぞれ左、下、上、右の移動で使います。
慣れるまですごく間違えます。
自分はなるべく左の移動を使わないようにして``j``からホームポジションを動かさないようにして、誤タッチを防いでいます。

#### ノーマルモードのコマンド
``d``,``x``,などノーマルモードのまま変更を加えるものと、``a``,``i``など入力すると挿入モードになるものがあります。``c+d``などと入力すると指定箇所を``d``で消したあとに挿入モードに移行するのようなことができます。


## 慣れるためにやったこと
### vim Adventures(ゲーム)
ゲームで慣れるvim adventuresというサイトがあります。
３面くらいまで無料で遊べます。一回でいいかもしれません。
https://vim-adventures.com/
### vimtutor
こちらはターミナル上から
```
$ vimtutor
```
と打つだけで実行できるvimのチュートリアルです。
だいたい初見のときは一回に40,50分くらいかかるのですが、これを1日一回くらいやっていると一週間くらいで半分くらいの時間で終わらせられるようになりました。（あまりやりすぎるとvimというよりvimtutorに慣れてしまいます）

### 実践vimを読む
こちらは電子書籍版で読みました。（まだ1/3くらい）
内容自体は高度な操作が多くて、なかなか実際の操作に落とし込むのが難しいものが多かったのですが、考え方的な部分がとても参考になりました。特に「vimでは何かの変更を行いたいときにその箇所まで移動するために１コマンド、変更を加える１コマンドの計２コマンドで大概の操作は行えるため、できていない場合はもっといいやり方がないか見直すことが大事」みたいな箇所はvimすげえ〜となりました。

### 実際に使う
当たり前ではありますがこれが一番大事でした。
自分はプログラミングの学習中のため、教材だったりに出てくるファイル編集を部分的に少し記述したりする場合は全てターミナルからvimで開いてvimで行っていました。


## 実際の作業、開発でvimを使う方法
### 絶対やった方がいい設定
karabiner-elementsを入れて、ESC入力時に英数モードに切り替わるように設定する。
自分はCtrl+閉じカッコでnormalモードにしているのでそのときに英数に切り替わるようにしています。
日本人がvimを使う場合インサートモードで日本語または英語を入力したあとにノーマルモードに戻ってまた英数に切り替えてからでないと操作ができないため、非常に不便なのでこれを導入することをおすすめします。
正直これがなければvimは最低限しか使わなかったと思います。
https://karabiner-elements.pqrs.org/
### obisidian(メモ)
メモアプリをobsidianにしてvimモードで使う。
apple純正のメモで今までメモをとっていたのですが、vimモードがあることとmarkdownが使えることと、UIなどが洗練されていて気分が上がることなどもあり、obisidianでメモをとっています。このメモが良すぎる。
https://obsidian.md/

### VSCodeプラグイン
VSCodeを使っている場合はvimプラグインを入れて使う。
vimは後述のneovimなどでかなりカスタマイズができるのですが、VSCodeほどインストールした状態から機能盛りだくさんで優れているものはあまりないため、特にこだわりがなければVSCodeにvimプラグインを入れて使うのが無難だと思いました。
vimを使ったことで逆にVSCodeの良さが理解できました。
VSCodeの拡張機能から「vim」で検索で一番最初に出てくるものです。
#### 絶対やった方がいいVSCodeの設定
##### 長押しでカーソル移動
デフォルトだとhjklが長押しで反応しないため、下記の設定を行うことで通常のvimと同じように長押しで反応するようにすることをおすすめします。
```
$ defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false 
```
##### OSのクリップボードと同期する
vimのヤンク（コピー）はOSのコピーペーストと独立しているため、この設定をしていないとウェブでコピーしたものをvim内にペーストできないです。
VSCodeでsetting.jsonを開いて
```
  "vim.useSystemClipboard": true, // OS のクリップボードと同期
```
を貼り付けで同期するようにできます。

その他、便利な設定などありましたら教えていただけると嬉しいです。
### エディタ
その他vimエディタも使ってみたので紹介します。
#### MacVim
これはmacしか使えないとは思うのですが、VSCodeやsublimetextその他と同じようにアプリケーションとして立ち上げて使うタイプのvimエディタになっています。
ターミナルから起動そのまま起動するvimは初めはなぜか抵抗があったので、このようにデスクトップから立ち上げて使うGUIタイプのMacVimもいいと思いました。
テーマなども好きに変えられるためVScodeなどのモダンなエディタのような見た目にすることも可能です。
https://macvim.org/

#### NeoVim
これは通常のvimと同じくターミナルからそのまま起動するタイプのvimの派生系？みたいなものです。
vim使っているという方もこちらのことを指している場合は多いようです。
基本的な使い方はvimと変わりなく、拡張していくことなどに優れている印象があります。
https://neovim.io/
##### coc.nvim
neovimのプラグイン。導入すると文法の補完などを行うことができて、vscodeなどに匹敵するような感じになります。coc-explorer,mattn/emmet-vimなど
ただ、設定自体が大変でした。

## 感想
vimの基本的な操作はLinuxなどで必ず使う必要があるので慣れておいた方がいいと思った。特に１行だけ追加したいときなど、VSCodeを開いたりせずにターミナルで
``$ vim Gemfile``
などでさっと編集して```:wq```ですぐターミナルに戻ったりするのは非常に便利だと思いました。
また普段の開発などにvimを使うかどうかについては個人の好みかなと思った。
実際、vimで色々カスタマイズを行なってVSCodeの代わりに使えるくらいにするのはかなり大変だと感じた。

自分はvimの特定の動きがとても便利だと感じているので
（特に「hjkl移動」「Aコマンド」「oコマンド」「cコマンド」など）
VSCode vim,obsidianあたりで今後も使っていきたいと思います。



## 参考リンク

- VSCodeプラグイン
https://techblg.app/articles/how-to-disable-press-and-hold-in-vscode/
https://maku.blog/p/tb6s2ck/
- karabiner関連
https://medium.com/veltra-engineering/karabiner-element-e63f75b21b09
https://jill-tone.com/mac-karabiner-jislayout/
- その他
https://qiita.com/itkr/items/896e0e1c1cedf9e5480b