vimの存在しない世界へ異世界転生しためんどくさがり屋のvimmer

はじめまして

[42Tokyo](https://42tokyo.jp/)の[2023年度Advant Calendar](https://qiita.com/advent-calendar/2023/42tokyo) 17日目を担当する9月入学の在校生yliuです。
42Tokyoとは、世界で最も革新的な大学ランキング(WURI)でハーバード大学を超えた[エンジニア養成機関42](https://42.fr/en/homepage/)の東京校です。

昨日は在校生の@corvvsさんが[pingの世界の徒歩旅行, そして鍋](https://qiita.com/corvvs/items/1ec858e0fda32a08e0b0)について書いてくれました。
馴染み深い人も多い（？）Pingコマンドについて、馴染みの無い内容で勉強になりました。

また、@corvvsさんは他にも4日目の[伸長攻撃(Length-Extension Attack)](https://qiita.com/corvvs/items/5a505c17f91ced249832)と9日目の[暗号学的ハッシュ関数 門前](https://qiita.com/corvvs/items/c7f2eef8537fba510831)、そして23日目はmallocについての記事などたくさんの記事を書かれています。暗号や数学が好きな方は是非読んでみてください！

## エピローグ

...

...

ここは...？
そういえば昨日は42の課題を夜遅くまでやっていて寝落ちしちゃったんだっけな

キャンパスに向かうか

〜〜キャンパス〜〜

さていつものようにnvimで起動して、作業しようか

あれ？nvimが起動しない？？
vimやviも無いが、遠い祖先のexやedは健在のようだ

```
$which nvim
nvim not found

$which vim
vim not found

$which vi
vi not found

$which ex
/user/bin/ex

$which ed
/user/bin/ed
```

（とりあえずググってみる）

「Google 検索: vim not found」

「検索結果：　約 45 件 （0.35 秒） 」

妙だな

vimの検索結果は、
約 13,190,000,000 件 （0.62 秒）であり、エディター界最強のはずだ

とうとう**日頃の行いが悪く、vimの存在しない異世界に転生させられた**というのか・・・
これは**めんどくさい**ことになりそうだ

仕方ない、vimのない世界で今までの罪を償おう
そして４２を卒業してつよつよエンジニアになった暁にはexからvimを作ればいいじゃないか

## 本日の作業開始

きょうはライブラリの再実装の続きだ

手始めにプロトタイプ宣言をファイル冒頭に追加したい

・・・**めんどうだな**

もしvimがある世界なら、
1. `(`で関数ブロックの先頭行まで移動後、`yy`でコピー
2. `ggp`でファイル冒頭にペースト
3. `A;`を打つ

で終了だ

>ノーマルモードで使えるコマンド
`(`,`)`,`[`,`]`,`{`,`}`...ブロック移動。それぞれ若干挙動が異なる
`yy`...フォーカスの乗っている一行をコピー（ヤンクと呼ぶ）
`gg`...ファイル先頭にフォーカスを移動、ファイル最後へは`G`で移動
`p`...ペースト
`A`...フォーカスを行末に移動後、**しぶしぶ**挿入モードに入る

---
さて関数の続きを書こう

元関数にフォーカスを戻すにはスクロールをする必要があるが**めんどうだ**

vimがあると、
「``」でジャンプ前の位置にジャンプすることができる
「gi」でジャンプ前の位置にジャンプして挿入モードに切り替える事もできる

魔術的な便利さだ

（正確にはジャンプの挙動が微妙に異なるがここでは割愛）

---
...よし、これでコード完成した。コンパイルすると

`split.c:4245:13:error:`

4245行目にエラーがある

スクロールするのは**めんどう**、目が潰れそうだ

もしvimのある世界なら`4245G`で瞬時に飛べる

---
...どうやら関数の引数に問題があったようだ。括弧`()`内を全部書き直したい

```
dst_str[i] = ft_substr(src_str, start_pos, word_len);
```

右括弧`)`までマウスフォーカスを移動して、バックスペースで文字を次々と消していく・・・

・・・文字を消しすぎてしまった

カーソルスピードを最速にしている弊害だが、修正が**めんどう**だ

vimのある世界なら、マウスフォーカスが括弧()内部にある時点で、`ci(`で一発括弧内文字列削除＆挿入モードに入る

```vim
dst_str[i] = ft_substr(src_str, start_pos, word_len);
                                        ↑
                                        フォーカス（括弧の中であればどこでも）
// 「ci(」実行。「ci)」でもよい
dst_str[i] = ft_substr();
                       ↑
                       フォーカス
```

---

`c`(change)のかわりに、`d`(delete)を使うと、編集ではなく削除になる
これは`i`ではなく、`a`との相性がよい
```vim
unsigned long int
        　　　↑
        　　　フォーカス(単語longにあればどこでもよい)

// 「daw」(delete a word)と打つと
unsigned int
```

他にも、`dap`は段落(paragraph)一つを削除する。`diw`と同様の問題として、`dip`だと上下に余分な空行が残り、不格好になる

類似のコマンドには、
- `ct)`　（フォーカスから閉じ括弧までの文字列を削除し挿入モードに入る）
や
- `cT(`　（フォーカスから開き括弧までの文字列を削除し挿入モードに入る）
がある
もちろん、括弧以外の文字を指定することもできる

```vim
size_t   strlen(char *str, char c)
↑
フォーカス

// 「f,」でフォーカス移動
size_t   strlen(char *str, char c)
                         ↑
                         フォーカス

// 「dt)」で閉じ括弧まで削除
size_t   strlen(char *str)
```


`c`はchange,`t`はtill(~まで)と覚えると覚えやすい
ちなみに、`t`のかわりに`f`(find)を使えば開区間ではなく、閉区間のような指定の仕方ができる


・・・（作業中）・・・

・・・やっぱりvimが使えない世界は、あまりに**めんどくさいな**

作業が捗らないので今日はここまでにして散歩でもしにいこう
改めてvimの便利さを噛み締めた日だった・・・

※本記事はvimの便利さをvimを普段使いしない人に知ってもらいたくて書きました。vim以外のエディターを貶める意図はありません。

## おわりに
- メモ帳としてのvimは非エンジニアのビジネスパーソン、特に英文タイピングが多い社会人にもおすすめです。
    - 極めれば作業効率がそれこそ異次元です。
- めんどくさがりな主人公だなと思った人へ
    - プログラマーの三大美徳とは「**怠惰**」「短気」「傲慢」らしいです[^1]。
- vimには他にもExコマンド、マクロなどの便利な機能がたくさんあります。
- vimが単なるエディタを超越した、非本質的特徴の無いツールだと感じていただければ幸いです。
    - キーボードという入力形態が存在する限り、異世界や異なる時代でも有効です。
    - GUIが無い世界線においてもvimのスキルは有効であり、応用性が高いです。

## おすすめ文献
『実践Vim 思考のスピードで編集しよう!』 | Drew Neil, 新丈径

### 追記　この~~怪文書~~記事の狙いを言語化する
よく、vimは覚えるのがめんどくさい、という話を聞きます。正しいと思います。そしていざキーバインドを覚えようとしても、一度にたくさんは覚えられません。これを読んでいる読者だけではなくみんなそうだと思います。私もそうです。
そこで、ありきたりな暗記リストのようなvim入門記事を書くことがvim入門に果たして有効なのか疑問を持ちました。無味乾燥で通り一遍なコマンド集が並ぶ記事は、かえってvimに対しての認識を歪めてしまうのではないかと思ったからです。
そこでvimmerはvimをどのように扱っているのか、疑似体験ベースで見せることに加え、あえてvim入門にありがちな簡単な移動コマンドを載せず、記事に登場するコマンドは少し背伸びしたものを意識して選びました。また通常キー操作との対比が明確になるのではと思い、vimのない異世界設定にしてみました。
こうすることで、vimを使いこなすと利便性が向上することを実感して頂きたいと思いました。そこまでvimに魅力を感じなかったのであれば、間違いなく作者の力量不足によるものです。
**vimに罪はありません。**

明日は@konaitoさんによる[記事「とりあえず動くアプリを作る方法」](https://qiita.com/konaito/items/8157b2128f39f756d41b)です。お楽しみに。


[^1]: 【Perl開発者】ラリー・ウォール