【Vim】実務未経験者が考える、押さえておきたいコマンド

# はじめに
皆さんは「エディター」をご存知でしょうか。

エディターとはコンピュータープログラムやテキスト文書を編集するためのソフトウェアです。テキストの入力や修正、書式設定などを行えます。

プログラミングにおいては、コードの作成やデバッグ（コンピューターでプログラム上の不具合や誤りを見つけて修正・訂正すること）などの機能も備えています。

一般的なエディターには「Visual Studio Code」や「Atom」などが挙げられますが、「Vim（ヴィム）」もそんなエディターの仲間です。Vimは、強力で高度なテキストエディターで、プログラミングから一般的なテキスト編集までさまざまな用途に使用されています。

今回は初めて「Vim」に触れる方に向けて「Vim」と「Vimの基本操作」について綴ってみました。


# Vimの概要
Vimはオランダ人のプログラマーBram Moolenaar氏によって1991年に開発された**テキストエディター**です。開発後もメンテナンスや改善が行われています。

Vimは、**Vi**の強化版であり、多くの機能と柔軟性を備えています。テキスト編集に特化したコマンド指向のエディターであり、マウスを使用しないキーボード操作を重視しています。

※**テキストエディター**：文字や記号などのテキストで構成されているテキストファイルを編集するソフトのことです。

※**Vi**：テキストファイルの編集に特化した古くから存在するテキストエディターです。Viは「ビジュアルエディター」の略称です。


# 特徴
### 1. Mode（モード）ベースの操作
Vimは「Normal Mode（ノーマルモード）」「Insert Mode（挿入モード）」「Visual Mode（ビジュアルモード）」「Command Mode（コマンドモード）」などの異なるModeを持っています。この特徴により、高速かつ効率的な編集が可能となります。

### 2. カスタマイズ性
Vimはカスタマイズに長けていて、ユーザーは自分の作業スタイルや好みに合わせて設定や**プラグイン**を追加できます。

※**プラグイン（Plugin）**：ソフトウェアの機能を追加したり拡張したりすることです。また追加・拡張するソフトウェア自体を指すこともあります。

### 3. 強力な編集機能
Vimは検索・置換、折りたたみ、ファイルの管理など、豊富な編集機能を提供してくれます。


# Vimを学ぶことで得られること
### 効率的なテキストの編集作業が可能に
Vimはマウスを使用しない、キーボード中心の操作で、多くのコマンドやショートカットを覚えることで効率的なテキストの編集ができるようになります。

### プログラミングへの応用に用いることが可能に
先の説明にもありましたが、Vimは多くの機能と柔軟性、カスタマイズ性を併せ持っています。さらにVimはこれらの特徴を活かすためにプログラミング言語に特化した機能やプラグインを提供していますので、実際に現場でVimを使用しているプログラマーにとって非常に有用です。


# 理解しておきたい4つのMode（モード）
Vimは基本的に以下の4つのModeを切り替えながら操作を行います。

### 1. Normal Mode（ノーマルモード）
・デフォルト（標準）のモードであり、Vimを起動した直後に入るモードです。
・コマンドを入力してテキストを操作するモードです。
・テキストの移動、削除、コピー、貼り付けなどの操作を行います。

### 2. Insert Mode（挿入モード）
・ノーマルモードから `i` を押すことで挿入モードに切り替えます。
・キーボードの入力はそのままテキストとして挿入されます。
・テキストを入力、貼り付け、削除などの操作を行います。

### 3. Visual Mode（ビジュアルモード）
・テキストを選択するためのモードです。
・ノーマルモードからビジュアルモードに切り替えるには `v` を押します。
・選択した範囲のテキストをコピー、削除、変更することができます。

### 4. Command Mode（コマンドモード）
・Vimのコマンドを入力するためのモードです。
・ノーマルモードからコマンドモードに切り替えるには `:` または `/` を押します。
・ファイルの保存、検索、置換、設定変更などのコマンドを実行します。

これらのモードはVimの特徴である強力な編集機能を活用するために使用されます。


# vimtutorで学ぼうVimコマンド
突然「vimtutor」と言う言葉が現れましたが、これはVimの使い方を学ぶためのチュートリアルプログラムです。Vimは初めて使う人にとってはとても難しいのですが、vimtutorを学ぶことでVimの基本的な操作方法を身に付けることができます。

vimtutorは多くの**Unix/Linux系**の**オペレーティングシステム**やmacOSには、Vimパッケージと一緒にvimtutorがデフォルト（標準）で搭載されています。

※**Unix/Linux系**：コンピューターの仕組みを管理するためのソフトウェアです。

※**オペレーティングシステム**：コンピューターの司令官のような存在で、ソフトウェアを動かしたり、システムやファイルを管理したり、と重要な役割を務めます。

### Windows上でvimtutorを起動する方法
1. コマンドプロンプト（Command Prompt）またはPowerShellを開きます。
2. 「vimtutor」と入力して、Enterキーを押します。

### macOS上でvimtutorを起動する方法
1. Spotlight検索を使って、検索フォームに「ターミナル」または「terminal」と入力して、ターミナルを起動します。
2. ターミナルで「vimtutor」と入力して、returnキーを押します。


# 押さえておきたいVimコマンド
Vimのコマンド数について正確な数字はわかりませんでしたが調べてみるとコマンドの組み合わせ次第では2,000種類にも及ぶ、とのことです。

しかし、その2,000種類全てを覚える必要はなく、実際の業務で使われるコマンドが30 ~ 50種類くらい（業務内容によって増減しますが）ですので、ちゃんと押さえておけば作業効率を上げられることができます。

一度で全部覚えようと思わず、先ずは一つずつコマンドの型と挙動を知ることから始めていきましょう。できれば、実際にvimtutorを起動して操作しながらハンズオン形式で確認することを強くお勧めします（**その方が圧倒的に理解できるスピードが違います**）。

それでは、操作種別にご紹介いたします。

### 保存・終了
|コマンド|説明|
| :---: | --- |
|`:w`|ファイルの保存|
|`:q`|Vimを終了|
|`:q!`|変更を破棄してVimを終了|
|`:wq`|ファイルを保存してVimを終了|
|`ZZ`|ファイルを保存してVimを終了|
|`ZQ`|変更を破棄してVimを終了|


### カーソルの移動
|コマンド|説明|
| :---: | --- |
|`h` または `←`|カーソルを左に移動|
|`j` または `↓`|カーソルを下に移動|
|`k` または `↑`|カーソルを上に移動|
|`l` または `→`|カーソルを右に移動|
|`gk`|上に1行移動|
|`gj`|下に1行移動|
|`w`|カーソル位置から次の単語の先頭に移動|
|`W`|`,` や `.` や `;` などの単語を抜かして、カーソル位置から次の単語の先頭に移動|
|`b`|カーソル位置から前の単語の先頭に移動|
|`B`|`,` や `.` や `;` などの単語を抜かして、カーソル位置から前の単語の先頭に移動|
|`e`|カーソル位置から次の単語の末尾に移動|
|`E`|`,` や `.` や `;` などの単語を抜かして、カーソル位置から次の単語の末尾に移動|
|`0`（数字の0）|カーソルが位置している行の先頭に移動|
|`^`(キャレット)|カーソルが位置している行の先頭に移動|
|`$`|カーソルが位置している行の末尾に移動|
|`gg`|ファイルの最初の行の先頭に移動|
|`G`|ファイルの最後の行の先頭に移動|
|`数字G`|指定した数字の行の先頭に移動 例）55Gと入力してreturnを押すと55行目の先頭にカーソルが移動|
|`:n`|n行目に移動 例）:55nと入力してreturnを押すと55行目の先頭にカーソルが移動|

ここで注意してもらいたいのが「wとW、bとB、eとE」のそれぞれの挙動です。
Hello, world! Welcome. という一文を例に説明します。


#### 「wとW」の違い
##### 「w」の場合
カーソルを「H」の位置からwコマンドを押すたびに
```
例) Hello, world! Welcome.
H → , → w → ! → W → .
```
の順でカーソルは移動します。

##### 「W」の場合
カーソルを「H」の位置からWコマンドを押すたびに
```
例) Hello, world! Welcome.
H → w → W
```
の順でカーソルは移動します。


#### 「bとB」の違い
##### 「b」の場合
カーソルを「.」の位置からbコマンドを押すたびに
```
例) Hello, world! Welcome.
. → W → ! → w → , → H
```
の順でカーソルは移動します。

##### 「B」の場合
カーソルを「.」の位置からBコマンドを押すたびに
```
例) Hello, world! Welcome.
. → W → w → H
```
の順でカーソルは移動します。


#### 「eとE」の違い
##### 「e」の場合
カーソルを「H」の位置からeコマンドを押すたびに
```
例) Hello, world! Welcome.
H → o → , → d → ! → e → .
```
の順でカーソルは移動します。

##### 「E」の場合
カーソルを「H」の位置からEコマンドを押すたびに
```
例) Hello, world! Welcome.
H → , → .
```
の順でカーソルは移動します。

些細な違いなのですが、`w`、`b`、`e`コマンドは大文字と小文字で挙動が少し異なる、と言うことを知っておいてください。


### 画面の移動
|コマンド|説明|
| :---: | --- |
|`H`|カーソルを画面上部の行の先頭に移動 (High, Home)|
|`M`|カーソルを画面中央の行の先頭に移動 (Middle)|
|`L`|カーソルを画面下部の行の先頭に移動 (Low, Last)|
|`Ctrl + d`|1ページ分上にスクロール|
|`Ctrl + f`|1ページ分下にスクロール|
|`Ctrl + d`|半画面分進む|
|`Ctrl + u`|半画面分戻る|
|`zz`|今位置しているカーソルが画面中央に位置するようにスクロール|


### 挿入
|コマンド|説明|
| :---: | --- |
|`i`|Insert Modeに切り替わりカーソルの前に挿入できるようになる|
|`I`|Insert Modeに切り替わりカーソルが位置している行の行頭から挿入できるようになる|
|`a`|Insert Modeに切り替わりカーソルの後ろに挿入できるようになる|
|`A`|Insert Modeに切り替わりカーソルが位置している行の行末から挿入できるようになる|
|`o`|カーソルが位置している行の下に新しい行を追加してInsert Modeに切り替わる|
|`O`|カーソルが位置している行の上に新しい行を追加してInsert Modeに切り替わる|


### コピー
|コマンド|説明|
| :---: | --- |
|`yy`|カーソルが位置している行をコピー（yank（ヤンクと言う））|
|`p`|カーソルが位置している下の行にコピーした行を貼り付ける|
|`P`|カーソル位置にコピーした行を貼り付ける|
|`yy数字p`|カーソルが位置している行をコピーし、数値の分だけカーソルの下に貼り付ける|
|`yw`|カーソルが位置している単語をコピー|
|`%`|カーソル位置に「()、{}、[]」などの括弧がある場合、対応する括弧を検索|


### 削除
|コマンド|説明|
| :---: | --- |
|`dd`|カーソルが位置している行を削除|
|`数値dd`|カーソルが位置している行を起点に数値の分だけ行を削除|
|`dw`|カーソルが位置している単語を削除|
|`D`|カーソルが位置している場所から行末まで削除|
|`d$`|カーソルが位置している場所から行末まで削除|
|`de`|カーソル位置から単語の末尾までを削除|
|`cc`|カーソルが位置している行の全体を削除してInsert Modeに切り替わる|
|`C`|カーソル位置から行末までを削除してInsert Modeに切り替わる|
|`x`|カーソルが位置している文字を削除|
|`X`|カーソルが位置している左側の文字を削除|


### 取り消し・繰り返し
|コマンド|説明|
| :---: | --- |
|`u`|直前の動作を取り消す(undo（アンドゥと言う）)|
|`U`|カーソルが位置している行の全ての変更を取り消す|
|`ctrl + r`|undoを取り消す（redo（リドゥと言う））|
|`.`(ピリオド)|最後のアクションを繰り返し行う(Repeat)|


### 検索
|コマンド|説明|
| :---: | --- |
|`/検索したい文字列 return`|検索したい文字列を検索|
|(検索したい文字列を検索した状態で)`n`|次の検索結果にジャンプ(下に移動する)|
|(検索したい文字列を検索した状態で)`N`|次の検索結果にジャンプ(上に移動する)|


### 置換
|コマンド|説明|
| :---: | --- |
|`:set number`|行番号を表示|
|`:数字`|数字に該当する行に移動|
|`:s/検索文字列/置換文字列`|カーソルが位置している行で最初に見つかった検索文字列を置換|
|`:s/検索文字列/置換文字列/g`|カーソルが位置している行で全ての検索文字列を置換|
|`:%s/検索文字列/置換文字列/g`|ファイル内の検索文字列を一括置換|
|`:%s/検索文字列/置換文字列/gc`|ファイル内の検索文字列を一つずつ確認しながら置換|


### Vimのコンフィグ設定
|コマンド|説明|
| :---: | --- |
|`:syntax on` または `:syntax off`|シンタックスハイライトの設定ON・OFFを切り替え|
|`:noh`|ハイライトされた検索結果からハイライトを解除|
|`:set nohlsearch`|デフォルトでハイライトの設定をOFF|
|`:set hlsearch`|デフォルトでハイライトの設定をON|

※**コンフィグ**：コンフィグレーションの略です。配置、構成、を意味します

※**シンタックス(syntax)**：コンピュータープログラミングやマークアップ言語などにおいて、正しい構文や文法に従って書かれたコードを表現するための規則やルールのことを指します。Vimにおいては、キーワードや要素、構文などを色分けして表示することができます。

※**シンタックスハイライト**：プログラムやコードのテキストを表示する際に、それぞれの要素や構文を色やスタイルの異なる形式で強調表示する機能のことです。強調表示することで、視覚的に区別しやすくし、コードの読みやすさや理解のしやすさを向上させます。

※**hl**：「highlight」の略です。


# おわりに
マウスを一切使用しない & 独特なキーボード操作とコマンド......と、Vimを学ぶことに最初は戸惑うかもしれませんが、諦めずに学び続ければテキスト編集やプログラミング作業において、利便性や生産性の向上に繋がります（と思っています）。

斯く言う私もVimに初めて触れたのがほんの数日前で、まだ右も左もわからないレベルではありますが、毎日手を動かすことでVimのキーボーディングが馴染んでくるようになりました。

また、一日でも早く慣れるためにこの記事の草稿はVimを用いて書きました。学業でも仕事でも知識や技術を身に付けることは一朝一夕ではないのが世の常ですね。

もし、初めてVimに触れた方、これからVimを学ぼうとしている方に少しでもお役立ていただければこんなに嬉しいことはありません。

一緒に頑張っていきましょう。

ご覧くださり、ありがとうございました。