自作キーボードで「くぁｗせｄｒｆｔｇｙふじこｌｐ；」マクロを実装

# ふじことは

> キーボードを”qawsedrftgyhujikolp;”の順番で入力したとき、日本語入力の場合に表示される文字列である。
これはキーボードのQ,Aに手をおいてガーーーーっとやったときに入力できる。

# 自作キーボードの場合

配列が手に最適化されているため、フジコを一発で決めるのは難しい。
また、左右分離の場合は普通のキーボードにおける常識が適用されない。

# 解説

以下、ふじこが使われまくっていた10～15年ぐらい前のノリでお届けします。

---

1 shino3 19/05/23 12:40 ID:RbKwgfeH

まぁおまえら聞け。最初から行こうぜ。

**■１ キーボード**

普通のキーボードじゃだめだ、ゲーミングキーボードじゃない。ProMicroなどを使っている自作キーボードだ。日本で買うならHelixでいいんじゃないか、自分もHelixを使っている。コレは国内でも入手しやすい。今回はHelixのファームウェアをベースに説明する。

[QMK_Firmware](https://github.com/qmk/qmk_firmware)を使うやつだ。

C言語の知識とプログラミングに自信があるなら、他のキーボードでもいい。試してみてほしい。
Lily58とか、Ergo42とか、meishiでもいい。他にも書ききれないぐらいのキーボードが存在している。

参考にするならErgoDoxあたりの記事だろうな。マクロに関してはHelixはチョット他と書き方が違う。
URL貼っておくよ。

https://qiita.com/teri_yakichan/items/db54589b67ba9330faed

---

2 shino3 19/05/23 12:42 ID:RbKwgfeH

**■２ 準備**

キーボードは買ったか？手元に揃っているか？

揃っているなら話が早い、はんだ付けするんだ。さっさと組み立ててしまおう。
はんだ付けは中学以来なら、念の為にもう一台買っておけ。失敗しなかったら会社持っていって使えばいい。

失敗しないように作るコツは、作者のビルドガイドをしっかり読むことだ。
次の記事でもいい。キーボードこそ違えど主要なポイントは大体書いてある。

https://qiita.com/Shino3/items/321dcda135118f9c1d55

---

4 shino3 19/05/23 12:47 ID:RbKwgfeH

**■３ QMK Firmware**

とりあえずハードウェアが揃ったら今度はソフトウェアだ。
QMK Firmwareをクローンしてきてビルドする準備を整える。

https://github.com/qmk/qmk_firmware

Helixで使うなら

```
make helix:default
```

コマンドが終了することを確認しておく。

---

12 shino3 19/05/23 14:20 ID:RbKwgfeH

**■４ キーマッピングを変更**

悪いな、遅くなった。昼飯食べに行ってたんだ。
そろそろQMK Firmwareのビルドも終わった頃だと思うがどうかな？

このキーマッピングの変更ができないと、とても話にならん。
C言語は読めるか？大丈夫か？まあ、複雑な命令はないからそんなに苦労することもないと思っているぞ。

え？全くプログラムは書いたことないって？
じゃあ、とりあえずキーマッピング変更に関しては以下の記事でも読んでおく。

https://qiita.com/marksard/items/9317949ce1da327f7436

とても覚えられる自信がない？
大丈夫、そんなにガリガリ書くわけじゃない。雰囲気で書けるよ。慣れてしまえばいい。

---

14 shino3 19/05/23 14:25 ID:RbKwgfeH

**■４ マクロを設定（１）**

今回はみんな大好きHelixを例に解説していくぞ。
とりあえずさっきクローンしたQMK Firmwareのディレクトリをを開いてくれ。

`keyboards/helix/rev2/keymaps/default`のディレクトリに、`keymap.c`あるはずだ。

これをエディタで開く。なんでもいい、慣れてるやつなら。Meryでもサクラエディタでもいい。
WordとかExcel、Visual Studio、メモ帳で開くんじゃないぞ。あとで苦労するからな。特にメモ帳は駄目だ、絶対にだぞ。

---

15 shino3 19/05/23 14:32 ID:RbKwgfeH

**■４ マクロを設定（２）**

開いたら36行目から47行目に以下の記述があるはずだ。

```C
enum custom_keycodes {
  QWERTY = SAFE_RANGE,
  COLEMAK,
  DVORAK,
  LOWER,
  RAISE,
  ADJUST,
  BACKLIT,
  EISU,
  KANA,
  RGBRST
};
```

とりあえず、定義を追加するんだ。名前なんてなんでもいいが、わかりやすいのをつけておけ。
仕事のストレス、顧客から言われた要件、今日の晩飯とか考えること多くて大変だろ？
見て一発でわかるものがいい。

```DIFF
enum custom_keycodes {
  QWERTY = SAFE_RANGE,
  COLEMAK,
  DVORAK,
  LOWER,
  RAISE,
  ADJUST,
  BACKLIT,
  EISU,
  KANA,
+ FUJIKO,
  RGBRST
};
```

---

18 shino3 19/05/23 14:32 ID:RbKwgfeH

**■４ マクロを設定（３）**

カスタム名称は定義したか？そしたら適当なキーに設定する。どのキーでもいいが、QWERTYレイヤーなどの通常の文字入力で使うレイヤーは避けておく。
誤爆するとめんどくさいぞ。

そうだな、とりあえずLOWERレイヤーに設定しておくといい。
F12の横とかいい感じに空いてそうだよな。

```DIFF
  [_LOWER] = LAYOUT( \
      KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC,                   KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \
      _______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,                     KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
-     _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,                    KC_F12,  _______, _______, KC_HOME, KC_END,  _______, \
+     _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,                    KC_F12,  FUJIKO,  _______, KC_HOME, KC_END,  _______, \
      _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
      ),
```

---

32 shino3 19/05/23 15:00 ID:RbKwgfeH

**■５ マクロを設定（４）**

続きが遅くなってすまない。何故かビルドが通らなくなって苦労していたよ。
さて、次行くぞ。

441行目付近のSwitch文に

```C
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  switch (keycode) {
    // 省略
    case KANA:
    // ・
    // ・
    // ・
    // 省略
```

があるはずだ。
KANAの下に記述を追加する。

```DIFF
    case KANA:
      if (record->event.pressed) {
        if(keymap_config.swap_lalt_lgui==false){
          register_code(KC_LANG1);
        }else{
          SEND_STRING(SS_LALT("`"));
        }
      } else {
        unregister_code(KC_LANG1);
      }
      return false;
      break;
+   case FUJIKO:
+     if (record->event.pressed) {
+        SEND_STRING(SS_LALT("`"));
+      } else {
+        unregister_code(KC_LANG1);
+     }
+     return false;
+     break;
```

---

33 shino3 19/05/23 15:02 ID:RbKwgfeH

**■６ SEND_STRING**

文字を送る関数が、この`SEND_STRING`ってやつだ。
これで入力を自動化する。押したキーの情報を送ってくれる便利なやつだ。

KANAの部分は、Windowsモードのときは** Alt押しながら\` **で日本語入力に切り替えている。英字配列の全角／半角に該当する文字入力の切り替えだな。

---

39 shino3 19/05/23 15:10 ID:RbKwgfeH

**■７ マクロを設定（５）**

とりあえず適当に変えてみる。
送れる文字列はASCIIコードが基本なので、以下のものが使えるはず。

- 英字大文字
- 英字小文字
- 記号
- 数字
- Return(\n)
- Tab(\t)

キー配列編集時に見る、SHIFT, ALT, CTRLも指定することができたはず。

コレを使って文字列を流し込んでいく。

```DIFF
    case FUJIKO:
      if (record->event.pressed) {
-        SEND_STRING(SS_LALT("`"));
+        SEND_STRING("qawsedrftgyhujikolp;");
       } else {
         unregister_code(KC_LANG1);
      }
      return false;
      break;
```

---

40 shino3 19/05/23 15:11 ID:RbKwgfeH

**■８ マクロを設定（補足）**

こんな感じで書くこともできる。
まあ、関数を何回実行しても文字列を送ることには変わりないんだけどな。

```C
SEND_STRING("qaws");
SEND_STRING("edrf");
SEND_STRING("tgyh");
SEND_STRING("ujik");
SEND_STRING("olp;");
```

---

42 shino3 19/05/23 15:13 ID:RbKwgfeH

**■９ マクロを設定（６）**

コレを書いたら上書きしてビルドする。

```
make helix:default:avrdude
```

コマンドが通らずエラーとなったら、FUJIKOの定義忘れとかだろう。
しっかりエラーを読むんだ。

---

49 shino3 19/05/23 15:16 ID:RbKwgfeH

**■１０ マクロを実行**

わかったわかった、無事に動作したのはよくわかった。おまいら慌てるなｗ
実行方法もちゃんと説明させてくれｗｗ

まずPCを日本語入力に切り替えたら、LOWER押しながらF12の隣を押すんだ。
どうだ、実行できるだろう？

---

55 shino3 19/05/23 15:22 ID:RbKwgfeH

**■１１ まとめ**

マクロの世界は奥が深い。VIMのキーバインド割り当ててもいいだろうし、自分が使い慣れたキーボードのビルドコマンドを流してもいい。

使い方さえ覚えてしまえば、あとの動作は自分次第って感じ。

最後まで見てくれてありがとな、おまいらほんとにいい人たちだよな


---

この記事は、キーマッピング考えながらDiscordで通話中に冗談で「フジコできなくね？」って発言から始まってます。

ちなみに寿限無を実装して、ためしにタイピングで寿限無を入力してみましたが、秒60キーぐらいまでの速度で凄まじい入力が走りました。