HHKB 風 AutoHotKey 設定 (Windows & JIS 配列)

![edited14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232067/0f28f07a-dace-ee01-912c-d295bbdca61a.png)
![edited16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232067/bc0bac7a-4aac-27b1-2130-2f041853c17b.png)
キーボード操作を効率化するため、AutoHotKey というツールを用いて HHKB (Happy Hacking Keyboard) 風のキー割り当てを行う設定をしてみました。

ここでは自分が所持している **JIS 配列**キーボードの配列をもとに記述するため、細かく配列が異なる JIS 配列等では適宜読み替えてください。
US 配列はここでは扱いません。

ここでは OS は Windows を想定しています。

# 1. 基本的な IME やカーソル移動等に関するキー操作

まずキー入力を AutoHotKey でカスタマイズする前に、基本的にアプリケーションによらない、文字入力に関するショートカットやキー操作を確認しておきます。

## 1.1. キーボード配列

ショートカットキーの類はまずキーの配置を覚えていないと効率化できないので、キーの配置を確認します。

以下は JIS 配列の例です。

|左手|||右手||
|:-:|:-:|:-:|:-:|:-|
|1 2 3 4|5|6|7 8 9 0|- ^ \|
|q w e r|t|y|u i o p|@ [|
|**a s d f**|g|h|**j k l ;**|: ]|
|z x c v|b|n|m , . /|\|

|左手|||右手||
|:-:|:-:|:-:|:-:|:-|
|! " # $|%|&amp;|' ( )&nbsp;&nbsp;|= ~ &#124;|
|Q W E R|T|Y|U I O P|` {|
|**A S D F**|G|H|**J K L +**|* }|
|Z X C V|B|N|M < > ?|_|

![edited02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232067/868264d0-f03f-8919-6f1a-fc841db56e3b.png)
![edited04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232067/eccf5ad0-49d9-1505-f3e4-cd200c827d8d.png)
※ JIS 配列であっても細かい配列が異なることがあります。
※ここでは「Ctrl」と「Caps Lock」・「英数」を入れ替えたキーボードを想定しています。
※ここでは円マークとバックスラッシュを同じものとして表記します。

詳細は別記事にしました。

参考「[キーボードのキーの配置と指 (Windows & JIS 配列) - Qiita](https://qiita.com/kerupani129/items/4cc3aeb1d87a252be4c7)」

## 1.2. IME のキーボードショートカット

※ IME やその設定によってキーが異なることがあります (**初期設定で無効化されている場合も有り**) 。
※ここでは後のことを考えて、基本的に**ファンクションキー、「半角/全角」、「英数」・「Caps Lock」、「無変換」、「変換」、「ひらがな」・「カタカナ」は使用しない**ことにします (「Shift + 無変換」はここではとりあえず使用) 。

|押すキー|目的|
|---|---|
|Ctrl + スペース|半角/全角入力切り替え<br>(「半角/全角」キーや「英数」キーと同じ)|
|Shift + 無変換|半角英数/全角英数入力切り替え|
|Shift + スペース|別幅スペース|
|Ctrl + t|半角英数字に変換<br>(「F10」キーと同じ)|
|Ctrl + u|ひらがなに変換<br>(「F6」キーと同じ、「無変換」キーや「ひらがな」キーの代わり)|
|Ctrl + i|全角カタカナに変換<br>(「F7」キーと同じ、「無変換」キーや「Shift + ひらがな」(「カタカナ」) の代わり)|
|Ctrl + o|半角カタカナに変換<br>(「F8」キーと同じ、「無変換」キーの代わり)|
|Ctrl + p|全角英数字に変換<br>(「F9」キーと同じ)|
|スペース|変換<br>(確定前の「変換」キーと同じ)|
|Win + /|再変換<br>(「変換」キーと同じ)|
|Esc|確定前の入力文字列削除|

「u i o p」は横に並んでいて、さらに 1 つ間をあけて「t」があるので、位置も覚えやすいです。

- 半角英数字で入力したいのに間違えてひらがなを入力してしまったとき
    - 確定前に「Ctrl + t」で半角英数字に変換
- 一度変換してしまったが、やっぱりひらがなに戻したいとき
    - 確定前に「Ctrl + u」でひらがなに変換
- カタカナに変換したいとき
    - 「Ctrl + i」でカタカナに変換
- 全角英数字に変換したいとき、または「かな入力」時に特定の記号を入力したいとき
    - 「Ctrl + p」で全角英数字に変換

参考「[Microsoft 日本語 IME](https://support.microsoft.com/ja-jp/windows/microsoft-%E6%97%A5%E6%9C%AC%E8%AA%9E-ime-da40471d-6b91-4042-ae8b-713a96476916)」(※「Esc」キーに関しては未掲載)

## 1.3. カーソル移動のキー操作

|押すキー|目的|
|---|---|
|←<br>→|文字単位の移動|
|↓<br>↑|表示行の移動|
|Ctrl + ←<br>Ctrl + →|単語単位の移動|
|Home|行頭へ移動|
|End|行末へ移動|
|Ctrl + Home|先頭行の行頭へ移動|
|Ctrl + End|最終行の行末へ移動|

また、「Shift」キーを押しながらカーソル移動すると範囲選択になります (単語単位や行頭・行末への移動を含む) 。

アプリケーションによっては「Ctrl」と「Backspace」または「Delete」によって、単語単位の削除ができることがあります。

|押すキー|目的|
|---|---|
|Ctrl + Backspace<br>Ctrl + Delete|単語単位の削除|

## 1.4. その他、文字入力に関する一般的なキーボードショートカット

|押すキー|目的|
|---|---|
|Ctrl + z|操作を取り消す (元に戻す)|
|Ctrl + x|選択したものを切り取る|
|Ctrl + c|選択したものをコピーする|
|Ctrl + v|切り取りまたはコピーしたものを貼り付ける|
|Ctrl + a|全てを選択|
|Ctrl + y|操作を再実行する (取り消しを取り消す、やり直す)|

※他にも便利なショートカットキーは沢山ありますが、ここでは特に文字入力に関係するものをまとめています。

参考「[Windows のキーボード ショートカット](https://support.microsoft.com/ja-jp/windows/windows-%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88-dcc61a57-8ff0-cffe-9796-cb9706c75eec)」
参考「[Chrome のキーボード ショートカット - パソコン - Google Chrome ヘルプ](https://support.google.com/chrome/answer/157179?hl=ja)」(本記事の内容とは関係ありませんが、参考に)

# 2. Scancode Map の設定

("Scancode" 表記も "Scan Code" 表記もある模様？)

AutoHotKey は高機能なキーの割り当てが可能ですが、一部のキーを正しく扱うことができません。
そこで、Windows が提供している Scan Code Mapper の機能を用いて一部のキーを他のキー入力に置き換えます。

詳しくは別記事にしました。

参考「[AutoHotKey で正常に扱えないキーとその対策 - Qiita](https://qiita.com/kerupani129/items/d7894dbf789758f05e12)」

## 2.1. 置き換えるキー

ここでは以下のようにキーを置き換えます。

|置き換え前|置き換え後|
|-|-|
|sc070&nbsp;&nbsp;&nbsp;&nbsp;カタカナ・ひらがな|sc06D&nbsp;&nbsp;&nbsp;&nbsp;F22|
|sc029&nbsp;&nbsp;&nbsp;&nbsp;半角/全角|sc06E&nbsp;&nbsp;&nbsp;&nbsp;F23|
|sc03A&nbsp;&nbsp;&nbsp;&nbsp;Caps Lock・英数|sc076&nbsp;&nbsp;&nbsp;&nbsp;F24|

ファンクションキー F13 ～ F24 のスキャンコードに関して記述している公的な文書は (おそらく) ないため、正当性を確かめるには各自で検証するしかありませんが、とりあえず自分が調べたスキャンコードを記載しておきます。

|SC|Key|
|---|---|
|0x0064|F13|
|0x0065|F14|
|0x0066|F15|
|0x0067|F16|
|0x0068|F17|
|0x0069|F18|
|0x006A|F19|
|0x006B|F20|
|0x006C|F21|
|0x006D|F22|
|0x006E|F23|
|0x0076|F24|

※ F13 ～ F23 はスキャンコードが連番になっていますが、**F24 は連番になっていません**。

## 2.2. レジストリの編集

簡単にレジストリを変更するためのレジストリ登録エントリファイル (拡張子 .reg) を作成しました。

<font color="red">**※レジストリの内容を変更することには変わりないため、使用は自己責任でお願いします。**</font>

```text:scancode-map-3-keys.reg
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,04,00,00,00,76,00,3a,00,6e,00,29,00,6d,00,70,00,00,00,00,00
```

※レジストリ編集後に PC の再起動が必要。
※元に戻すには上記のレジストリキー `Scancode Map` を削除。
※当たり前のことですが、既に `Scancode Map` の設定がされていた場合に上記の reg ファイルを実行するとその設定が全て上書きされてしまうため、必要に応じて「[Change Key](https://forest.watch.impress.co.jp/library/software/changekey/)」等のツールを使用する等で対処して下さい。

参考「[「Change Key」非常駐型でフリーのキー配置変更ソフト - 窓の杜](https://forest.watch.impress.co.jp/library/software/changekey/)」

レジストリに登録するデータの内容は以下の通りです。

|データ|説明|
|---|---|
|00 00 00 00<br>00 00 00 00<br>04 00 00 00|ヘッダ: バージョン<br>ヘッダ: フラグ<br>ヘッダ: マッピング数|
|76 00 3a 00|sc03A → sc076 (Caps Lock・英数 → F24)|
|6e 00 29 00|sc029 → sc06E (半角/全角 → F23)|
|6d 00 70 00|sc070 → sc06D (カタカナ・ひらがな → F22)|
|00 00 00 00|NULL 終端|

※データはリトルエンディアンです。
※「マッピング数」は「NULL 終端」込み。

参考「[Scan code mapper for keyboards - Keyboard and mouse class drivers - Windows drivers | Microsoft Docs](https://docs.microsoft.com/en-us/windows-hardware/drivers/hid/keyboard-and-mouse-class-drivers#scan-code-mapper-for-keyboards)」

# 3. HHKB 風 AutoHotKey 設定

(モデルによりますが) ファンクションキーだけでなくカーソルキーすらないことで有名 (？) な HHKB (Happy Hacking Keyboard) というキーボードが存在します。

「Fn」キー押し下げ時、方向キーを含め様々なキーを割り当てることによってキーボードの物理的な範囲をコンパクトにでき、指の移動量を小さくできます。

参考「[Happy Hacking Keyboard | キー配列 | PFU](https://www.pfu.fujitsu.com/hhkeyboard/leaflet/hairetu.html)」

## 3.1. キー割り当て

「半角/全角」キーは使わずに「Ctrl + スペース」で日本語入力を切り替えることにしたので、**「半角/全角」を「Esc」に**置き換えます。

基本的にキーボードの物理的な「Fn」キーは (OS 含め) ソフトウェア側で入力イベントを捕捉できないため、AutoHotKey を用いて HHKB 風のキーマップをするにいずれかのキーを疑似的な「Fn」キーとして扱う必要があります。
候補としては「Caps Lock・英数」「左 Ctrl」「無変換」「変換」「カタカナ・ひらがな」「右 Ctrl」等が考えられますが、ここでは**一番左下の「Caps Lock・英数」キーをを疑似的な「Fn」キーに**割り当てることにします。

Vim を使っていると「h j k l」の方がカーソル移動しやすいため**方向キーを「h j k l」に**割り当て、周辺のキー配列を HHKB 本来の配列から移動しました。

また、個人的に、左手だけで「Insert」「Delete」「Enter」を入力したいことがあるため、追加でキーマップしました。

※**「Caps Lock・英数」と「左 Ctrl」が本記事での説明と逆の場合**は、**「F24」を「LCtrl」に、「LCtrl」を「疑似的な Fn」に**割り当ててください。
![edited14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232067/0f28f07a-dace-ee01-912c-d295bbdca61a.png)
![edited16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232067/bc0bac7a-4aac-27b1-2130-2f041853c17b.png)
※橙色のキー名はテンキー扱い。

## 3.2. AHK スクリプトファイル

※ AutoHotKey に関する詳しい説明はここではしませんので、各自で調べてください。
※**「Caps Lock・英数」と「左 Ctrl」が本記事での説明と逆の場合**は、**「F24」を「LCtrl」に、「LCtrl」を「疑似的な Fn」に**割り当ててください。

```text:HHKBJPLike-HJKL.ahk
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

; 
; カタカナ・ひらがな: F22
; 
F22::sc070 ; カタカナ・ひらがな

; 
; 全角/半角: F23
; 
F23::Esc

; 
; Caps Lock・英数: F24
; 
; F24::LCtrl

; 
; 疑似的な Fn: F24
; 
F24 & 1::send, {Blind}{F1}
F24 & 2::send, {Blind}{F2}
F24 & 3::send, {Blind}{F3}
F24 & 4::send, {Blind}{F4}
F24 & 5::send, {Blind}{F5}
F24 & 6::send, {Blind}{F6}
F24 & 7::send, {Blind}{F7}
F24 & 8::send, {Blind}{F8}
F24 & 9::send, {Blind}{F9}
F24 & 0::send, {Blind}{F10}
F24 & -::send, {Blind}{F11}
F24 & ^::send, {Blind}{F12}
F24 & \::send, {Blind}{Insert}
F24 & Backspace::send, {Blind}{Delete}

F24 & p::send, {Blind}{PrintScreen}
F24 & @::send, {Blind}{ScrollLock}
F24 & [::send, {Blind}{sc045} ; Pause / Break

F24 & sc027::send, {Blind}{Home} ; セミコロン
F24 & /::send, {Blind}{End}
F24 & sc028::send, {Blind}{PgUp} ; コロン
F24 & sc073::send, {Blind}{PgDn} ; バックスラッシュ

F24 & h::send, {Blind}{Left}
F24 & l::send, {Blind}{Right}
F24 & k::send, {Blind}{Up}
F24 & j::send, {Blind}{Down}

F24 & Tab::send, {Blind}{CapsLock} ; 「英数」でない単独の「Caps Lock」

F24 & n::send, {Blind}{NumpadAdd}
F24 & m::send, {Blind}{NumpadSub}
F24 & ,::send, {Blind}{NumpadMult}
F24 & .::send, {Blind}{NumpadDiv}

F24 & Enter::send, {Blind}{NumpadEnter}

; 
; 物理カーソルキーはここでは非割り当て
; 

; 
; その他追加
; 
; 疑似的な Fn: F24
; 
F24 & a::send, {Blind}{Insert}
F24 & z::send, {Blind}{Delete}

F24 & Space::send, {Blind}{Enter}
```

## 3.3. AutoHotKey の自動起動設定

Windows のスタートアップに登録することで、PC 起動時にスクリプトを自動起動できます。

Windows のスタートアップフォルダの開き方 (いずれか 1 つのパスを指定してディレクトリを開く):

- `C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup`
- `%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup`
- `%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup`
- `shell:startup`

AHK ファイルの既定のアプリが AutoHotKey の実行バイナリに設定されている場合は、AHK ファイルのショートカットをスタートアップフォルダに追加します。

AHK ファイルの既定のアプリが AutoHotKey の実行バイナリに設定されて**いない**場合 (テキストエディタになっている場合等) は、AutoHotKey の実行バイナリのショートカットを作成し、「プロパティ」の「リンク先」を編集してコマンドライン引数にスクリプトファイルのパスを追加します。
例: `C:\usr\lib\AutoHotkey_1.1.33.09\AutoHotkeyU64.exe "C:\usr\lib\AutoHotkey_1.1.33.09\HHKBJPLike-HJKL.ahk"`

## 3.4. AutoHotKey 設定後のキー配列

### 3.4.1. キー配列

通常状態:
![edited14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232067/0f28f07a-dace-ee01-912c-d295bbdca61a.png)
Shift 押下状態:
![edited18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232067/bdede2da-f82d-a59e-552e-cf046b0b827d.png)
疑似 Fn (ここでは F24) 押下状態:
![edited16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232067/bc0bac7a-4aac-27b1-2130-2f041853c17b.png)
※橙色のキー名はテンキー扱い。
※疑似 Fn & Shift 押し下げ時は、Shift キーに加えて、疑似 Fn 押し下げ状態のキーが押されている扱い。

### 3.4.2. 押す指

赤色は親指、水色は人差し指、緑色は中指、黄色は薬指、紫色は小指です。
白色は基本的には小指です。
臨機応変に別の指で押すこともあります。

通常状態:
![edited13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232067/1c5bae68-a64e-3440-31cd-8977d74bb6d0.png)
Shift 押下状態:
![edited17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232067/cff755db-b230-a2fa-7ea7-179e8871d3ad.png)
疑似 Fn (ここでは F24) 押下状態:
![edited15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232067/9075a333-e156-07eb-baba-a0eb8c713610.png)
※橙色のキー名はテンキー扱い。
※疑似 Fn & Shift 押し下げ時は、Shift キーに加えて、疑似 Fn 押し下げ状態のキーが押されている扱い。