Vim....! そいつは素敵だ、大好きだ

# 0 概要
ゆりかごアドカレ12/7の記事です。
Vimの素晴らしさを世に広めます。前半でVimの素晴らしさ、後半でインストールと使い方を書くつもりです。

### ひとこと
Vimは非常に優れたエディタだ。しかし、そういった良さは使ってみないと実感できないものだ。簡易ではあるが[付録](#3付録)にサンプルテキストを載せるので、演習がてら手を動かしてみてほしい。

# 1 良いですよ、Vimは編


## 1.1 Vimって？
みんな使ているので今さら説明の必要も無いと思うが、一応説明しておこう。
Vimとは、空間、時間を越えて愛されるテキストエディタである。
祖先はviというやつ。その人気っぷりはすさまじく、viを題材にしたゲーム、"Word War vi"[^1]が作られるほどである。
viの発展したのがVimである。viでは実現できなかった様々な機能を取り入れ、更に使い易くなった。
また、Neovimという親戚もいる。
Vimと双璧をなすエディタ、Emacsと仁義なき戦いをし続けている。

[^1]:vi戦士となり、失なわれたswapファイルをとり戻す旅に出る。古いので、動かすのに相当苦労する。手元で動かすの断念した。

## 1.2 Vimのココが良い
Vimの良いところはいくらでもあるが、少しを抜粋して挙げると、

- キーボードで操作が完結するところ。それも快適に。
- コードを塊ごと編集できるのでむっちゃ速く書けるところ。
- 高いカスタマイズ性

あたりが強い。
キーボード操作だけなら、だいたいどんなエディタでも可能だけど、"快適に"ってところが抜きん出ている。

### 1.2.1 快適にってどういうこと？
ホームポションに手を置いたままほぼ全ての操作ができるのだ!マウスに手を移動するなんて面倒、矢印キーすら面倒。そんなのやめよう。という究極の快適さである。
やってみるとマジでやみつきになる。
いったいどうやってそんな快適性を？気になる仕組みは[2.3.2](#232-編集する)を参照。後述のモードのおかげでこの快適な操作を実現している。

### 1.2.2 塊ごと編集って？
Vimは、ただ一文字ずつ消して書くのではない。後述のモードを駆使することで、{ }の中を全て削除する等の強力な一括操作が可能である。
Vimの達人たちは、でかい塊ごと編集したり、複雑な操作を一括操作で完了したりするので、コーディングがむちゃ速い。
やってみりゃわかる。
### 1.2.3 高いカスタマイズ性
操作も外観もとにかくカスタマイズできる。
たとえば、IDEみたいなてんこもり画面

![IDElike.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989098/c52fe9ba-4b45-702a-182f-759f95a04a04.png)

から、とても静かな画面
![goyo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989098/a2daeeb0-eace-3e65-895e-e179c972507e.png)
で心を落ちつけたりと、自由自在に設定できる。



### 1.2.4 その他の良いところ
- オープンソースなので、そういう思想の人も歓迎。
- とにかく軽い。VSCodeが1 GBくらい、Vimは10 MBくらいのメモリ使用量(当社調べ)(環境によって異なる場合がございます)
- カスタマイズが幅広い。
- インストール、設定が楽。(メジャーなエディタなので手段が整備されてる。)
- CUIで動作する。(リモートアクセスでも使いやすい)




# 2 じゃあ、使ってみよう!編

まあ、ここらへんの解説は良いのがあちこちに転がってるから他をあたるも良し。

## 2.1 インストール


<details><summary>主要なOSごとのインストール方法</summary>

### Linux
vim-tinyとかvim-gtkとかいくつか種類がある。とりあえずvim-gtkでいいんじゃないかな。
お使いのパッケージマネージャでインストールしましょう。例えば、
```
sudo apt install vim-gtk
```
とか
```
sudo pacman -S vim-gtk
```
とか。

### Mac
標準搭載のパッケージマネージャHomebrewでインストールできるらしい。Macは使ったことないのでよくわかんない。Qiitaの記事[1]に書いてある。

### Windows
標準搭載？のパッケージマネージャwingetでインストールできる。
```
winget vim.vim
```
とした後、環境変数にpathを追加する。

</details>

## 2.2 カスタマイズでもっと快適に
もっと快適に使うためのカスタム方法。とりあえず動かしてみるだけなら、後回しにしても良いだろう。
ホームディレクトリに、`.vimrc`というファイルを作成し、カスタム内容を書き込む。
スニペットを適用するとか、大抵のことは実装できると思う。
以下にちょっとした例を示す。検索すればいくらでも情報出てくるよ。
<details><summary>.vimrcの例</summary>

```.vimrc
" 行番号を表示
set number

" 相対行番号
set relativenumber

" カラースキーム
colorscheme torte

" バックスペースで削除できるようにする
set backspace=indent,eol,start

" 賢いインデント
set smartindent

"クリップボードからプット
set clipboard=unnamedplus


```
</details>

Vimのつよつよ先駆者たちが作成したプラグインを導入することで、快適さが更に向上する。

## 2.3 エディット!
VSCodeとは違い、ターミナル上で動かすよ。
### 2.3.1 Vimを起動する
先ず、ターミナルを開く。
<details><summary>ターミナルの開きかた</summary>
<ul>
<li> Linux:Ctrl + Shift + t</li>

<li>win: Super + r で「ファイル名を指定して実行」を起動し、"cmd"と打ち込む。<font color="White" >こういうところが煩しくて嫌なんだよWindowsは!!!</font> </li>

<li>mac:<a href="https://support.apple.com/ja-jp/guide/terminal/apd5265185d-f365-44cb-8b09-71a064a42125/">ココ</a>を参照。Windowsと概ね同じ。<font color="White">Macも面倒じゃねえか!!</font></li>
</ul>

</details>

次に、`vim hoge.tex`とすることで、hoge.texファイルを作成すると同時に編集画面へ移行する。
行番号が表示されてない、とかなるだろうけど、設定で表示できるよ。コマンドモードで`set number`するなり、`.vimrc`に`set number`と書きこむなり。


### 2.3.2 編集する
サンプルテキストを用意したので、手を動かして遊ぼう。
<a href="https://knowledge.sakura.ad.jp/21687/">ゴリラさんのサイト</a>がむちゃ参考になる。他にも、基本的な内容から発展的な内容までいろいろなサイトで解説があるよ。
ここではさわりだけ書く。
Vimには複数の状態がある。これに対し、「キーを押したときの挙動が同じ」で同値類をとったものを、モードという。モードは全部で4つあり、
- nomal mode
- visual mode
- edit mode
- command mode
である。特定の操作でそれぞれのモードを行き来し、編集を行なう。このモードというのが強力で、こいつのおかげで複雑な編集を簡単に実行できる。
モードの行き来の操作例は図1のようである。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 17
}
</style>
footer 図１ モード移動の例。ゴリラさん[4]より引用
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989098/caef70c7-1191-e031-1b04-e707c400b92b.png>
@enduml
```
これ以外にも複数の操作方法がある。一例を示す。
| to | key | 動作 |
|:-:|:-:|:-:|
|  insert | i  |  カーソルの前からinsert |
|  insert | I  | 行の最後へ移動してinsert  |
|  insert | a  | カーソルの後からinsert  |
|  insert | A  | 行の先頭へ移動してinsert  |
|  insert | s  | カーソル位置の文字を削除しつつinsert  |

| to | key | 動作 |
|:-:|:-:|:-:|
|  visual | v  |  フツーの選択 |
|  visual | V  | 行単位で選択  |
|  visual | C-V  | 矩形選択  |

| to | key | 動作 |
|:-:|:-:|:-:|
|  command | :  |  コマンド実行できる(保存とか) |
|  command | /  | 文字列検索  |


その他にも、モード移行以外のコマンドもたくさんある。けど、ちょっと紹介し切れない。nomal modeのコマンド(オペレータ)のこれまた一例を示す。
| オペレータ | 動作 |
|:-:|:-:|
| w  |  保存 |
| q  |  終了 |
| y  |  ヤンク(コピー) |
| yy  | 行をコピー  |
| p  | プット(ペースト)  |
| x  | 削除 |
| dd  | 行を削除  |
| cc  | 行を削除つつinsert  |

こういったコマンドを組み合わせることで、煩雑な処理を一括で行なえる。

しかしまあ、操作がたくさんあってここだけじゃ紹介しきれないので、使いながら身につけてください。

# 3 付録
なるべく少ないキー操作でお題を完了してみよう。
お題

- 1.`aaaa...`の行を5行くらい複製しよう。そして、その中でカーソル操作して遊んでみてね。
- 2.`#include<>`の中身を`iostream`に変更しよう。
- 3.非推奨のeqnarray環境だ!align環境を修正しよう。
- 4.数式の答えが書いてないね。書きたそう。


<details><summary>操作例</summary>

- 1.`yy 5p`で複製。`hjkl`で移動して遊ぼう。
- 2.`ci{` で{}内を削除しつつinsert modeに。alignを記入し、nomal modeに戻る。\endの行へ行く。ドットリピートでこっちも修正。
- 3.`A`で行末に移動しつつinsert。
- 4.`:`でcommand modeに。`q`で終了。`wq`で保存して終了。
</details>


<details><summary>サンプルコード</summary>

```sample.txt
Sample text

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa


#include<stdio.h> //iostreamにしたい


\begin{eqnarray} %alignに修正
	\int^{\infty}_{\infty} dx e^{- x^2} = 
\end{eqnarray}




```
</details>

せっかくなので紹介。
同一の操作をするのに、どれだけ少ない操作でできるかを競う遊びができるよ。挑戦してみよう。

https://www.vimgolf.com

# 参考
<p>[1] うなすけとあれこれ."vim-gnomeとvim-gtkの違い".(2024/12/4閲覧)</p>

https://blog.unasuke.com/2014/difference-of-vim-gnome-and-vim-gtk/


<p id="quote_brew">[2] one-a."HomebrewでVimをインストール".(2024/12/3閲覧)</p>

https://qiita.com/one-a/items/5039dd266b90e18a4242

<p >[3] Appleサポート."Macで「ターミナル」を開く/終了する".(2024/12/3閲覧)</p>

https://support.apple.com/ja-jp/guide/terminal/apd5265185d-f365-44cb-8b09-71a064a42125/mac

<p>[4] ゴリラ."はじめてのVim 〜 Vimはいいぞ！ゴリラと学ぶVim講座(1)"(2024/12/3閲覧)</p>

https://knowledge.sakura.ad.jp/21687/