[[📒Articles]] > [[📒2023 Articles]]
![[2023-03-27.jpg|cover-picture]]
この記事は[[Vim駅伝]] #2023/03/27 の参加記事です。ポエム寄りの記事ですがお付き合いいただければ幸いです。
## はじめに
[[Vimmer]]と聞いて皆さんは何を思い浮かべるでしょうか。ターミナルで[[Vim]]や[[Neovim]](以降はまとめて[[Vim]]と表現します)を立ち上げて、意味不明なコマンドを打ちまくっている人...、普通の人が[[VSCode]]や[[JetBrains IDE]]を使う中、頑なにそれを拒んで[[Vim]]を使い続ける人...、大抵の人はそんな人物像を思い浮かべるのではないかと思います。
私の観測範囲にいる[[Vimmer]]もそのような傾向はあります...が、100%そうとは言えません。チームの輪を乱してまで[[Vim]]に固執するような人は稀だと思います。ただ、自分の裁量でエディタを選んでも問題ない場合、[[Vim]]を好んで使う人は多いと思います。
一方、私は普段そこまで[[Vim]]を使いません。後ほどご紹介しますが、[[Vim]]を使うのは一部のユースケースのみです。ただ、それでも、私は[[Vimmer]]であると自負しています。なぜか? それは[[Vim]]をエディタではなく哲学として考えており、それをあらゆる環境で利用しているからです。
## Vimの哲学
そもそも『Vimの哲学』とは何か? これは私が先ほど定義した造語です。人によっては『Vimの思想』や『Vimの戦略』と呼ぶこともあるでしょう。はたまた『Vim』という言葉そのものをエディタではなく、そのような意味で表す人もいます。
### [[Vim]]に対する誤解
この記事を読んでいる方であれば、おそらく[[Vim]]に一度は触れたことがあるのではないかと思います。ただ、[[Vim]]は生半可な気持ちで習得できるものではありません。少し触ってみたのはいいものの、諦めてしまった人も多いのではないでしょうか。
- 『コマンドが多すぎて覚えられない...』
- 『モード切替なんかするより、[[挿入モード]]のまま操作した方が速い』
- 『自分には[[AutoHotkey]]があるからこんなものはいらない』
はい。ものの見事に5年前の私です。私は[[AutoHotkey]]のカスタマイズガチ勢であり、[[Vim]]であやかれる恩恵の多くは、それによって既に得られていると思い込んでいました。そして、[[Vim]]の学習コストの高さに嘲笑したものです。(以下が[[AutoHotkey]]のリポジトリ)
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">GitHub - tadashi-aikawa/spinal-reflex-bindings-template</p>
</div>
<div class="link-card-description">
This repository is the Autohotkey KeyCustomized Project which is applicable to only mine. - GitHub ...
</div>
</div>
<img src="https://opengraph.githubassets.com/b307ab6f7e5f8987b67164cf570702aa3dedb5f961e54f979b142ac057fe05cf/tadashi-aikawa/spinal-reflex-bindings-template" class="link-card-image" />
</div>
<a href="https://github.com/tadashi-aikawa/spinal-reflex-bindings-template"></a>
</div>
しかし、後に思い知ります。これらが私自身の無知からきた傲慢な判断であったということを。
### Vimのコマンドは覚えるものではない
> - 『コマンドが多すぎて覚えられない...』
この発言がある時点で、その人には[[Vim]]の本質が伝わっていないでしょう。もちろん、[[Vim]]を操作するため覚えることはあります。問題はその覚え方です。
例を挙げましょう。[[Vim]]について解説されているサイトでは、早見表として以下のようなものが提示されていることが多いです。
| 操作 | コマンド |
| ------------------------------------- | -------- |
| カーソルの単語を削除 | diw |
| カーソルの単語を削除 (前後の空白含む) | daw |
| カーソルから単語の終わりまで削除 | dw |
| カーソルから単語の最初まで削除 | db |
| カーソルの段落を削除 (前後の空行含む) | dap |
| カーソルの段落を削除 | dip |
| カーソルの行を削除 | dd |
| カーソルの行と1つ下の行を削除 | dj |
| カーソルの行と1つ上の行を削除 | dk |
| カーソルの単語を選択 | viw |
| カーソルの単語を選択 (前後の空白含む) | vaw |
| カーソルから単語の終わりまで選択 | vw |
| カーソルから単語の最初まで選択 | vb |
| カーソルの段落を選択 (前後の空行含む) | vap |
| カーソルの段落を選択 | vip |
| カーソルの行を選択 | V |
| カーソルの行と1つ下の行を選択 | vj |
| カーソルの行と1つ上の行を選択 | vk |
これらは削除と選択に関する操作のほんの一部です...が、いきなりこれを見せられて『覚えろ』と言われたら誰でも嫌になります。ここで重要なのは、**これらを丸暗記する必要はない**ということです。
まず、一部の例外を除き、1文字目が`d`なら削除、`v`なら選択という法則が読み取れるでしょう。この時点で覚えることは表全体の半分になります。なぜなら、その後ろに続くキーは、ユースケースに対してほぼ一緒だからです。
### [[Vim]]の設計思想
先ほどの解説だけでは『???』という感じでしょう。もう1つの大事なこと、[[Vim]]の設計思想についても紹介します。
[[Vim]]には明確な設計思想があります。最も特徴的なのは、デフォルトの状態が文字を入力する[[挿入モード]]ではなく、ファイルの閲覧/編集に特化した[[ノーマルモード]]であることです。具体例を紹介します。
以下のようなテキストがあったとします。
```vim
"aiueo" "kakikukeko" "sasisuseso" "tatituteto" 12345
```
これに対して、=="sasisuseso"と"tatituteto"の中身を大文字にしたい==とき、どのような操作をするでしょうか。[[Vimmer]]であれば以下のような操作をする人が少なくないでしょう。
![[2021-08-02_vim.gif|frame]]
入力したキーはわずか9キーで、 `fsgUi"ft.`。この一見して意味をもたないコマンドにもちゃんと意味があります。
| コマンド | 意味 |
| -------- | ---------------------------- |
| `fs` | 次に出現する`s`へ移動する |
| `gUi"` | `"`の内側を大文字に変換する |
| `ft` | 次に出現する`t`へ移動する |
| `.` | 直前の操作(`gUi"`)を繰り返す |
一見バラバラに見えるこれらのキーバインドにも、しっかりとした意味と意図があります。これを理解するには[[オペレータ]]や[[モーション]]、[[テキストオブジェクト]]という知識が必要になります。[[Minerva]]では[[Vim]]入門者用のハンズオンページを用意しておりますので、よろしければお試しください。
<div class="link-card">
<div class="link-card-header">
<img src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/favicon-64.png" class="link-card-site-icon"/>
<span class="link-card-site-name">minerva.mamansoft.net</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">📒1時間でVimに惚れるチュートリアル - Minerva</p>
</div>
<div class="link-card-description">
Vim tutorっぽいやつです。
</div>
</div>
<img src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/Notes/attachments/minerva-image.png" class="link-card-image" />
</div>
<a
class="internal-link"
data-href="📒1時間でVimに惚れるチュートリアル"
></a>
</div>
%%[[📒1時間でVimに惚れるチュートリアル]]%%
[[📗5章 ビジュアルモード]]までトライしていただければ、[[Vim]]の良さがきっと伝わると思います。
### [[Vim]]の成長曲線
[[Vim]]の哲学を理解することで、[[Vim]]の習得スピードを速めることは可能です。ただそれでも、[[Vim]]は一夜で習得できるような代物ではありません。短期的にはコストを払う必要があるという現実を認めてください。
具体的には、まず3日使い続けることを目指してみましょう。もちろんすべてのことを[[Vim]]でやる必要はありません。また、エディタとしての[[Vim]]や[[Neovim]]ではなく、[[JetBrains IDE]]や[[VSCode]]でもいいと思います。
3日の壁を乗り越えたら1週間です。次は2週間。そして1ヶ月ほど使い続けていれば、以前より快適とまでは言わなくても、指がかなり自然に動くようになっていると思います。
この境地に達することができれば勝ちです。3ヶ月、半年と時が経つにつれて貴方の操作スピードは上がります。そして1年もすれば、もはや[[Vim]]のない世界に戻るということがあり得ないと思うようになっているでしょう。
## 筆者の具体的な利用シーン
ここからは少し話を戻して、[[Vim]]をあまり使わない自称[[Vimmer]]の私が、どのようなユースケースで何のツールを使っているかご紹介します。
> [!attention]
> [[Vim]]や[[Neovim]]以外のツールは、[[Vim]]や[[Neovim]]の機能をすべてカバーしていません。ツールによって利用できる機能に差分があります。
### 文章を書くとき
文章を書くときは[[Markdown]]エディタの[[Obsidian]]を使っています。もちろん、この記事の執筆にも使用しています。
<div class="link-card">
<div class="link-card-header">
<img src="https://obsidian.md/favicon.ico" class="link-card-site-icon"/>
<span class="link-card-site-name">obsidian.md</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">Obsidian</p>
</div>
<div class="link-card-description">
Obsidian: A knowledge base that works on local Markdown files.
</div>
</div>
<img src="https://obsidian.md/images/banner.png" class="link-card-image" />
</div>
<a href="https://obsidian.md/"></a>
</div>
[[Obsidian]]には[[Vim key bindings]]という設定を有効にすると、[[Vim]]のようなキーバインドでの操作が可能になります。世の中の[[IDE]]やエディタのほとんどはそれらをプラグインといった形で提供しているので、標準対応しているのはかなり珍しいと思います。
一部の機能は[[コミュニティプラグイン]]を利用する必要があります。[[📒Obsidian逆引きレシピ#エディタ操作]] や以下のページが参考になると思います。
<div class="link-card">
<div class="link-card-header">
<img src="https://publish.obsidian.md/favicon.ico?146e08d1eb50283d1a17" class="link-card-site-icon"/>
<span class="link-card-site-name">publish.obsidian.md</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">for Vim users - Obsidian Hub - Obsidian Publish</p>
</div>
<div class="link-card-description">
for Vim users - Obsidian Hub - Powered by Obsidian Publish.
</div>
</div>
</div>
<a href="https://publish.obsidian.md/hub/04+-+Guides%2C+Workflows%2C+%26+Courses/for+Vim+users"></a>
</div>
### 開発するとき
開発するときは[[IntelliJ IDEA]]か[[VSCode]]を使います。どちらも標準では[[Vim]]の機能が含まれていないため、それぞれプラグイン/拡張機能として、[[IdeaVim]]や[[VSCodeVim]]を使います。
<div class="link-card">
<div class="link-card-header">
<img src="https://resources.jetbrains.com/storage/ui/favicons/favicon.ico" class="link-card-site-icon"/>
<span class="link-card-site-name">JetBrains Marketplace</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">IdeaVim - IntelliJ IDEs Plugin | Marketplace</p>
</div>
<div class="link-card-description">
Vim engine for JetBrains IDEs IdeaVim supports many Vim features including normal/insert/visual mode...
</div>
</div>
</div>
<a href="https://plugins.jetbrains.com/plugin/164-ideavim"></a>
</div>
<div class="link-card">
<div class="link-card-header">
<img src="https://marketplace.visualstudio.com/favicon.ico" class="link-card-site-icon"/>
<span class="link-card-site-name">marketplace.visualstudio.com</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">Vim - Visual Studio Marketplace</p>
</div>
<div class="link-card-description">
Extension for Visual Studio Code - Vim emulation for Visual Studio Code
</div>
</div>
<img src="https://vscodevim.gallerycdn.vsassets.io/extensions/vscodevim/vim/1.25.2/1677732062761/Microsoft.VisualStudio.Services.Icons.Default" class="link-card-image" />
</div>
<a href="https://marketplace.visualstudio.com/items?itemName=vscodevim.vim"></a>
</div>
私の場合、開発するときは通常[[IntelliJ IDEA]]を使います。[[VSCode]]を使うのは、設定メインのリポジトリをいじるときや、動作確認目的のコードを書くときなどライトなケースが多いです。
### ターミナルでファイルを閲覧/変更するとき
ターミナルは[[Windows Terminal]]を使っていますが、上記のようなツールを開くほどでもない場合は、そのまま[[Neovim]]を使います。
<div class="link-card">
<div class="link-card-header">
<img src="https://neovim.io/favicon.ico" class="link-card-site-icon"/>
<span class="link-card-site-name">neovim.io</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">Home - Neovim</p>
</div>
<div class="link-card-description">
vim out of the box
</div>
</div>
</div>
<a href="https://neovim.io/"></a>
</div>
ソースコードを参照する場合でも、30秒未満で済みそうな場合は[[Neovim]]を開くことが増えました。[[telescope.nvim]]や[[coc.nvim]]を導入して、ソースコードを扱いやすくなったことも大きな影響ですね。
### ブラウザをいじるとき
ブラウザを使うときは[[Vimium]]です。
<div class="link-card">
<div class="link-card-header">
<img src="https://www.google.com/images/icons/product/chrome_web_store-32.png" class="link-card-site-icon"/>
<span class="link-card-site-name">chrome.google.com</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">Vimium</p>
</div>
<div class="link-card-description">
The Hacker's Browser. Vimium provides keyboard shortcuts for navigation and control in the spirit of...
</div>
</div>
<img src="https://lh3.googleusercontent.com/iooXARzyoB-z2fUt3Ixcczai8n7F1CjREDIBQV-_as_tYIKrNjOMX63Kfp0OCT7umeebS1BfxpqTKJIWaIJJqxSn=w128-h128-e365-rj-sc0x00ffffff" class="link-card-image" />
</div>
<a href="https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb?hl=ja"></a>
</div>
ただ、文章の編集などには使用しません。キーボードだけで画面上のリンク先へジャンプする機能を使ったり、`gg`でページトップに移動したり、`gi`で入力欄にフォーカスするくらいです。
## まとめ
[[Vim]]の習得にあたって大切な心構えや、[[Vim]]や[[Neovim]]をほとんど使わなくても、[[Vim]]の哲学を活かせる機会は数多くあることを紹介しました。また、私が普段それを実践するために使用しているツールを紹介しました。
普段は[[Neovim]]をほとんど使わず、オマケ程度の利用に過ぎない私が、[[Vimmer]]を名乗ってよいのかは正直分かりません。ただ、[[Vim]]の哲学を活かし、[[プロダクティビティ]]の向上に還元しているという点においては、誰よりも自信があります。そして、そのような人が今後増えれば、[[Vim]]や[[Vimmer]]に対する世間の見方も変わってくるのではないか、そう信じてやみません。
> [!note]- 後日談
> この記事、実は3/27の2週間前に書き上げています。そして、皮肉なことに...この記事を書いたことによって、結果的に[[Neovim]]への興味が今まで以上に膨れ上がってしまいました。
>
> [[🗃️Neovimプラグイン]]も色々調べてインストールした結果、ちょっとした開発でデバッグが不要なら[[Neovim]]を使うようになってしまいました。ガチの開発は今まで通り[[IntelliJ IDEA]]を使いますが、今後[[VSCode]]を使う機会は少なくなりそうです... というか、5年前と比べて最近の[[Neovim]]が凄すぎてやばかった🤣