kbigwheelのプログラミング・ソフトウェア技術系ブログ

プログラミング・ソフトウェア技術系のことを書きます

日本語入力切り替えストレスの少ないキーマップを定義した

週末このハイカロリーなブログを書いていたので今回は軽めで。

オフィスで活きる自作キーボードのメリットと自作せずにそれを実現する方法 - Speee DEVELOPER BLOG

日本語入力時のストレス

日本語入力時のストレスってなんでしょう?賢くない変換?文節の切れる点が間違っている?それもストレスだと思いますが僕は日本語入力有効な状態で記号キーや数字キーを押して全角で入ってしまった瞬間だと思っています。 特に僕は普段vimを使っているのですが、コマンドラインモードに入ろうとして全角の が入る瞬間は最も憂鬱な瞬間です。日本語大好きな僕でも流石にこんなことが数年も続くと日本語嫌いになりそうです。

僕らエンジニアは英語入力と日本語入力をよく切り替えます。というのは主として入力するプログラミング言語が英語だからです。一方コメントやドキュメントは会社にもよりますが日本語で書くことが多いです。

しかし、よく考えると全角つまり日本語入力モードONの状態で数字や記号を入力することはめったにありません。例外は ぐらいのものです。ならそもそも日本語入力がONであろうが数字キーや記号キーを押したときは無条件で日本語入力をOFFにして入力したらいいのでは?そう思って作ってみたのが今回のキーマップです。

数字・記号絶対半角で入力するマンキーマップ

完成品はこちらです(BLE Micro Pro用のコードなので汎用のqmk firmwareにはちょっとそのままでは動かないかもしれません)。 qmk_firmware/keymap.c at d3408a2cf1d6d39d6891d555b1a999e6191ae198 · bigwheel/qmk_firmware

正確に書くとprocess_record_userでキーコードの処理を改変しているだけなのでキーマップ、いわゆる論理配列はどんなものでも対応できます。

const uint16_t leave_ime_on_keys[] = {
  // https://beta.docs.qmk.fm/using-qmk/simple-keycodes/keycodes_basic#letters-and-numbers
  KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
  KC_ESCAPE,
  // KC_MINUS,
  KC_EQUAL,
  ...
  KC_QUESTION
};

const uint16_t leave_ime_on_keys_with_shift[] = {
  // https://beta.docs.qmk.fm/using-qmk/simple-keycodes/keycodes_basic#letters-and-numbers
  KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
  KC_ESCAPE,
  ...
  KC_QUESTION
};

bool process_record_user(uint16_t keycode, keyrecord_t *record) {

  ...

    bool leave_ime_on = false;
    for (int i = 0; i < length_of_leave_ime_on_keys; i++)
      if (leave_ime_on_keys[i] == keycode) {
        leave_ime_on = true;
        break;
      }

    if (get_mods() & MOD_MASK_SHIFT)
      for (int i = 0; i < length_of_leave_ime_on_keys_with_shift; i++)
        if (leave_ime_on_keys_with_shift[i] == keycode) {
          leave_ime_on = true;
          break;
        }

    if (leave_ime_on && record->event.pressed) {
      uint8_t real_mods_memory = get_mods();
      clear_mods();
      off_ime();
      set_mods(real_mods_memory);
    }

  return PROCESS_USUAL_BEHAVIOR;
}

イデアは死ぬほどシンプルで、記号キーが押された場合はその前に必ず無変換キー(PCモードの場合)または英数キー(Macモードの場合)を先行して入力するだけです。いわば、数字・記号キーすべてを2ストロークのマクロ化して、本来のキー入力の前に日本語入力OFFキーを入力するようにした感じです。

追加でしている工夫としては、これだけだと全角の記号などが一切入力できなくなりこれだと困るケースもあるためカスタムキーコードとして KC_DISPEL というものを定義しています。これを押している間は上記の日本語入力無条件OFF挙動がキャンセルされます。

まとめ

このキーマップで一週間程度使い続けているのですがかなりいい感じです。 特にコーディング中、日本語入力ONのまま記号やアルファベットを入力しようとしてしまいBackSpace, 日本語入力ONキー, 本来入れたかったキーを押すの流れが完全になくなりました。 このまましばらく様子を見て、問題なさそうであれば持っているキーボード全てへ展開する予定です。