たくさんあるVimエミュレーション

この記事は[Vim2 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/vim2)の7日目の記事です。

みなさんはVimエミュレーションは使っていますか？

Vimは使っているけれどVimエミュレーションは使っていない人もいれば、
Vimは使っていないけれどVimエミュレーションは使っている人もいる。
そんなVimエミュレーションですが、現在では多くのブラウザ、テキストエディタ、IDEで提供されるようになっており、
VimエミュレーションのおかげでVimの操作性を他のソフトウェアでも享受できるようになっています。

もし、Vimの外でVimのキーバインドが使えたらマウスを使わずにキーボードだけで操作できるのではないか、
もし、このテキストエディタの機能(マルチカーソルなど)と一緒にVimの機能が使えたらすごい編集ができるのではないか、
もし、この開発効率のいいIDEを使いつつVimのキーバインドも使えたならすごい快適なのではないだろうか、
そんなことを思ったことのある人は少なくないと思います。

Vimエミュレーションはそんなことを実現できたり…できなかったり…という感じなのですが、
この記事ではそんなVimエミュレーションについて紹介します。

## Vimエミュレーションとは何か

Vimエミュレーションは何かを一言で表すならば、Vimのキーバインドや概念を再現するもの、といったところでしょうか。
hjklでの上下左右の移動から始まり、dでの切り取り、pでの貼り付け、ノーマルモードや挿入モードといったモードの概念、マクロによる操作のリピート、テキストオブジェクト、など、各VimエミュレーションによってVimの機能をどれぐらい再現しているか、再現できているかは異なりますが、いずれも実現できる範囲でVimの機能を再現しています。

だいたいのVimエミュレーションではhjklをはじめとしたキーでカーソル移動、スクロールができるようになり、ノーマルモードによる素早いテキスト編集ができるようになります。全てのキーがショートカットキーになったような状態になるため、いつもとはまた違った操作性を得ることができます。

しかし、Vimエミュレーションがもたらすものは必ずしもメリットばかりという訳でもありません。
Vimを使っている人が必ずしもVimエミュレーションを使っているとは限らないのには理由があります。
最初は気にしないで大丈夫なのですが、次のようなメリット、デメリットがあります。

### メリット

主に4つ。

1. キーボードで完結する操作が増える。
  - マウス、タッチパッドの利用頻度が減るためキーボードを触っている時間が増えます。また、矢印キーの利用頻度が減るためホームポジションを維持できる時間も増えます。
  - 環境によってはマウスを出しづらかったりするのでそういう場所でありがたいです。
2. プレーンテキスト編集速度が向上する。
  - なんだかんだいってVimはプレーンテキストの編集が得意なのでVimの編集機能の再現度が高ければプレーンテキストの編集速度が上がります。
  - 場面によってはVimエミュレーション無しのほうが速く編集できる場合もあります。また、フォーマット、リファクタリング等は専用のツールやIDEに任せたほうがいいでしょう。
3. 操作の快適性が向上する。
  - ほぼ全ての操作がショートカット相当になります。Vimを使っている人は多かれ少なかれVimの快適性を目当てにVimを使っていますが、Vimエミュレーションでも似た快適性を得られます。
4. Vimへの抵抗感が減る。
  - Vimへの移行がしやすくなるでしょう。また、例えばもしLinuxサーバ等に入って作業をする場合にも、Linuxサーバには確実にVimが入っているので、ファイル編集等への抵抗感が減ります。

### デメリット

主に4つ。別でブラウザ特有のものが1つ。

1. Vimの機能を100%再現しているわけではない。
  - Vimの機能を知っていれば知っているほど、Vimにはあったこれが無い…となります。無かったからといって詰むことはないですが、快適性に影響します。
  - とはいえ、使い続けると慣れてきます。個人差はありますが…。
2. 既存のショートカットキーを上書きする。
  - 既存のショートカットキーを上書きするため、既存の機能へのアクセスがしづらくなります。IDEでは特に編集以外のショートカットも多いので影響が大きいです。
  - これはVimエミュレーションの作り次第というか、既存の機能との共存をどのようにしているか次第ではあります。
3. 日本語入力に苦労する。
  - Vimと同じで最初は日本語入力に苦労するはずです。Vimのモード(ノーマル/挿入)と日本語入力のモード(英数/ひらがな)の二つのモードが別々にあるので確実に混乱することでしょう。
  - これはVimと同様で慣れます(モード切り替えにはパターンがあるので)。それでも日本語多めだと編集速度は落ちますが。
4. Vimから離れづらくなる。
  - Vim特有の快適性みたいなものがあって、Vimエミュレーションにも似た快適性があるんですが、この快適性が得られない場面で辛くなります。私はこれがあってVimから離れられそうにありません。CapsLockキーのCtrlキー化などと似た感じですね。
5. (ブラウザ特有) Hit-a-hintで事故をする。
  - ブラウザ向けのVimエミュレーションには大体Hit-a-hintといって特定のキーを押すと、各リンクにアルファベットが振られそのアルファベットを入力するとそのリンクに飛べる機能があるのですが、これが使っていてときどき事故します。
  - 例えば誤フォローしたりとか、誤いいねしたりとか。事故するときは事故します。

### 使うか使わないかの決め方

趣味にあっていれば使う…ぐらいでいいと思います。
Vimエミュレーションありの操作感とVimエミュレーション抜きの操作感は異なるので、
どちらがいいかとは一概に言い難いです。それに、Vimを使うという選択肢もありますしね。

もしVimを使っていなかったとしても、Vimが気になっていたら試していいと思います。
ドットインストール等のVimの入門等で紹介されている範疇の操作であればだいたい再現されているはず…です。

また、同じVimエミュレーションでもブラウザ向けのVimエミュレーションはあくまでVim風というかVimと異なる独自の操作が色々あってほぼ別物なので、ブラウザ向けのVimエミュレーションは単体で試してみて、よさそうだったら使っていいと思います。

## Vimエミュレーションの一覧

さて、そんなVimエミュレーションにはどのようなものがあるのかですが、次のようなものがあります。
これらは2019年12月6日時点で1年以内に最終更新があり、確実に利用ができるVimエミュレーションの一覧になります。

Vimエミュレーションには以前からからあり今も保守されているものもあれば、
保守されなくなってしまったもの、APIの変更によりプロジェクトの終了を余儀なくされたものもあります。
そのため、一覧から外しているものもありますが、それらも込みのリストだともっと数があります。込みのリストはどこかで…。

### テキストエディタ向け

| テキストエディタ   | Vimエミュレーション          |
|--------------------|------------------------------|
| Emacs              | Evil                         |
| Visual Studio Code | VSCodeVim                    |
| Atom               | vim-mode-plus                |
| Sublime Text       | NeoVintageous<br>Sublime Six |
| Brackets           | Vimderbar                    |

全体的に再現度が高めな気がします。マルチカーソルを併用できたりするのもいいですね。
EmacsにはVIP、Viper、といったものがあったと聞きます。そちらまでは試せていないのですがどんな感じでしょう…。Atomのvim-modeは非推奨になっていてvim-mode-plusが推奨されています。Sublime TextのVintageとVintageousはそれぞれ開発が止まっています。

### IDE向け

| IDE                | Vimエミュレーション |
|--------------------|---------------------|
| Visual Studio      | VsVim               |
| Xcode              | XVim2               |
| Eclipse            | Vrapper             |
| NetBeans           | jVi                 |
| IntelliJ IDEA      | IdeaVim             |

いずれも長く保守されていて、このIDEならこれといえる定番なものとなっています。
変わったことといえばXcodeのXVimがXVim2になったことぐらいでしょうか。

また、リストにはありませんが、Qt CreatorにはFakeVim、MonoDevelopにはVi ModeというVimエミュレーションを有効にする機能があります

### ブラウザ向け

| テキストエディタ   | Vimエミュレーション                                                |
|--------------------|--------------------------------------------------------------------|
| Firefox            | Vimium-FF<br>Vim-Vixen<br>Tridactyl<br>Surfingkeys<br>VVimpulation |
| Chrome             | Vimium<br>Surfingkeys                                              |
| Safari             | Vimari<br>sVim                                                     |

5年前とはリストが大きく変わっています。
FirefoxのVimエミュレーションはVimperatorやVimFxが動かせなくなり、使えるVimエミュレーションが大きく変わりました。Chromeにも以前ViChromeや、Vrome、cVimといったものがありました。SafariのVimariとsVimはMacを持ってなくて試せていないのですが今でも使える感じでしょうか…？

用途が編集ではなく、ブラウジングなので、他のVimエミュレーションとは違うのですが、
Vimのキーバインドを多く再現しており、キーボードだけで多くの操作ができるようになります。

また、Edge、Vivaldiはリストにありませんが、Edge、VivaldiではChromeの拡張をそのまま使えるため、Edge、VivaldiでもVimエミュレーションは利用できます。

### その他

| ソフトウェア | 種類                   |
|--------------|------------------------|
| tig          | Gitインターフェース    |
| cgdb         | GDBインターフェース    |
| qutebrowser  | ブラウザ               |
| Vimb         | ブラウザ               |
| Luakit       | ブラウザ               |
| Kakoune      | テキストエディタ       |
| Shiba        | Markdownプレビュアー   |
| Readline     | ライブラリ(C)          |
| FakeVim      | ライブラリ(C++(Qt))    |
| Ace          | ライブラリ(JavaScript) |
| CodeMirror   | ライブラリ(JavaScript) |

VimエミュレーションというよりはVimを参考にしているもの…ぐらいの感じのような気もしますが、いずれもVimが提供するキーバインドと同じキーバインドを提供しています。

これとは別に、カウントされるかは怪しいですが、
いくつかのWebサイトにはVimのキーバインドがショートカットキーになっているサービスがあります。

| Webサイト          | ショートカット内容                                                      |
|--------------------|-------------------------------------------------------------------------|
| Twitter            | jkで選択ツイートを移動、/でキーワード検索にフォーカス                   |
| TweetDeck          | jkで選択ツイートを移動、hlで選択列を移動、/でキーワード検索にフォーカス |
| BookWalker         | hjklでページ送り(wasdでも可)                                            |
| GoogleDrive        | hjklで選択ファイルを移動                                                |
| GoogleCalender     | jkで月、週、日を移動                                                    |
| ニコニコ静画(漫画) | jkで上下スクロール                                                      |
| はてなブックマーク | jkで選択記事を移動                                                      |
| GitHub             | jkで選択ファイルを移動                                                  |
| Pocket             | jkで選択URLを移動                                                       |
| Pixiv              | jkでページ送り(2枚以上の投稿の場合のみ)                                 |

jkでのスクロールはホームポジションを崩さずにできる操作なので、もしかしたらVimは関係ないかもしれませんが。

## まとめ

Vimエミュレーションはこのようにたくさんの人が作っていています。
Vimエミュレーションが合うかどうかは人によりますが、
よければ触ってみてください。

また、もしリストに無いものがあったら是非教えてください…！