ステップ実行専用キーボード

# はじめに

こーゆーボタンを作りたい！

![PXL_20231223_142552490.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104360/d6ef1ec0-1f4d-1790-dfdf-7f57cb693004.jpeg)

# 背景

いろんな開発環境を使っていて、ショートカットの違いに苦労しております。

特に、ステップ実行の際にどのボタンを押すんだっけ？ となってしまいます。

サーバ側がeclipseで、クライアント側が IntelliJ で並行してステップ実行しながらデバッグすることがあり、キーバインドに気を取られて思考が邪魔されてしまうのを避けたい。

そこで、いろんな開発環境でこのボタンは絶対にstep-over, step-in, step-out になる、というようなキーボードを用意しよう！ という話です。

なお、Windows 前提です。

# 方針

普通にショートカットキーをカスタマイズして、各開発環境で同じキーバインドにするという方法もあるでしょう。

しかし、いろいろ辻褄を合わせるのが大変そうというか面倒です。

新たにキーを増やして、それに step-over, step-in, step-out を割り当てることにします。

（その方が面倒なのではないかと言う意見は置いといて。）

既存の割り当てとぶつからないようにするため普通存在しないキーコードを発生させたいので、F13～F24 を押したことにできるキーボードが必要です。

# キーボード選定

step-over, step-in, step-out の3つを使いたいので、3キーで十分です。

そんな製品は存在しなく、自作キーボードの世界に足を踏み入れなきゃいけないかなと思いましたが、探してみると意外に製品がいろいろ売られてました。

ノブがついているものもあります。音量に割り当てられるようです。それって地味に便利かも。動画の音量が違うことって良くあるので調整したいですよね。

価格・設置スペースなどを考慮して6ボタン＋1ノブのものを選びました。

AliExpress で2,277円でした。

![Programming-Macro-Keyboard-RGB-Custom-Knob-Keyboard-Copy-Paste-Photoshop-Game-Keyboard-3-6-12-Key.jpg_640x640.jpg_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104360/bf9e6bca-ec6d-af31-4446-3975448e1ef4.jpeg)

https://www.aliexpress.com/item/1005004803754698.html

AMAZON でも似たようなものが売られてますが、うっかりすると中国発送で AliExpress で買うのと納期が変わらなかった、ということになりがちなので注意しましょう。

# キーボード設定

入手したものは、すべてのキーが "c" に割り当てられてました。ノブを回しても押しても c が入力されます。

メインのチップは CH522G と書いてあります。ミニキーボードではよく使われているもののようです。

設定ツールは販売元に問い合わせてくださいということになっています。似たような商品のレビューを見ると、Google Drive からダウンロードさせられてぁゃιぃとかなんとか。

問い合わせてみるも休日のせいか返事がないので、自力で探してきました。

![2023-12-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104360/2c53d32a-c9c3-3b40-c704-a8839683d4a3.png)

設定ツールを見ると F13～F24 の割り当てができないようです・・・

それは困る。

チップ名やPCBのシルクやUSBのVIDなどを頼りにググりまくったところ、割と簡単な通信で設定できるようです。ただ、簡単とはいえWindowsじゃない環境用の設定ツールを作りましたみたいな話で、Mac や Linux が必要です。

MacやLinuxの環境はあるにはあるのですが、Windowsでやりたいです。（Windowsだけでできるよと言う記事を書きたいし）

さらにググりまくって、野良設定ツールを発見しました。

https://github.com/kriomant/ch57x-keyboard-tool

名前に ch57x が入ってますが、 CH522G チップのキーボードでも使えました。

USBのVIDが0x1189になっているミニキーボードなら使えるんじゃないでしょうか。知らんけど。

Windows のほかに mac, Linux 用のバイナリもあります。

設定ファイルは以下のようにしました。

```f13-18.yaml
orientation: normal

rows: 2
columns: 3
knobs: 1

layers:
  - buttons:
      - ["F16", "F17", "F18"]
      - ["F13", "F14", "F15"]
    knobs:
      - ccw: 'volumedown'
        press: 'mute'
        cw: 'volumeup'
```

6つのキーを F13～F18 に割り当て、ノブの回転を音量、押し込みをミュートに割り当ててます。

具体的な使い方については省略します。ステップ実行しようとしている読者さんなら分かるよね？？？

# キーマップアプリ

キーマップアプリと言うと [Change Key](https://forest.watch.impress.co.jp/library/software/changekey/) が有名なんじゃないかと思います。しかしこれはレジストリをいじるタイプで、実行中のアプリによってキーマップを変えることができません。

使用しているアプリによってキーマップを変えられるものは以下の2つを見つけました。

- [PowerToys](https://learn.microsoft.com/ja-jp/windows/powertoys/) の [Keyboard Manager](https://learn.microsoft.com/ja-jp/windows/powertoys/keyboard-manager)
- [AutoHotKey](https://www.autohotkey.com/)

PowerToys の方は、ショートカットじゃない単押しに対してアプリ毎の設定をすることができないという謎の制約があり、やりたいことが実現できませんでした。

ここでは AutoHotKey を採用します。

AutoHotKey は v1 と v2 があり、スクリプト言語の仕様がガラっと変わっているようです。

v1 時代の[日本語wiki](https://ahkwiki.net/Top)がありますが、更新が止まっているようです。

複雑なことはしないので v2 の新仕様で設定していきます。

# AutoHotKey スクリプト

F13 をStep Over にしたいので、eclipse実行中なら F6, VS Code 実行中なら F10, InteliJ IDEA 実行中なら F8、 みたいなマッピングを定義します。

F13 ステップオーバー
F14 ステップイン
F15 ステップアウト

が当初の予定でしたが、せっかく6ボタンあるので

F16 再開
F17 カーソルまで実行
F18 デバッグ開始

というのも割り当ててみました。（一部動かないかも）

音量のノブは、OS標準で動いているのでリマップはしていません。

最初のF13だけ、アプリ名のコメントを付けております。

``` step.ahk
; Step Over
F13::
{
  if (WinActive("ahk_exe eclipse.exe") != 0)
  {
    ; eclipse
    Send "{F6}"
  }
  else if (WinActive("ahk_exe Code.exe") != 0 || WinActive("ahk_exe devenv.exe") != 0)
  {
    ; VS Code || Visual Studio
    Send "{F10}"
  }
  else if (WinActive("ahk_exe idea64.exe") != 0 || WinActive("ahk_exe studio64.exe") != 0)
  {
    ; IntelliJ IDEA || Android Studio
    Send "{F8}"
  }
}

; Step In
F14::
{
  if (WinActive("ahk_exe eclipse.exe") != 0)
  {
    Send "{F5}"
  }
  else if (WinActive("ahk_exe Code.exe") != 0 || WinActive("ahk_exe devenv.exe") != 0)
  {
    Send "{F11}"
  }
  else if (WinActive("ahk_exe idea64.exe") != 0 || WinActive("ahk_exe studio64.exe") != 0)
  {
    Send "{F7}"
  }
}

; Step Out
F15::
{
  if (WinActive("ahk_exe eclipse.exe") != 0)
  {
    Send "{F7}"
  }
  else if (WinActive("ahk_exe Code.exe") != 0 || WinActive("ahk_exe devenv.exe") != 0)
  {
    Send "+{F11}"
  }
  else if (WinActive("ahk_exe idea64.exe") != 0 || WinActive("ahk_exe studio64.exe") != 0)
  {
    Send "+{F8}"
  }
}


; Resume
F16::
{
  if (WinActive("ahk_exe eclipse.exe") != 0)
  {
    Send "{F8}"
  }
  else if (WinActive("ahk_exe Code.exe") != 0 || WinActive("ahk_exe devenv.exe") != 0)
  {
    Send "{F5}"
  }
  else if (WinActive("ahk_exe idea64.exe") != 0 || WinActive("ahk_exe studio64.exe") != 0)
  {
    Send "{F9}"
  }
}

; Run to cursor
F17::
{
  if (WinActive("ahk_exe eclipse.exe") != 0)
  {
    Send "^r"
  }
  else if (WinActive("ahk_exe Code.exe") != 0 || WinActive("ahk_exe devenv.exe") != 0)
  {
    Send "^{F10}"
  }
  else if (WinActive("ahk_exe idea64.exe") != 0 || WinActive("ahk_exe studio64.exe") != 0)
  {
    Send "!{F9}"
  }
}

; Start Debug
F18::
{
  if (WinActive("ahk_exe eclipse.exe") != 0)
  {
    Send "{F11}"
  }
  else if (WinActive("ahk_exe Code.exe") != 0 || WinActive("ahk_exe devenv.exe") != 0)
  {
    Send "{F5}"
  }
  else if (WinActive("ahk_exe idea64.exe") != 0 || WinActive("ahk_exe studio64.exe") != 0)
  {
    Send "+{F9}"
  }
}

```

AutoHotKey は触り始めたばかりで、OS起動時の自動実行とかの設定がまだよく分かっていません。

とりあえず手動で有効にすると意図通りのキーバインドになっています。

# 終わりに

F13～を押せるキーボードを用意し、AutoHotKey でアプリ毎に割り当てを変える方法を説明しました。

mac の場合は、AutoHotKey の代わりに Karabiner-Elements を使うと似たようなことが実現できそうです。

今まではチートシートのようなものを作ってファンクションキーの上に置いていました。

![PXL_20231223_162018072.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104360/095af99a-fd8e-402b-bbd0-5b7121a061ab.jpeg)

こんなダサいやり方とはおさらばだ！

（キーを増やすのもダサいかもしんないけど）

# 追記 キーキャップ交換

透明カバーキーキャップに交換しました。AliExpressで、10個425円でした。

「Cherry MXスイッチ」というのが自作キーボード界のデファクトスタンダードになっているらしく、それに合うキーキャップなら自由に交換できます。

![Good-10Pcs-Transparent-Keycaps-Double-layer-Keycaps-Removable-Paper-Clips-Custom-MX-Switch-Relegendable-Keycap-Shell.jpg_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104360/e985bfec-bd39-edc6-7144-7a368a7ac90a.jpeg)

ラベルを挟み込んで使います。ラベルはプリンタで出力したものをカットして作りました。

![PXL_20240117_155221492.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104360/fb697135-19b1-1e04-3117-21e4bd3b566d.jpeg)

キー配置は覚えたけど、いまいち自分の記憶を信頼してないので、ちょっと間をおいてからの一発目は「これでいいんだっけ？」と不安になりながら押してました。
ラベルがあると安心して押せます。