2020年版QMKで自作キーボードを薙刀式へ拡張する

昨年薙刀式を自作キーボードに導入する方法を記載しましたが、その後だいぶ変更されているので、最新版に基づいて書き直してみました。よりシンプルになりましたが、相変わらずkeymapを自分で編集できる人向けです。親指シフトは更新していませんし、より優れた実装があるので、そちらをお使いください。

github.com

追記

OS切り替えにも対応した最終形V13uを作りました。移植方法はほとんど同じです。 github.com

まずnaginata_v13.cとnaginata.hを自分のキーマップのあるフォルダにコピーします。

修正する箇所を説明していきます。基本的には// 薙刀式で囲まれた部分を自分のconfig.h、keymap.c、rules.mkに追加していきます。

rules.mk

naginata_v13.cがコンパイル対象になるようにrules.mkにSRC +=naginata_v13.cを追加します。 また編集モードを使うにはUNICODE_ENABLEも有効にしてください。コンボは薙刀式オンオフでは使わなくなりました。 ファームウェアサイズがオーバーしてしまう場合はEXTRAFLAGS += -fltoをつけると最適化されてサイズが小さくなるので試してみてください。

UNICODE_ENABLE = yes
SRC +=    naginata_v13.c
EXTRAFLAGS += -flto
config.h

config.h の// 薙刀式で囲まれた部分を自分のconfig.cに追加します。OS(WindowsMacLinux)に応じてコメントの有効無効を切り替えてください。

#define NAGINATA_TATEGAKI
// #define NAGINATA_YOKOGAKI

#define NAGINATA_EDIT_WIN // JP106
#define UNICODE_SELECTED_MODES UC_WINC

// #define NAGINATA_EDIT_MAC // US101
// Macはunicode入力を使わない
// #define MAC_LIVE_CONVERSION // Macでライブ変換をオンにしている場合

// #define NAGINATA_EDIT_LINUX
// #define UNICODE_SELECTED_MODES UC_LNX

// #define NAGINATA_KOUCHI_SHIFT // シフトを後置でも有効にする
keymap.c

ここからはkeymap.cを編集していきます。同様にconfig.hの// 薙刀式で囲まれた部分を適切な位置にコピペしていきますが、自分のキーボードに合わせた編集が必要です。

ヘッダをインクルードして薙刀式のキーレイアウトを定義するキーを導入します。

#include "naginata.h"
NGKEYS naginata_keys;

薙刀式入力モードがオンの時、NAGINATAレイヤーに切り替わります。NAGINATAレイヤーはデフォルトレイヤーとLOWER, RAISEなどのレイヤーの間に作っておけば、かな入力中もこれらのレイヤーを使えます。

enum keymap_layers {
  _QWERTY,
// 薙刀式
  _NAGINATA, // 薙刀式入力レイヤー
// 薙刀式
  _LOWER,
  _RAISE,
};

薙刀式用のキーを追加したので、独自のキーはSAFE_RANGEではなくNG_SAFE_RANGEから開始してください。

enum custom_keycodes {
  EISU = NG_SAFE_RANGE,
  KANA2,
  LCTOGL, // Macのライブ変換対応オンオフ
};

NAGINATAレイヤーを定義します。通常のKCなんとかと言うキーコードではなく、薙刀式入力で使うキーにはNG_で始まるキーコードを使います。ここではデフォルトレイヤーにかかわらず、QWERTYでキー配置を定義してください。KCコードを使えば、かなに変換されることなく入力されるので、例えばKC_SLSHとNG_SLSHを同じレイヤーに置いて、記号入力とかな入力を使い分けることが可能です。

  [_NAGINATA] = LAYOUT(
    _______,NG_Q   ,NG_W   ,NG_E   ,NG_R   ,NG_T   ,                NG_Y   ,NG_U   ,NG_I   ,NG_O   ,NG_P   ,_______, \
    _______,NG_A   ,NG_S   ,NG_D   ,NG_F   ,NG_G   ,                NG_H   ,NG_J   ,NG_K   ,NG_L   ,NG_SCLN,_______, \
    _______,NG_Z   ,NG_X   ,NG_C   ,NG_V   ,NG_B   ,                NG_N   ,NG_M   ,NG_COMM,NG_DOT ,NG_SLSH,_______, \
                                    _______,NG_SHFT,_______,_______,NG_SHFT,_______
  ),

初期設定として、_NAGINATAレイヤーが薙刀式のためのレイヤーであることを設定します。薙刀式を有効にするキー、無効にするキーもここで定義します。 QWERTYならそのまま、DVORAKやCOLEMAKならそれに応じて変更してください。

void matrix_init_user(void) {
  // 薙刀式
  uint16_t ngonkeys[] = {KC_H, KC_J};
  uint16_t ngoffkeys[] = {KC_F, KC_G};
  set_naginata(_NAGINATA, ngonkeys, ngoffkeys);
  // 薙刀式
}

キー一発でかな入力をオンオフしたければ、キーを定義してnaginata_onまたはnaginata_offを呼び出してください。なくても可。

    case EISU:
      if (record->event.pressed) {
        // 薙刀式
        naginata_off();
        // 薙刀式
      }
      return false;
      break;
    case KANA2:
      if (record->event.pressed) {
        // 薙刀式
        naginata_on();
        // 薙刀式
      }
      return false;
      break;

薙刀式の変換処理はprocess_record_user関数で行なっています。この関数はキーが押された時と、キーを離した時に呼び出されます。ここでnaginata_v13.c の関数を呼び出しています。process record user関数の最後、return trueの前に追加してください。関数がない場合は、追加してください。

  // 薙刀式
    if (!process_naginata(keycode, record))
      return false;
  // 薙刀式

  return true;

OLED表示に対応しました。OLED_DRIVER_ENABLEがyesの場合は、以下が有効になり、入力モードや薙刀式ロゴが表示されます。

// 薙刀式 OLED表示
#ifdef OLED_DRIVER_ENABLE
以下省略

f:id:eswai:20201128224743j:plain
OLED