Windows/Mac/Ubuntuでvim-likeなカーソルキーバインド登録まとめ

# この記事の概要
Windows や Ubuntu で普段使いをしているときに、カーソルキーに手を持っていくのがめんどくさくないですか？わざわざ右下まで手を持っていかなければいけません。そこで、**vim のようにカーソルキーを設定する方法** を紹介したいと思います。
Windows と Ubuntu の GUI を普段両方使うことがあるので、ここで情報をまとめておきたいと思います。

# この記事の対象者・おすすめの人
[Requirements]
- Windows / Mac / Ubuntu の使用者
- vim のようなカーソルキー設定が欲しい人

[Preference]
- (私のような) HHKB の使用者
- キーボードを自分好みに魔改造したい方

# 主題
### 概要
1. 自分の設定するキーコードを理解する
2. 設定したいキーコードをキーバインドのファイルに書き込む
3. 保存、適用する
4. 起動時に自動で変更が適用されるように設定する

いずれにしても以上の手順で試せばよい。

## Windows での設定方法
### 1. AutoHotkey を導入
[AutoHotkey](https://www.autohotkey.com) をダウンロード・インストールを実行．

### 2. AutoHotKey のスクリプトを書く
```
; 左 Ctrl キーの仮想キーコードをエイリアスしてるだけなので直書きでも OK
; ちなみに vk1D は無変換キーに対応
; 変換キーにしたい場合は vk1C
LCtrl := "vk1D"

; 左Ctrlキーとhjklキーの組み合わせ
LCtrl & h::Send, {Blind}{left}
LCtrl & j::Send, {Blind}{down}
LCtrl & k::Send, {Blind}{up}
LCtrl & l::Send, {Blind}{right}
```

### 3. スクリプトを指定して実行
あとは Optional でスタートアップのディレクトリにこのスクリプトを配置すると，いちいち起動時にスクリプトを起動して設定しなくても済む．

## Mac での設定方法
### 1. Karabiner-Elements を導入
[Karabiner-Elements](https://karabiner-elements.pqrs.org) からダウンロード・インストールを実行して，導入する．

### 2. Simple Modification を確認
HHKB など外部キーボードを使用している場合はここで HHKB が刺さっていることを確認．
[IBUKISH LAB+ SELF-PROPELLED](https://memoribuka-lab.com/?p=3329) さんのブログで International という HHKB 特有のキーの配置を知ることができたので，これを参照する．
(ちなみに[リンク](https://www.pfu.fujitsu.com/hhkeyboard/lineup/pdkb420b.html)が切れていたのでこちらでもキー配置画像を転載させていただきます．)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711990/21150889-d85a-4633-4442-822fbff8f4b4.png)
ここで，私の場合は `International 4` を Mode_switch として `left_control` にするべく設定．

### 3. Complex Modification を確認
2 で設定が終わったら，ここでやることは
1. 英数・かなキーを toggle 方式にする
1. Left ctrl + hjkl to arrow keys Vim
を設定する．
これらはそのまま `Add predefined rule` から導入可能．便利．

### 4. (Optional) hjkl 以外に変更する場合
個別に編集することが可能．`Edit` というマークがあるので，そこを開くと辞書型の設定ファイルが開かれるので，個別に編集をしてやればよい．ちなみに `;` を設定する場合は，`semicolon` とするひつようがある．`;` のままでは文字・記号として認識されないので注意．
ちなみに HHKB の左下のキーは `grave_accent_and_tilde()` なので，私はこれを `かな/英数` の toggle キーに設定している．


## Ubuntu での設定方法

### 1. 自分の設定するキーコードを理解する
コマンドラインで以下のコマンドを叩く。
```
$ xev
```
すると、白いウィンドウが表示されて、マウスオーバーするとその座標情報を取得するし、キーを入力すればそのキーの情報を取得することができる。例えば、私の場合は **表示されたウィンドウが選択された状態で** `h` を押すと、以下のような表示を得られました。
なお、ここでは以下の出力と**全く同じ表示である必要はありません**。
```
$ KeyRelease event, serial 37, synthetic NO, window 0x3400001,
    root 0x1c7, subw 0x0, time 3830646, (2231,638), root:(2351,752),
    state 0x10, keycode 43 (keysym 0x68, h), same_screen YES,
    XLookupString gives 1 bytes: (68) "h"
    XFilterEvent returns: False
```
この表示から、`h` キーは `keycode 43` であることがわかる。
同様に、vim のカーソルキーとして `h`, `j`, `k`, `l` を押せばその値が得られる。
また、私の場合は無変換キーを一緒に押すことでカーソルとしたいと思います。例えば、HHKB の `無変換` キーと `h` を一緒に押すことでカーソルとしたい場合、この一緒に使用するキーの keycode もメモしておきましょう。

### 2. 設定したいキーコードをキーバインドのファイルに書き込む

keycode XX = [キーを押した時] [Shift+キーを押した時] [Mode_switch+キーを押した時] [Mode_switch+Shift+キーを押した時]
参考程度に，私の場合は `j` `k` `l` `;` で設定したので以下の通り．`;` を設定する場合は，`semicolon` とするひつようがある．`;` のままでは文字・記号として認識されないので注意．
```
clear Lock
remove Control = Mode_switch
keycode 44 = j J Left Left
keycode 45 = k K Down Down
keycode 46 = l L Up Up
keycode 47 = semicolon plus Right Right
```

### 3. 保存、適用する
```
$ sudo xmodmap ~/.Xmodmap 
```

### 4. 起動時に自動で変更が適用されるように設定する
.xinputrc ファイルを作成して以下の内容を記す。
```.xinputrc
if [ -f ~/.xmodmap ] ;then
	xmodmap ~/.modmap
fi
```

# さいごに
HHKB で vim-like に設定するならどうせ無変換キーを Mode_switch キーに設定するんだから， `h` `j` `k` `l` よりも `j` `k` `l` `;` の方が手が自然に置けて使いやすくない？という vimmer としての悩み，みなさんありませんかね．

# References
https://www.milkmemo.com/entry/ubuntu_cursor_idou
https://kenbeese.hatenablog.com/entry/20120214/title