📌

第3回:テンキー入力のロジック設計 AutoHotKeyV2

に公開

行・段の2ステップ入力の状態管理と変換処理

🧩 はじめに

本記事では、テンキーによる2タッチ日本語入力システムの中核となる「入力ロジック」について詳しく解説します。AutoHotkey v2を用いて、行(母音グループ)と段(母音位置)を2ステップで入力し、ひらがなをローマ字で出力する仕組みを構築します。

🧠 入力方式の設計思想

テンキーを使った2タッチ入力では、以下のような設計思想に基づいています:

1タッチ目(行):テンキーの数字に各行(あ行、か行など)を割り当て
2タッチ目(段):母音の位置(あ・い・う・え・お)をテンキーで指定
組み合わせでローマ字出力:例:7 → 1 で「あ(a)」、8 → 3 で「く(ku)」
この方式により、テンキーのみで効率的な日本語入力が可能になります。

🔧 実装の概要

2touch.ahk
行・段のマッピング
 ROW_KEYS := Map(
  7, "A_ROW", 8, "K_ROW", 9, "S_ROW",
  4, "T_ROW", 5, "N_ROW", 6, "H_ROW",
  1, "M_ROW", 2, "Y_ROW", 3, "R_ROW",
  0, "W_ROW"
)

COLUMN_KEYS := Map(
  7, 1, 8, 2, 9, 3,
  4, 4, 5, 5
)

2タッチ組み合わせの変換

2touch.ahk
twoTouchCombineMap := Map(
  "A_ROW_1", "a", "A_ROW_2", "i", ...
  "K_ROW_1", "ka", "K_ROW_2", "ki", ...
)

このように、行_段のキーでローマ字を出力する仕組みです。

🔄 状態管理と入力処理

グローバル変数による状態保持

2touch.ahk
lastPressedKeyCode := ""
lastOutputRomaji := ""
lastActionWasConversion := false

キーハンドラ関数の流れ
1タッチ目の記録:行キーを押すと lastPressedKeyCode に記録
2タッチ目の処理:段キーを押すと、行と段を組み合わせて変換
特殊キー処理:濁音・半濁音・小文字などは直前の出力に対して変換

2touch.ahk
if (ROW_KEYS.Has(lastNum) && COLUMN_KEYS.Has(currentNum)) {
  rowKey := ROW_KEYS[lastNum]
  columnNum := COLUMN_KEYS[currentNum]
  combineKey := rowKey . "_" . columnNum
  if (twoTouchCombineMap.Has(combineKey)) {
    outputRomaji := twoTouchCombineMap[combineKey]
    Send(outputRomaji)
    lastOutputRomaji := outputRomaji
    lastPressedKeyCode := ""
  }
}

🛠 実装上の工夫

NumLockの状態に依存しない設計
特殊記号や数字の入力にも対応
誤入力時のリセット処理

2touch.ahk
NumpadAdd::ResetKey()

✅ まとめ

本記事では、テンキーによる2ステップ入力のロジック設計とAutoHotkey v2による実装方法を解説しました。次回は、実際のひらがな入力マッピングについて詳しく見ていきます。

📥 SNS

🔗 GitHubリポジトリ
https://github.com/chiquwa/2touch-ime

🔗 Zenn記事一覧
https://zenn.dev/chiquwagohan

🔗 Note記事一覧
https://note.com/search?context=note&q=from%3A%40chiquwa&size=10

EXEファイルの購入
https://note.com/chiquwa/n/n59973d490326

https://www.youtube.com/watch?v=7_C7cDYGKiA

Discussion