vim初心者が基本操作についてまとめてみた


# そもそもvimとは？

> Vim は、あらゆる種類のテキストの作成と変更を非常に効率的に行うために構築された、高度に構成可能なテキスト エディターです。これは、ほとんどの UNIX システムおよび Apple OS X に「vi」として含まれています

[引用元](https://www.vim.org/)　

普段マウスで操作しているカーソル移動や保存（ショートカットを使うことが多い場合もありますがそれは一旦置いておき）などを全てコマンドで行えるテキストエディタ。

慣れるまでは確かに時間がかかる。。。だけど慣れてしまえばマウスとキーボードの往復がなくなりあらゆる操作を高速に行えるため、とっても効率が良い！（らしい）

初学者なので、あまり馴染みがなくvimの操作に慣れている途中ですが、これまで学んだコマンドについてまとめました。



# 起動、終了について

起動はターミナルで
```vim:書き方
$ vim
```
を実行します。

終了は以下の通り。
| コマンド | 操作 |
|:-:|:-:|
|:q|保存せず終了|
|:q!|保存せず強制終了|
|:wq|保存して終了|
|:wq!|保存して強制終了|

:wで保存をするため、:wqを実行すると保存＋終了になります。
!は強制終了の意味です。

# カーソルの移動について

vimを操作するうえでの最も基本となる操作です。

| コマンド | 操作 |
|:-:|:-:|
|h|左に移動|
|l|右に移動|
|k|上に移動|
|j|下に移動|　

キーボードの配置はh、lがj、kを囲う配置になっているので、
h、lの両端で左右移動、j、kで上下移動と覚えると覚えやすいです。

# カーソルの移動について（広範囲）

上記の4コマンドのみだと画面内の移動が面倒です。
もう少し広範囲で移動できるコマンドを紹介します。

| コマンド | 操作 |
|:-:|:-:|
|w|1単語右に移動（スペース含む）| 
|e|1単語右に移動（スペースなし）|
|b|1単語左の先頭に移動<br>（カーソル位置が先頭の場合は前の単語の先頭に移動）|
|ge|1単語左の末尾に移動|
|^|カーソルがある行の先頭に移動|
|$|カーソルがある行の末尾に移動|
|H|表示画面内の先頭行に移動|
|M|表示画面内の中央行に移動|
|L|表示画面内の最後行に移動|

ページ全体の先頭、末尾に移動する場合は、以下のコマンドを使用します。

|コマンド|操作|
|:-:|:-:|
|gg|ページ全体の先頭に移動|
|G|ページ全体の最下部に移動|

これらの移動コマンドを使えると、効率よく作業できます。

# vimでテキストファイルを作成・編集する

vimではCUI（キャラクタユーザインターフェース）のため、コマンドでテキストファイルを作成・編集することができます。

sample.txt のファイルを作成・編集したい場合は、ターミナルで

```vim:書き方
$ vim sample.txt
```
を実行します。

起動、終了についてで紹介した:wを利用して、作成・編集したファイルを保存できます。
編集後に終了したい場合には、:wqでそのまま終了できます。

# vimの入力モードについて

ここで、vimの操作に関する入力モードを紹介します。
vimを操作する際には4種類のモードがあり、モードによってできることが異なります。

|モード|コマンド|利用場面|
|:-:|:-:|:-:|
|ノーマルモード|esc|通常モード|
|インサートモード|i, aなど<br>（後述）|テキスト挿入時|
|ビジュアルモード|v|テキストの範囲指定時など|
|コマンドモード|:(コロン)|保存や終了など|

- ノーマルモード
通常の入力モードです。カーソル移動や文字削除などの操作はこの状態で行います。
- インサートモード
テキスト挿入時のモードです。テキストの挿入・編集はこの状態で行います。
- ビジュアルモード
テキストの検索や範囲指定などの利用時はこの状態で行います。
- コマンドモード
コマンドを利用する場合のモードです。:wq のようなコマンドを利用したい際に使います。


# テキストの挿入について

テキストの作成や編集を行う際によく利用する挿入コマンドです。

前述のテキストモードに切り替える場合は、以下のコマンドを利用します。

|コマンド|操作|
|:-:|:-:|
|i|カーソル位置から挿入|
|I|カーソルのある行の先頭から挿入|
|a|カーソル位置の次の文字位置から挿入|
|A|カーソルのある行の末尾から挿入|

大文字のI,Aは先頭に移動して開始するか、末尾に移動して開始するかの違いです。
小文字のi,aはカーソル位置から開始するか、その次の文字から開始するかの違いです。

# テキストの削除について

|コマンド|操作|
|:-:|:-:|
|x|カーソル位置の文字を削除|

単語単位で削除したい場合や、行全体を削除したい場合はd の削除コマンドを使用します

|コマンド|操作|
|:-:|:-:|
|dw|カーソル位置の単語を削除（スペース込み）|
|de|カーソル位置の単語を削除（スペースなし）|
|d$|カーソル位置から行の末尾まで削除|
|dd|カーソルがある行を全て削除|

wとeは単体でカーソル移動としても使えます。

> これは テスト の 文章 です。

「こ」にカーソルがある場合、
wで移動するとスペースを含めて移動するので「テ」の位置にカーソルが移動します。
eで移動するとスペースを含めないで移動するので「は」の後のスペース位置にカーソルが移動します。

上の例文から単語を削除する場合、
「テ」の位置にカーソルを置き、dwを実行すると

>これは の 文章 です。

となります。

deを実行すると
>これは  の 文章 です。

となり、「の」の前にスペースが残ります。

行単位での削除は複数行でも行えます。

2行削除したい場合 → 2dd
5行削除したい場合 → 5dd

といった感じで削除したい行数をddの前に入力します。

# テキストのコピーペーストなどについて
同じ文章を何度も入力するのは面倒です。コピペなどのコマンドを紹介します。

|コマンド|操作|
|:-:|:-:|
|v + 十字キー|範囲選択| 

最初にvを入力しているのはvisualモードへの切り替えのためです。

範囲選択と組み合わせると以下の操作ができます。

|コマンド|操作|
|:-:|:-:|
|範囲選択 + y|選択箇所のコピー|
|範囲選択 + p|ペースト|
|範囲選択 + d|範囲選択の削除|

選択範囲でなく行単位など、広範囲の場合は

|コマンド|操作|
|:-:|:-:|
|yy|1列全てコピー|
|2yy|2列全てコピー|

3yy,4yyなど行数は自由です。

# テキストの置換について

テキストエディタなので置換ができると便利ですよね。できます。

|コマンド|操作|
|:-:|:-:|
|R|現在のカーソル位置から入力した文字に置換|
|:s/変更前の単語/変更後の単語|カーソル行の最初にある変更前の単語を変更後の単語に置換|
|:s/変更前の単語/変更後の単語/g|カーソル行の全ての変更前の単語を変更後の単語に置換|

文章だと分かりにくいので、例を挙げてみます。

例えば、Rのコマンドで置換する場合
> aiueo AIUEO

この文を
>AIUEO AIUEO

こうしたい場合。
「a」の位置にカーソルを移動させてRを入力し、続けてAIUEOと入力。
すると
>AIUEO AIUEO

に置換できます。
※上のような例の場合は
```vim:書き方
:s/aiueo/AIUEO/
```
もしくは
```vim:書き方
:s/aiueo/AIUEO/g
```
としても置換できます。

:::note warn
Rは入力すると置換モードに入るため、ノーマルモードに戻る際はescキーの入力が必要です。
:::

# 最後に

vimのコマンドに慣れるためにvimtutorを利用しました。
macだと標準で利用できるので、ターミナルで
```vim:書き方
$ vimtutor
```
で起動できます。
よかったら利用してみてください。

# 参考文献
https://qiita.com/Hiyajo/items/9f87c5687652da42f275

https://qiita.com/JpnLavender/items/fabcc79b4ab0d52e1f6d

# おまけ
実際に操作してみるとなかなか慣れるまで難しいですね。
余談ですが、カーソル移動のhjklコマンドは、タイビングのホームポジション付近の位置に配置されています。
普段ホームポシジョンからずれまくった位置に指がある私としてはへー！と感動しましたが若干使いづらさを感じてしまいました。（自分の癖が悪い）

:::note
この記事はvimコマンドの練習を兼ねて、vimで書きました。
:::