英語配列キーボードで日本語入力と英語入力を切り替えやすくしたい (3) AHKレイヤー編

# はじめに

英語配列キーボードで日本語入力と英語入力を切り替えやすくしたい 方法をいくつか考えて、AutoHotKey で `[左Alt]` `[右Alt]` 別のキーに `[無変換]` `[変換]` を割り当てるところまで行いました。一応は目標達成。

その中で自作コンパクトキーボードの入力方法について調べていると、レイヤーが良い感じそうに思えました。せっかく AutoHotKey を使っていますし、それっぽいことをしてみましょうかと。

<del>ぼくのかんがえたさいきょうのキーボード配列</del> 練っていません。これを参考に、キーボード配列を変えるのはそんなに特別なことじゃないと感じて、自作キーボード以外でも使いやすい配列を設定する方が出てくると良いなと。


# 要求

どんなレイアウトにしたいか、私の場合やりたいことを整理します。

* `[Fn]` キーを押しながら他のキーを押すと、別のキー入力になる
* `[Fn]` キーのロックは無し
  * IME オン/オフ 状態だけでも覚えていなくて対策しようとしているのに……
* 右手小指で押しづらいキーを、`[Fn]` キーを押しながらホームポジション近くで押せるようにしたい
  * `[BS]` `[\]` が筆頭、次いで `[Enter]` `[-]` `[+]` 
* 手を大きく動かして押すキーのなかで良く使うものを、`[Fn]` キーを押しながらホームポジション近くで押せるようにしたい
  * `[F1]`～`[F12]`, `[Home]`, `[End]`, `[PgUp]`, `[PgDown]`, `[PrintScreen]` あたり
* `[Fn]` で使えるキーに対しても、`[Ctrl]`, `[Alt]`, `[Shift]` 同時押しが同じように効いてほしい
  * `[Fn]+[P]` を `[PrintScreen]` に割り当てたときには、`[Alt]+[Fn]+[P]` = `[Alt]+[PrintScreen]` として動くように
* 手を大きく動かして押すキーのなかで良く使うものを、`[Fn]` キーを押しながらホームポジション近くで押せるようにしたい
  * `[F1]`～`[F12]`, `[Home]`, `[End]`, `[PgUp]`, `[PgDown]`, `[PrintScreen]` あたり
* `[Fn]` キーは押しやすくミスタッチしにくい場所にしたい
* `[←]` `[↓]` `[↑]` `[→]` は必要ならカーソルキーを使うことにして、最低限動かせれば十分
  * `[Ctrl]+[Alt]+[↑]` みたいなことを VS Code でよく行います。`[↑]` を `[Fn]+[A]` みたいにすると 4つ同時押しになって大変。私はこれが理由でカーソルレスのコンパクトキーボードに手を出しにくいです。
* 覚えやすいレイアウトにしたい ★
* スクリプトの一時停止を、タスクバーの通知領域を使わずに行いたい
  * うっかり `[Shift]` キーなどが押しっぱなしになることがあります。そのときはこの手順で回避できます
* せっかくだからちょっとしたマクロをワンボタンで実行できるようにしたい
  * `[Ctrl]+[Shift]+[V]` のないアプリでもテキスト形式で貼り付けできるように、とか


覚えやすいレイアウトって大事です。覚えられなければ使えませんから。たとえばカーソルキーを割り当てるなら `[W]` `[A]` `[S]` `[D]` や `[H]` `[J]` `[K]` `[L]` が定番でしょう。

`[Fn]` を同時に押したときのキー配置をキーボードを見て探すのは、Happy Hacking みたいにキーにあらかじめ印字してあるとかでもなければ難しいです。馴染みのあるレイアウトがあれば、それをベースにするのが良いと思います。


# 実装してみた

わたしの場合、漢字変換中にホームポジションから移動しないように、ショートカットキーをある程度覚えていました。こちらを参考にレイアウトしてみました。 

本レイアウト \
![man-f13-layer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118172/2f307d7a-17b2-6c0e-6c9a-89ea5fd13df1.png)

参考: Google 日本語入力 MS-IME キー設定 [^1]\
![man-ime.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118172/a18a3ee0-6df9-1220-7550-16886f1a52e8.png)

[^1]: [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) も同じようなショートカットがあるはずですが、公式ドキュメントにありません。なぜ日本語入力の説明なのに機械翻訳……。


## 基本キー

* 左手小指で押しやすい `[CapsLock]` を、`[Fn]` 相当にしました
  * `[CapsLock]` は一等地にあるにも関わらず使用頻度が低く [^2]、別の機能割り当て候補になりやすいです
  * `[CapsLock]` と `[Ctrl]` を入れ替えるというのが使いやすさを上げる定番です。Happy Hacking がそうです。しかし、`[Ctrl]+[Alt]` が押しにくくなるといのは困ると思い、ここは変えていません。
* カーソル: IME にだいたい揃え `[E]` `[S]` `[D]` `[X]` と `[O]` `[K]` `[L]` `[,]` にしました
  * 定番は `[W]` `[A]` `[S]` `[D]` と言ったばかりですが、左手小指を他で使っているときに、左小指担当のはずの `[A]` を別の指で押して左に移動する、というのは大変でした
  * `[Home]` `[End]` `[Del]` `[BS]` の場所はそのまま残したかった、というのも理由
    * `[Home]` は `[←]` より左、 `[End]` は `[→]` より右というのは直感的ですし、`[Del]` `[BS]` が隣り合っているのも分かりやすい 
* 大きくスクロールするときに使う `[PgUp]` `[PgDn]` を `[↑]` `[↓]` と関連しそうな隣に置きました
* `[F1]`～`[F12]` は定番の場所に
  * Excel でセルの編集 `[F2]` とか、開発環境でステップ実行 `[F10]` などとか、DevTools `[F12]` とか、意外と使っていることに気づきました
* `[-]` `[=]` `[\]` を右手小指の届きやすい場所に [^2]
* `[Pause]` でスクリプトを一時停止

[^2]: 英語キーボードの `[CapsLock]` は使用頻度が低いと思います。すべて大文字の長文を書きたいとかでもなければ。日本語キーボードの `[英数]` は `[半角/全角]` とだいたい同じ機能でずっと押しやすい場所にあり、重宝します。

[^2]: 長音の入力が多い日本語入力だと、右手小指のホームポジションは `[;]` でなく `[P]` だと思っています

1か月くらい試したところ、とくによく使っているのは `[Enter]` `[BS]` `[←]` の 3つ。これだけでも元を取っている感じです。や、押しやすい英語配列キーボードでもホームポジションを崩しがちというのは、右手小指が不器用なのかも(汗)。

`[Enter]` `[BS]` をこれでも押すようになって、日本語配列キーボードのデメリットの1つだった右手小指の届きにくさが、あまり気にならなくなりました。


## マクロ

キーボード ファームウェアではできないマクロにも対応しました。


### 英語で確定

うっかり IME オンのまま good と入力すると 「ごおｄ」と出てガッカリです。これを確定前に気づくと、 `[Ctrl]+[T]` で英語の変換候補にして、`[Enter]` で確定して、次は間違えないように `[無変換]` を押す、というコンボを実行します。面倒。

この一連の操作を `[Fn]+[T]` に登録しています。便利。や、うっかり IME オンのまま入力しないことがもっと良いのですが ;

![convert-mistakes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118172/8b44c08f-5462-4d57-38c2-c8991877cc7e.png)

まあでも、これを多用すると予測入力が荒れます; おとなしく「ごおｄ」を `[Esc]` でなかったことにして、入力しなおすのが早いです。

MS-IME だと プライベート モード `[Ctrl]+[Shift]+[F10]` を挟むことで、誤変換が予測変換に入らなくなります。これが安定して使えるなら便利ですけれど、たまにプライベート のまま戻らないことがありました。高速にオン/オフを切り替えるって普通やらないでしょうし。


### 日付入力

`[Fn]+[\]`: 2021-04-01 のような日付をまとめて入力します。Excel `[Ctrl]+[;]` で 2021/4/1 のような日付を入力するのと同様です。

2021-04-01_memo.txt みたいな名前を付けることが多いと、すぐに入力できるのは便利です。スラッシュはファイル名に使えなくて苦手です。

Google 日本語入力では「きょう」を漢字変換すると候補に出てきます。マクロがなくても少し不便なだけで済みます。

`[\]` の場所にとくに理由はありません。区切りっぽく、`[Enter]` に近い場所、というくらいです。


### テキスト形式で貼り付け

`[Fn]+[V]`: テキスト形式で貼り付けます。 `[Ctrl]+[V]` に関連して、です。

書式付きコピーできるアプリが増えています。テキストだけ貼り付けようとすると、書式を落とすため一度メモ帳に貼り付けてから、もう一度コピーというのが定型作業。リッチな情報は嬉しいこともありますけれど、かえって不便になることもありますよね……。 [^3]

[^3]: [Announcing Windows 10 Insider Preview Build 21318 \| Windows Insider Blog](https://blogs.windows.com/windows-insider/2021/02/19/announcing-windows-10-insider-preview-build-21318/) Windows 10 Ver.21H2以降? での改善に期待です。ちょっとだけマッチポンプな香りもしつつ;


## 入手方法・コード

[hossy3/ahk\-f13\-layer](https://github.com/hossy3/ahk-f13-layer) GitHub に置きました。



```
#NoEnv

; Options
TapF13ToCapsLock := False
TapF13ToEisu := False
ApplyAlphabetPrivately := False ; for MS-IME


SendMode Input
SetKeyDelay, -1

F13State := "Off" ; Off | Tapping | Pressing

F13 & a::Home
F13 & b::Return
F13 & c::PgDn
F13 & d::Right
F13 & e::Up
F13 & f::End
F13 & g::Delete
F13 & h::BackSpace
F13 & i::Return
F13 & j::Return
F13 & k::Left
F13 & l::Right
F13 & m::Enter
F13 & n::Return
F13 & o::Up
F13 & p::PrintScreen
F13 & q::Return
F13 & r::PgUp
F13 & s::Left
F13 & t::
    If ApplyAlphabetPrivately
        Send, +^{F10}^t^m+^{F10}{vk1D} ; NonConvert
    Else
        Send, ^t^m{vk1D} ; NonConvert
    Return
F13 & u::Return
F13 & v::
    clipboard = %clipboard%
    Send, ^v
    Return
F13 & w::Return
F13 & x::Down
F13 & y::Return
F13 & z::Escape

F13 & 1::F1
F13 & 2::F2
F13 & 3::F3
F13 & 4::F4
F13 & 5::F5
F13 & 6::F6
F13 & 7::F7
F13 & 8::F8
F13 & 9::F9
F13 & 0::F10
F13 & -::F11
F13 & =::F12

F13 & [::Return
F13 & ]::Return
F13 & \::Send %A_YYYY%-%A_MM%-%A_DD%
F13 & `;::-
F13 & '::=
F13 & ,::Down
F13 & .::Return
F13 & /::\

F13 & Tab::CapsLock
F13 & AppsKey::RAlt
F13 & vk13::Suspend ; Pause/Break

#If (TapF13ToCapsLock || TapF13ToEisu)
~*F13::
    If (F13State = "Off") {
        F13State := "Tapping"
        KeyWait, F13, T0.2
        If ErrorLevel
            F13State := "Pressing"
        Else If TapF13ToCapsLock
            Send {Blind}{CapsLock}
        Else If TapF13ToEisu
            Send {Blind}+{CapsLock}
        F13State := "Off"
    }
    Return
#If
```


# 最後に

キーボード配列の3本のエントリは以上となります。ほとんどネタの、Qiita 初投稿でした。 <del>今日はエイプリルフールです。</del>

それでは、楽しいキーボードライフを。