Vimライトユーザーのための「Vim以外でVimする」

# この記事を見たらできるようになること
* たぶんLinux全般
* どんなアプリケーション上でも、変換キー(任意のキーに変更可能)を押している間、Vimのノーマルモードを擬似的に再現できるようになる
* Vimだとホームポジションから遠いキーバインドはEmacsのものを採用しています

# この記事の対象者
中途半端にVimの世界に足を踏み入れてしまい、以下のような状況の方

* Vimのキーバインドがないとイライラしちゃう
* でも、常にVimを起動させておいて、Vimで書いて他のアプリにヤンクする、というほどの中毒者ではない
* Vimで開発環境を完璧にするのも面倒でついついIDEを使っちゃう
    - vscodeでvimバインドを使うと、vscode本体のキーバインドと食い合ってムキーってなっちゃう

# とりあえずやってみたい人のための奴
## ①[このレポジトリ](https://github.com/mojamozya/allapps-vimlike)を適当な場所にクローンする 
【迷ったらこれ】
ターミナル上で以下を入力

``` bash
$ cd && git clone https://github.com/mojamozya/allapps-vimlike.git
```

## ②bashrcとかに以下を追記
【迷ったらこれ】

``` bashrc
$ echo 'xkbcomp -I$HOME/allapps-vimlike/.xkb ~/allapps-vimlike/.xkb/keymap/mykbd $DISPLAY 2> /dev/null' >> ~/.bashrc
```

とりあえずこれでレポジトリのSimply mapped (Mapped with XKB)って書いてる奴はできるようになるよ

起動時にターミナル立ち上げる設定にしてない人は、起動させる度にターミナル立ち上げてください

## ③Autokeyをインストールする
``` bash
$ sudo apt install autokey-gtk
```
Gnomeじゃない人はautokey-qtとかかも、しらんけど

## ④autokeyの画面を開く
``` bash
$ autokey
```

## ⑤ダウンロードしたレポジトリをAutokeyで有効にする
Autokeyの仕様上、ここがちょっとややこしいです。
とりあえずautokeyにデフォルトで入っているフォルダとかフレーズとかは全部削除しちゃって構いません。

Autokeyの画面にて、メニューバーの`File` -> `New` -> `Folder`　を選んだ後、
`Use Default` を選択し、`general`というフォルダをデフォルトの場所に作ってください。
~/.config/autokey/dataにgeneralというフォルダができている筈なので、
そこに`allapps-vimlike/.autokey/general/vimlike`のシンボリックリンクを作ります。

【迷ったらこれ】
Autokeyの画面から上述の通りに`general`というフォルダをデフォルトの場所に作ったあと、

``` bash
$ ln -s ~/allapps-vimlike/.autokey/general/vimlike ~/.config/autokey/data/general
```

## ⑥動作チェックして問題なければ、autokeyを起動時に立ち上がるようにする
ubuntuとかならsessionに追加すればいいだけですが、
他のディストリビューションの人は自分で調べてみてください。

bashrcに`autokey`とか追加してもいいかもしれませんが、
ターミナルが立ち上がる度にautokeyが再起動されるのは、ちょっとダルいかも

# 使い方
* Autokeyを起動させた状態
* xkbcompでxkbの設定ファイルを読み込んだ後

なら使えます。

変換キーがをHyperキーにマッピングしているので、
キーマッピングはHyper = 変換 と読んでください。

変換キー以外をHyperにする方法はまあたぶんxkbまわりのソースの雰囲気見れば分かるよ。
需要があれば具体的な方法も書きますが地味に面倒なので割愛します。


## キーマップ紹介と補足
(単純なキーマップはレポジトリにも書いてあります)
### シンプルなやつ
Vimと同じくカーソルはhjklです。
つまり変換キーとhjklを同時に押せば、それぞれカーソルキーになります。

Escは`Ctrl+[`と、小指が届かなかったとき対策の`Ctrl+@`にも振っています。
(僕はよく[と@を押し間違えます)

ポイントとしては、`;`と`:`にそれぞれBackSpaceとDeleteを振っているところでしょうか。
元来のVimほど削除の小回りが聞くわけではないので、
;を押すことで削除をすることによって、Vimっぽくはないものの普通に便利なショートカットにしています。
(ただ小指で;を連打すると疲れるので、iあたりをBackSpaceにするのもいいかもしれませんね。)

:はまあそのノリで、「Backspaceの右側を押したら、カーソルの右側が消えるよ」という感覚でしょうか。
Vimな気分が強いときはxを押します。どっちでもいいと思います。

a と e をEmacs風のキーバインドにしているのも特徴です。
変換キーと同時押しする都合上、
^を押すときにも多少のストレスがかかり、
Shift + $ を押すときには、
喫煙者が3時間タバコを吸えていないときぐらいストレスがかかります。

なので、ここにはEmacのキーバインドを採用してみました。
* aはアルファベットの先頭だから行頭、
* eはend of line のe
とでも覚えてみるのもいいかもしれませんね。

| Pushed keys | Mapped Keys | Like | Usage|
| ---- | ---- | ---- | ---- |
| Hyper + h | ← | Vim | Cursor key |
| Hyper + j | ↓ | Vim | Cursor key |
| Hyper + k | ↑ | Vim | Cursor key |
| Hyper + l | → | Vim | Cursor key |
| Hyper + ; | BackSpace | Original | Backspace |
| Hyper + x | BackSpace | Original | Backspace |
| Hyper + : | Delete | Original | Delete |
| Hyper + a | Home | Emacs | Move cursor to the head of line |
| Hyper + e | End | Emacs | Move cursor to the end of line |
| Hyper + m | Enter | Emacs | Enter key |
| Hyper + Ctrl + [ | Esc | Vim | Esc (Mapped with AutoKey) |
| Hyper + Ctrl + @ | Esc | Vim | Esc (Mapped with AutoKey) |


### カーソルをマクロっぽい感じで動かすやつ
ここからはちょっとだけ複雑なことをしています。
{Ctrl + カーソルキー`でなんかいい感じにカーソルを移動させてくれるのって、
IMEの機能？OSの機能？
そんなことは知りませんが、ちょっとだけVimの`e`とか`b`っぽい挙動になってくれるのです。

でも`e`をEmacsバインドで使っちゃってるので、
挙動が`e`に似ている`w`に`Ctrl + →`を割り当ててみました。

`Ctrl + →`はどっちかというと`e`に近いんだけどね。
でも所詮`e`とも細かいところは違うから、どっちだっていいや。

同様に`b`に `Ctrl + ←`を割り当てています。

あとは、`o`とかね。
Endキーで行末に移動してからEnterキーを押すマクロを設定することで、
擬似的にVimの`o`を再現しています。

`Shift + o`の再現の仕方は難しい。
IDEのインデントをいい感じにしたいならこのまま。
一番上の行にいるときにも作動させたいなら、`Home -> Enter -> ↑`かな？

| Pushed keys | Mapped Keys | Like | Usage |
| ---- | ---- | ---- | ---- |
| Hyper + Shift + b | Ctrl + ← | Vim | Move cursor to the head of word |
| Hyper + Shift + w | Ctrl + Shift + → | Vim | Secelt the range from current cursor to the head of word |
| Hyper + w | Ctrl + → | Vim | Move cursor to the end of word |
| Hyper + Shift + w | Ctrl + Shift + → | Vim | Secelt the range from current cursor to the end of word |
| Hyper + o | End -> Enter | Vim | Make a line below current cursor |
| Hyper + Shift + o | ↑ -> End -> Enter | Vim | Make a line above current cursor |


### Shortcut (Mapped with Autokey)
あとはショートカットですね。
個人的には、`Ctrl + x`と`Ctrl + c`と`Ctrl + v`が隣にあるのが
とても気に食わないんですよね。
コピーしようと思ったらペーストしてもうたやんけ！しばくぞ！
とよくなっちゃいます。
ということで、dやらyやらpやらに振っています。

`dd`や`yy`は再現するのが難しかったので、
`Ctrl + d`と`Ctrl + y`というホットキーにしました。

そうすると、aで行頭に戻ってShift + d (y)で削除(ヤンク)できるのでまあいいかと。
Emacsでいう`Ctrl + a -> Ctrl + k`的な？　Emacs詳しくないから知らんけど。

あと`Ctrl + z`は押すときに指が窮屈になるので好きくありません。
`Ctrl + Shift + z`でRedoも、押し間違えのリスクがあって好きくありません。
なので`u`と`Ctrl * r`で再現しました。


| Pushed keys | Mapped Keys | Like | Usage |
| ---- | ---- | ---- | ---- |
| Hyper + u | Ctrl + z | Vim | Undo |
| Hyper + Ctrl + r | Ctrl + Shift + z | Vim | Redo |
| Hyper + y | Ctrl + c | Vim | Copy |
| Hyper + Ctrl + d | Home -> Shift + End -> Ctrl + c -> ← | Vim | Cut |
| Hyper + Shift + y | Ctrl + End -> Ctrl + c -> → | Vim | Copy the range from current cursor to the end of line |
| Hyper + d | Ctrl + x | Vim | Cut |
| Hyper + Ctrl + d | Home -> Shift + End -> Ctrl + x -> Delete | Vim | Cut |
| Hyper + Shift + d | Ctrl + Shift + End -> Ctrl + x | Vim | Cut the range from current cursor to the end of line |
| Hyper + p | Ctrl + v | Vim | Paste |


# vscode使いへ
vscodeで使うときはKeyboard: Dispatchを`keyCode`にするといいと思うよ
こうするとvscodeの一部のショートカットの挙動がびみょくなるかもだから、
そのときはvscodeのkeyboard shortcutsをいじったら治るよ

# その他
パソコンが物故割れても責任は取れませんTT
なにか質問があればどうぞ。