CTRL配列 - Ver.2.0 - @hiyoctrl

https://qiita.com/hiyoctrl/items/70885ee39938b72dd657

こんにちは、Ctrl([@hiyoctrl](https://twitter.com/hiyoctrl))です。

前回の記事から1年以上経過し、現在の左手のみで入力する「 CTRL配列 - v2.0 」について簡単に記録を残しておこうと思います。

使用している物理キーボードは[@takashicompany](https://twitter.com/takashicompany)さんのWorm Eatenです。

https://github.com/takashicompany/worm_eaten/tree/master

とても組み立てやすく、シンプルで飽きにくいデザインが大好きです。

以前は狭ピッチのte96を利用していましたが、どうも自分の手の場合、 指が縮こまってしまうような印象があること、キーキャップがなかなか手に入れにくいことからWorm Eatenを利用するようになりました。

左手にWorm Eaten、右手にKensingtonのスリムブレード、ディスプレイの下に無指向性マイクを設置して作業しています。

キーマップについてはQMKについて色々と 学び、 レイヤーやマクロ、タップダンスを組み合わせた独自のものを使っています。

<details><summary>keymap.c</summary>

```

#include QMK_KEYBOARD_H
enum layer_number {
    _BASE = 0,_MOD1,_MOD2,_MOD3,_NUM4,_AAA5,_ENG6,_KKK7,
};
enum custom_keycodes {
    LSHB = SAFE_RANGE,
    LSHC,
    LSEC,
    PRN,
    BRC,
    TAE,
    KEY,
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    switch (keycode) {
    case LSHB:
        if (record->event.pressed) {
        SEND_STRING(SS_LSFT(SS_TAP(X_HOME)) SS_LCTL("b"));
        } else {
        }
        break;
    case LSHC:
        if (record->event.pressed) {
        SEND_STRING(SS_LSFT(SS_TAP(X_HOME)) SS_LCTL("c"));
        } else {
        }
        break;
    case LSEC:
        if (record->event.pressed) {
        SEND_STRING(SS_LSFT(SS_TAP(X_END)) SS_LCTL("c"));
        } else {
        }
        break;
    case PRN:
        if (record->event.pressed) {
        SEND_STRING(SS_LSFT("()"));
        } else {
        }
        break;
    case BRC:
        if (record->event.pressed) {
        SEND_STRING("[]");
        } else {
        }
        break;
    case TAE:
        if (record->event.pressed) {
        SEND_STRING(SS_LCTL("t") SS_DELAY(1200) SS_TAP(X_TAB) SS_TAP(X_ENT));
        } else {
        }
        break;
    case KEY:
        if (record->event.pressed) {
        SEND_STRING(SS_LCTL("c") SS_TAP(X_ESC) "_");
        } else {
        }
        break;
    }
    return true;
};
enum {
    TD_A,TD_B,TD_C,TD_D,TD_E,TD_F,TD_G,TD_H,TD_I,TD_J,TD_K,TD_L,TD_M,
    TD_N,TD_O,TD_P,TD_Q,TD_R,TD_S,TD_T,TD_U,TD_V,TD_W,TD_X,TD_Y,TD_Z,
    TD_VVV,
    TD_CCC,
    TD_HSH,
    TD_ESE,
    TD_ZAY,
    TD_HAF,
    TD_AAF,
    TD_CAL,
    TD_SAR,
    TD_HAC,
    TD_2CA,
    TD_3CA,
    TD_0CA,
    TD_WAT,
    TD_EAU,
    TD_QAD,
    TD_CAX,
    TD_CAA,
    TD_LPA,
    TD_RPA,
    TD_LBC,
    TD_RBC,
};
tap_dance_action_t tap_dance_actions[] = {
    [TD_A] = ACTION_TAP_DANCE_DOUBLE(KC_A, LSFT(KC_A)),
    [TD_B] = ACTION_TAP_DANCE_DOUBLE(KC_B, LSFT(KC_B)),
    [TD_C] = ACTION_TAP_DANCE_DOUBLE(KC_C, LSFT(KC_C)),
    [TD_D] = ACTION_TAP_DANCE_DOUBLE(KC_D, LSFT(KC_D)),
    [TD_E] = ACTION_TAP_DANCE_DOUBLE(KC_E, LSFT(KC_E)),
    [TD_F] = ACTION_TAP_DANCE_DOUBLE(KC_F, LSFT(KC_F)),
    [TD_G] = ACTION_TAP_DANCE_DOUBLE(KC_G, LSFT(KC_G)),
    [TD_H] = ACTION_TAP_DANCE_DOUBLE(KC_H, LSFT(KC_H)),
    [TD_I] = ACTION_TAP_DANCE_DOUBLE(KC_I, LSFT(KC_I)),
    [TD_J] = ACTION_TAP_DANCE_DOUBLE(KC_J, LSFT(KC_J)),
    [TD_K] = ACTION_TAP_DANCE_DOUBLE(KC_K, LSFT(KC_K)),
    [TD_L] = ACTION_TAP_DANCE_DOUBLE(KC_L, LSFT(KC_L)),
    [TD_M] = ACTION_TAP_DANCE_DOUBLE(KC_M, LSFT(KC_M)),
    [TD_N] = ACTION_TAP_DANCE_DOUBLE(KC_N, LSFT(KC_N)),
    [TD_O] = ACTION_TAP_DANCE_DOUBLE(KC_O, LSFT(KC_O)),
    [TD_P] = ACTION_TAP_DANCE_DOUBLE(KC_P, LSFT(KC_P)),
    [TD_Q] = ACTION_TAP_DANCE_DOUBLE(KC_Q, LSFT(KC_Q)),
    [TD_R] = ACTION_TAP_DANCE_DOUBLE(KC_R, LSFT(KC_R)),
    [TD_S] = ACTION_TAP_DANCE_DOUBLE(KC_S, LSFT(KC_S)),
    [TD_T] = ACTION_TAP_DANCE_DOUBLE(KC_T, LSFT(KC_T)),
    [TD_U] = ACTION_TAP_DANCE_DOUBLE(KC_U, LSFT(KC_U)),
    [TD_V] = ACTION_TAP_DANCE_DOUBLE(KC_V, LSFT(KC_V)),
    [TD_W] = ACTION_TAP_DANCE_DOUBLE(KC_W, LSFT(KC_W)),
    [TD_X] = ACTION_TAP_DANCE_DOUBLE(KC_X, LSFT(KC_X)),
    [TD_Y] = ACTION_TAP_DANCE_DOUBLE(KC_Y, LSFT(KC_Y)),
    [TD_Z] = ACTION_TAP_DANCE_DOUBLE(KC_Z, LSFT(KC_Z)),
    [TD_VVV] = ACTION_TAP_DANCE_DOUBLE(RCS(KC_V),    LCTL(KC_V)),
    [TD_CCC] = ACTION_TAP_DANCE_DOUBLE(LCTL(KC_C),   RCS(KC_C)),
    [TD_HSH] = ACTION_TAP_DANCE_DOUBLE(KC_HOME,      LSFT(KC_HOME)),
    [TD_ESE] = ACTION_TAP_DANCE_DOUBLE(KC_END,       LSFT(KC_END)),
    [TD_ZAY] = ACTION_TAP_DANCE_DOUBLE(LCTL(KC_Z),   LCTL(KC_Y)),
    [TD_HAF] = ACTION_TAP_DANCE_DOUBLE(LCTL(KC_H),   LCTL(KC_F)),
    [TD_AAF] = ACTION_TAP_DANCE_DOUBLE(KC_ASTR,      LGUI(KC_UP)),
    [TD_CAL] = ACTION_TAP_DANCE_DOUBLE(KC_COLN,      LGUI(KC_LEFT)),
    [TD_SAR] = ACTION_TAP_DANCE_DOUBLE(KC_SLSH,      LGUI(KC_RGHT)),
    [TD_HAC] = ACTION_TAP_DANCE_DOUBLE(LCTL(KC_SPC), KC_CAPS),
    [TD_2CA] = ACTION_TAP_DANCE_DOUBLE(KC_2,         LCA(KC_2)),
    [TD_3CA] = ACTION_TAP_DANCE_DOUBLE(KC_3,         LCA(KC_3)),
    [TD_0CA] = ACTION_TAP_DANCE_DOUBLE(KC_0,         LCA(KC_0)),
    [TD_WAT] = ACTION_TAP_DANCE_DOUBLE(LCTL(KC_W),   RCS(KC_T)),
    [TD_EAU] = ACTION_TAP_DANCE_DOUBLE(KC_EXLM,      RCS(KC_PGUP)),
    [TD_QAD] = ACTION_TAP_DANCE_DOUBLE(KC_QUES,      RCS(KC_PGDN)),
    [TD_CAX] = ACTION_TAP_DANCE_DOUBLE(LCTL(KC_C),   LCTL(KC_X)),
    [TD_CAA] = ACTION_TAP_DANCE_DOUBLE(LALT(KC_TAB), LCA(KC_TAB)),
    [TD_LPA] = ACTION_TAP_DANCE_DOUBLE(KC_LPRN,      KC_LABK),
    [TD_RPA] = ACTION_TAP_DANCE_DOUBLE(KC_RPRN,      KC_RABK),
    [TD_LBC] = ACTION_TAP_DANCE_DOUBLE(KC_LBRC,      KC_LABK),
    [TD_RBC] = ACTION_TAP_DANCE_DOUBLE(KC_RBRC,      KC_RABK),
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [_BASE] = LAYOUT(
    LCTL(KC_SPC), LT(7,KC_DOT), LT(3,KC_COMM),KC_UP,        TD(TD_VVV),
    LT(4,KC_ESC), KC_LEFT,      KC_RGHT,      LT(6,KC_BTN1),TD(TD_CCC),
    KC_TAB,       XXXXXXX,      XXXXXXX,      KC_DOWN,      LT(2,KC_SPC),
    XXXXXXX,      XXXXXXX,      KC_DEL,       LT(5,KC_BSPC),LT(1,KC_ENT),
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX),
    [_MOD1] = LAYOUT(
    KC_CAPS,      TD(TD_CAL),   TD(TD_SAR),   LSFT(KC_UP),  LCTL(KC_A),
    TD(TD_AAF),   LSFT(KC_LEFT),LSFT(KC_RGHT),TD(TD_ZAY),   LCTL(KC_X),
    KC_SCLN,      XXXXXXX,      XXXXXXX,      LSFT(KC_DOWN),LSFT(KC_DEL),
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX),
    [_MOD2] = LAYOUT(
    KC_QUOT,      TD(TD_EAU),   TD(TD_QAD),   LSFT(KC_HOME),TD(TD_HAF),
    KC_HASH,      KC_HOME,      KC_END,       TD(TD_WAT),   LSHB,
    KC_DQUO,      XXXXXXX,      XXXXXXX,      LSFT(KC_END), XXXXXXX,
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX),
    [_MOD3] = LAYOUT(
    KC_TILD,      KC_PLUS,      XXXXXXX,      LCTL(KC_S),   KC_CIRC,
    KC_EQL,       XXXXXXX,      XXXXXXX,      RCS(KC_S),    KC_BSLS,
    KC_AT,        XXXXXXX,      XXXXXXX,      LALT(KC_TAB), LCA(KC_TAB),      
    XXXXXXX,      XXXXXXX,      XXXXXXX,      KC_MINS,      KC_UNDS,
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX),
    [_NUM4] = LAYOUT(
    XXXXXXX,      KC_1,         TD(TD_2CA),   TD(TD_3CA),   KC_4,
    XXXXXXX,      KC_5,         KC_6,         KC_7,         KC_8,
    XXXXXXX,      XXXXXXX,      XXXXXXX,      KC_9,         TD(TD_0CA),
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX),
    [_AAA5] = LAYOUT(
    TD(TD_L),     TD(TD_O),     TD(TD_E),     TD(TD_Y),     TD(TD_W),
    TD(TD_A),     TD(TD_J),     TD(TD_C),     TD(TD_I),     TD(TD_V),
    TD(TD_Q),     XXXXXXX,      XXXXXXX,      TD(TD_U),     TD(TD_F),
    XXXXXXX,      XXXXXXX,      TD(TD_X),     XXXXXXX,      XXXXXXX,
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX),
    [_ENG6] = LAYOUT(
    TD(TD_R),     TD(TD_S),     TD(TD_T),     XXXXXXX,      XXXXXXX,
    TD(TD_K),     TD(TD_Z),     TD(TD_D),     XXXXXXX,      XXXXXXX,
    TD(TD_G),     XXXXXXX,      XXXXXXX,      TD(TD_N),     TD(TD_B),
    XXXXXXX,      XXXXXXX,      TD(TD_P),     TD(TD_M),     TD(TD_H),
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX),
    [_KKK7] = LAYOUT(
    XXXXXXX,      XXXXXXX,      KC_GRV,       KC_PERC,      KC_AMPR,
    PRN,          XXXXXXX,      XXXXXXX,      BRC,          XXXXXXX,
    XXXXXXX,      XXXXXXX,      XXXXXXX,      TD(TD_LBC),   TD(TD_RBC),
    XXXXXXX,      XXXXXXX,      KC_DLR,       TD(TD_LPA),   TD(TD_RPA),
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX),
};

```

</details>

以上が今回の全体のサンプルコードになります。

その他の設定については今回は省いております。タップダンスやマクロの作り方については後日記事を作成する予定です。

## マクロ

<details><summary>サンプルコード</summary>

```

enum layer_number {
    _BASE = 0,_MOD1,_MOD2,_MOD3,_NUM4,_AAA5,_ENG6,_KKK7,
};
enum custom_keycodes {
    LSHB = SAFE_RANGE,
    LSHC,
    LSEC,
    PRN,
    BRC,
    TAE,
    KEY,
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    switch (keycode) {
    case LSHB:
        if (record->event.pressed) {
        SEND_STRING(SS_LSFT(SS_TAP(X_HOME)) SS_LCTL("b"));
        } else {
        }
        break;
    case LSHC:
        if (record->event.pressed) {
        SEND_STRING(SS_LSFT(SS_TAP(X_HOME)) SS_LCTL("c"));
        } else {
        }
        break;
    case LSEC:
        if (record->event.pressed) {
        SEND_STRING(SS_LSFT(SS_TAP(X_END)) SS_LCTL("c"));
        } else {
        }
        break;
    case PRN:
        if (record->event.pressed) {
        SEND_STRING(SS_LSFT("()"));
        } else {
        }
        break;
    case BRC:
        if (record->event.pressed) {
        SEND_STRING("[]");
        } else {
        }
        break;
    case TAE:
        if (record->event.pressed) {
        SEND_STRING(SS_LCTL("t") SS_DELAY(1200) SS_TAP(X_TAB) SS_TAP(X_ENT));
        } else {
        }
        break;
    case KEY:
        if (record->event.pressed) {
        SEND_STRING(SS_LCTL("c") SS_TAP(X_ESC) "_");
        } else {
        }
        break;
    }
    return true;
};

```

</details>

    LSHB 	文頭までを太字に 
    LSHC	文頭までをコピー 
    LSEC	文末までコピー
    PRN		（）をワンキーで入力
    BRC		「」をワンキーで入力
    TAE		新しいタブで音声検索すぐに開始
    KEY		選択した文字列をコピーして検索
    
以上がマクロのざっくりとした説明です。LSHBは太字にしたい行の末尾にカーソルを置いてタップすることで、その行を太字にするマクロです。ワンタップでGoogleの音声検索を始められるTAE、同じくワンタップで選択した文字列をコピーして検索できるKEYが気に入っています。

マクロについては最近覚えたばかりなので、これからも増やしたいと考えています。

## タップダンス

<details><summary>サンプルコード</summary>

```
enum {
    TD_A,TD_B,TD_C,TD_D,TD_E,TD_F,TD_G,TD_H,TD_I,TD_J,TD_K,TD_L,TD_M,
    TD_N,TD_O,TD_P,TD_Q,TD_R,TD_S,TD_T,TD_U,TD_V,TD_W,TD_X,TD_Y,TD_Z,
    TD_VVV,
    TD_CCC,
    TD_HSH,
    TD_ESE,
    TD_ZAY,
    TD_HAF,
    TD_AAF,
    TD_CAL,
    TD_SAR,
    TD_HAC,
    TD_2CA,
    TD_3CA,
    TD_0CA,
    TD_WAT,
    TD_EAU,
    TD_QAD,
    TD_CAX,
    TD_CAA,
    TD_LPA,
    TD_RPA,
    TD_LBC,
    TD_RBC,
};
tap_dance_action_t tap_dance_actions[] = {
    [TD_A] = ACTION_TAP_DANCE_DOUBLE(KC_A, LSFT(KC_A)),
    [TD_B] = ACTION_TAP_DANCE_DOUBLE(KC_B, LSFT(KC_B)),
    [TD_C] = ACTION_TAP_DANCE_DOUBLE(KC_C, LSFT(KC_C)),
    [TD_D] = ACTION_TAP_DANCE_DOUBLE(KC_D, LSFT(KC_D)),
    [TD_E] = ACTION_TAP_DANCE_DOUBLE(KC_E, LSFT(KC_E)),
    [TD_F] = ACTION_TAP_DANCE_DOUBLE(KC_F, LSFT(KC_F)),
    [TD_G] = ACTION_TAP_DANCE_DOUBLE(KC_G, LSFT(KC_G)),
    [TD_H] = ACTION_TAP_DANCE_DOUBLE(KC_H, LSFT(KC_H)),
    [TD_I] = ACTION_TAP_DANCE_DOUBLE(KC_I, LSFT(KC_I)),
    [TD_J] = ACTION_TAP_DANCE_DOUBLE(KC_J, LSFT(KC_J)),
    [TD_K] = ACTION_TAP_DANCE_DOUBLE(KC_K, LSFT(KC_K)),
    [TD_L] = ACTION_TAP_DANCE_DOUBLE(KC_L, LSFT(KC_L)),
    [TD_M] = ACTION_TAP_DANCE_DOUBLE(KC_M, LSFT(KC_M)),
    [TD_N] = ACTION_TAP_DANCE_DOUBLE(KC_N, LSFT(KC_N)),
    [TD_O] = ACTION_TAP_DANCE_DOUBLE(KC_O, LSFT(KC_O)),
    [TD_P] = ACTION_TAP_DANCE_DOUBLE(KC_P, LSFT(KC_P)),
    [TD_Q] = ACTION_TAP_DANCE_DOUBLE(KC_Q, LSFT(KC_Q)),
    [TD_R] = ACTION_TAP_DANCE_DOUBLE(KC_R, LSFT(KC_R)),
    [TD_S] = ACTION_TAP_DANCE_DOUBLE(KC_S, LSFT(KC_S)),
    [TD_T] = ACTION_TAP_DANCE_DOUBLE(KC_T, LSFT(KC_T)),
    [TD_U] = ACTION_TAP_DANCE_DOUBLE(KC_U, LSFT(KC_U)),
    [TD_V] = ACTION_TAP_DANCE_DOUBLE(KC_V, LSFT(KC_V)),
    [TD_W] = ACTION_TAP_DANCE_DOUBLE(KC_W, LSFT(KC_W)),
    [TD_X] = ACTION_TAP_DANCE_DOUBLE(KC_X, LSFT(KC_X)),
    [TD_Y] = ACTION_TAP_DANCE_DOUBLE(KC_Y, LSFT(KC_Y)),
    [TD_Z] = ACTION_TAP_DANCE_DOUBLE(KC_Z, LSFT(KC_Z)),
    [TD_VVV] = ACTION_TAP_DANCE_DOUBLE(RCS(KC_V),    LCTL(KC_V)),
    [TD_CCC] = ACTION_TAP_DANCE_DOUBLE(LCTL(KC_C),   RCS(KC_C)),
    [TD_HSH] = ACTION_TAP_DANCE_DOUBLE(KC_HOME,      LSFT(KC_HOME)),
    [TD_ESE] = ACTION_TAP_DANCE_DOUBLE(KC_END,       LSFT(KC_END)),
    [TD_ZAY] = ACTION_TAP_DANCE_DOUBLE(LCTL(KC_Z),   LCTL(KC_Y)),
    [TD_HAF] = ACTION_TAP_DANCE_DOUBLE(LCTL(KC_H),   LCTL(KC_F)),
    [TD_AAF] = ACTION_TAP_DANCE_DOUBLE(KC_ASTR,      LGUI(KC_UP)),
    [TD_CAL] = ACTION_TAP_DANCE_DOUBLE(KC_COLN,      LGUI(KC_LEFT)),
    [TD_SAR] = ACTION_TAP_DANCE_DOUBLE(KC_SLSH,      LGUI(KC_RGHT)),
    [TD_HAC] = ACTION_TAP_DANCE_DOUBLE(LCTL(KC_SPC), KC_CAPS),
    [TD_2CA] = ACTION_TAP_DANCE_DOUBLE(KC_2,         LCA(KC_2)),
    [TD_3CA] = ACTION_TAP_DANCE_DOUBLE(KC_3,         LCA(KC_3)),
    [TD_0CA] = ACTION_TAP_DANCE_DOUBLE(KC_0,         LCA(KC_0)),
    [TD_WAT] = ACTION_TAP_DANCE_DOUBLE(LCTL(KC_W),   RCS(KC_T)),
    [TD_EAU] = ACTION_TAP_DANCE_DOUBLE(KC_EXLM,      RCS(KC_PGUP)),
    [TD_QAD] = ACTION_TAP_DANCE_DOUBLE(KC_QUES,      RCS(KC_PGDN)),
    [TD_CAX] = ACTION_TAP_DANCE_DOUBLE(LCTL(KC_C),   LCTL(KC_X)),
    [TD_CAA] = ACTION_TAP_DANCE_DOUBLE(LALT(KC_TAB), LCA(KC_TAB)),
    [TD_LPA] = ACTION_TAP_DANCE_DOUBLE(KC_LPRN,      KC_LABK),
    [TD_RPA] = ACTION_TAP_DANCE_DOUBLE(KC_RPRN,      KC_RABK),
    [TD_LBC] = ACTION_TAP_DANCE_DOUBLE(KC_LBRC,      KC_LABK),
    [TD_RBC] = ACTION_TAP_DANCE_DOUBLE(KC_RBRC,      KC_RABK),
};

```

</details>

    [TD_VVV] = ACTION_TAP_DANCE_DOUBLE(RCS(KC_V),    LCTL(KC_V)),
    [TD_CCC] = ACTION_TAP_DANCE_DOUBLE(LCTL(KC_C),   RCS(KC_C)),
    [TD_ZAY] = ACTION_TAP_DANCE_DOUBLE(LCTL(KC_Z),   LCTL(KC_Y)),
    [TD_HAF] = ACTION_TAP_DANCE_DOUBLE(LCTL(KC_H),   LCTL(KC_F)),
    [TD_AAF] = ACTION_TAP_DANCE_DOUBLE(KC_ASTR,      LGUI(KC_UP)),
    [TD_CAL] = ACTION_TAP_DANCE_DOUBLE(KC_COLN,      LGUI(KC_LEFT)),
    [TD_SAR] = ACTION_TAP_DANCE_DOUBLE(KC_SLSH,      LGUI(KC_RGHT)),
    [TD_WAT] = ACTION_TAP_DANCE_DOUBLE(LCTL(KC_W),   RCS(KC_T)),
    [TD_CAA] = ACTION_TAP_DANCE_DOUBLE(LALT(KC_TAB), LCA(KC_TAB)),

※一部抜粋

KC_CAPSのオンオフをするのが面倒に感じていたので、aからzの全てのキーを、2回タップすることで大文字に入力できるようにしました。

その他については同じキーを使用するショートカット、もしくはそんなには使わないがたまに使うキーの組み合わせ、またはタップしたショートカットの逆になるショートカットなどを配置しています。

1回タップで元に戻すLCTL(KC_Z)、2回タップでやり直しのLCTL(KC_Y)、1回タップでタブを閉じるLCTL(KC_W),2回タップで取りたタブを開くRCS(KC_T)がお気に入りです。タップダンスについては設定したものの使っていないものもあったりします。

また、ウィンドウを最大にするLGUI(KC_UP)、ウィンドウを左に配置する LGUI(KC_LEFT)、ウィンドウ 右に配置するLGUI(KC_RGHT)も地味に便利でおすすめです。

## キー配列：キーボードレイアウト

```

    [_BASE] = LAYOUT(
    LCTL(KC_SPC), LT(7,KC_DOT), LT(3,KC_COMM),KC_UP,        TD(TD_VVV),
    LT(4,KC_ESC), KC_LEFT,      KC_RGHT,      LT(6,KC_BTN1),TD(TD_CCC),
    KC_TAB,       XXXXXXX,      XXXXXXX,      KC_DOWN,      LT(2,KC_SPC),
    XXXXXXX,      XXXXXXX,      KC_DEL,       LT(5,KC_BSPC),LT(1,KC_ENT),
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX),

```

まずはデフォルトのレイヤーです。

CTRL配列のホームポジション全てにLT、ホールドによるレイヤー切り替えを設定してあります。基本的にはデフォルトのレイヤーで、人差し指でクリック、小指でESC、薬指で「。」中指で「、」親指でSPC、ENT、SPCを押すだけで執筆作業をしています。

人差し指を右に伸ばすとコピー、少し右斜め上に伸ばすと書式なしで貼り付け、同じキーをを2回タップすると貼り付けで起きるようになっており、基本的には同時に2キー以上押すことなく、執筆及び編集作業が可能です。

カーソル移動については薬指を少し下におろすと左、中指を下に下ろすと右、人差し指を上に伸ばすと上、親指を少し上に伸ばして下という形になっています。

```

    [_MOD1] = LAYOUT(
    KC_CAPS,      TD(TD_CAL),   TD(TD_SAR),   LSFT(KC_UP),  LCTL(KC_A),
    TD(TD_AAF),   LSFT(KC_LEFT),LSFT(KC_RGHT),TD(TD_ZAY),   LCTL(KC_X),
    KC_SCLN,      XXXXXXX,      XXXXXXX,      LSFT(KC_DOWN),LSFT(KC_DEL),
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX),

```

次はレイヤー1、親指でLT(1,KC_ENT)をホールドして使用するレイヤーです。

このレイヤーは基本的にデフォルトのレイヤーでは足りない編集作業を行うためのレイヤーになっています。切り取りや全体の選択、シフトによる文字列の選択などもこのレイヤーです。

お気に入りは親指でホールドしながら人差し指で押せるTD(TD_ZAY)で、1回タップで元に戻す、2回タップでやり直しができるようになっており非常に気に入っています。

タップダンスの使い方を覚えるまでは、それぞれ単独で配置していましたが、タップダンスで組み合わせることでワンキーで済むようになったのでキーボードレイアウトもしやすくなりました。

小指のタップダンスのTD(TD_AAF)は1回のタップで「＊」、2回目のタップでウィンドウの最大化を行います。TD(TD_CAL)は1回タップで「：」、2回タップでウィンドウを左側にタイル表示、TD(TD_SAR)は1回タップで「・」、2回タップでウィンドウを右側にタイル表示するキーになっています。

```

    [_MOD2] = LAYOUT(
    KC_QUOT,      TD(TD_EAU),   TD(TD_QAD),   LSFT(KC_HOME),TD(TD_HAF),
    KC_HASH,      KC_HOME,      KC_END,       TD(TD_WAT),   LSHB,
    KC_DQUO,      XXXXXXX,      XXXXXXX,      LSFT(KC_END), XXXXXXX,
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX),

```

次はレイヤー2、親指を少し右斜め上に伸ばしてLT(2,KC_SPC)をホールドして使用するレイヤーです。

このレイヤーは記号機やキーボードショートカット、ホームなどの使わないようで使うキーが集めてあるレイヤーです。また、タブを閉じる、閉じたタブを開くもこのレイヤーにあります。

Googleの音声入力の場合、発音で入力された後に半角スペースが挿入されることが多いため、TD(TD_HAF)の1回タップで置き換え、2回タップで検索ができるキーがお気に入りです。

基本的にはよく使うキーをホールドしながらでも押しやすい位置に配置しており、使わないけれどもたまに使うキーは小指など押しにくい、もしくはなるべく押したくない場所に配置してあります。

全レイヤーに共通することですが小指の列の4段目、薬指の3段目と4段目、中指の3段目は非常に届きにくいのでなるべくキーを配置しないようにしました。また、ホールドするキーによっては押しにくい場所があるため、指がこんがらがってしまうような場合は配置しないようにしています。

```

    [_MOD3] = LAYOUT(
    KC_TILD,      KC_PLUS,      XXXXXXX,      LCTL(KC_S),   KC_CIRC,
    KC_EQL,       XXXXXXX,      XXXXXXX,      RCS(KC_S),    KC_BSLS,
    KC_AT,        XXXXXXX,      XXXXXXX,      LALT(KC_TAB), LCA(KC_TAB),      
    XXXXXXX,      XXXXXXX,      XXXXXXX,      KC_MINS,      KC_UNDS,
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX),

```

次はレイヤー3、中指でLT(3,KC_COMM)をホールドして使用するレイヤーです。

このレイヤーで一番重要なのは中指でホールドして人差し指をタップするRCS(KC_S)のキーであり、Googleドキュメントで音声入力のオンオフをするキーボードショートカットになっています。

中指をホールドしながら親指を少し上に伸ばしてタップするとウィンドウ切り替え、親指を少し右上に伸ばしてタップするとウィンドウ切り替え選択画面が表示されるようになっているのも非常に便利です。

記号のキーが同じレイヤーに集まっていないのは、使用する頻度と押しやすさを鑑みた結果であり、指を動かす順番という形で覚えていくと、タイプミスすることは少なくなりました。

```

    [_NUM4] = LAYOUT(
    XXXXXXX,      KC_1,         TD(TD_2CA),   TD(TD_3CA),   KC_4,
    XXXXXXX,      KC_5,         KC_6,         KC_7,         KC_8,
    XXXXXXX,      XXXXXXX,      XXXXXXX,      KC_9,         TD(TD_0CA),
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX),

```

次はレイヤー4、小指でLT(4,KC_ESC)をホールドして使用するレイヤーです。

このレイヤーは基本的に数字の入力のみになっています。タップダンスで設定してあるのはGoogleドキュメントで見出しレベル2、見出しレベル3、標準テキストを適用するショートカットです。

小指はあまり多用しないように数字キーだけにしました。

```

    [_AAA5] = LAYOUT(
    TD(TD_L),     TD(TD_O),     TD(TD_E),     TD(TD_Y),     TD(TD_W),
    TD(TD_A),     TD(TD_J),     TD(TD_C),     TD(TD_I),     TD(TD_V),
    TD(TD_Q),     XXXXXXX,      XXXXXXX,      TD(TD_U),     TD(TD_F),
    XXXXXXX,      XXXXXXX,      TD(TD_X),     XXXXXXX,      XXXXXXX,
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX),

```

次はレイヤー5、親指を少し左にずらしてLT(5,KC_BSPC)をホールドして使用するレイヤーです。

このレイヤーは母音に加えて、あまり使用しないキーを設定してあります。yとwはたまに使うものの、最近はGoogleドキュメントの精度が良いので「や」「を」を手入力することも減りました。

配列については基本的にCTRL配列 - v1.1を基準として変更しており、uの位置だけ1個上にずれているのが大きな変更点です。

```

    [_ENG6] = LAYOUT(
    TD(TD_R),     TD(TD_S),     TD(TD_T),     XXXXXXX,      XXXXXXX,
    TD(TD_K),     TD(TD_Z),     TD(TD_D),     XXXXXXX,      XXXXXXX,
    TD(TD_G),     XXXXXXX,      XXXXXXX,      TD(TD_N),     TD(TD_B),
    XXXXXXX,      XXXXXXX,      TD(TD_P),     TD(TD_M),     TD(TD_H),
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX),

```

次はレイヤー6、人差し指でLT(6,KC_BTN1)をホールドして使用するレイヤーです。

人差し指の上と右側は人差し指をホールドしながらでは押しにくいのでキーを設定するのをやめました。その他の配列については基本的にCTRL配列 - v1.1を基準として変更しており、nの位置だけ1個下にずれているのが大きな変更点です.

pが少々押しにくいものの、パピプペポ系のカタカナ語は Google ドキュメントがほとんど正確に変換してくれるため特に問題はありません。

```

    [_KKK7] = LAYOUT(
    XXXXXXX,      XXXXXXX,      KC_GRV,       KC_PERC,      KC_AMPR,
    PRN,          XXXXXXX,      XXXXXXX,      BRC,          XXXXXXX,
    XXXXXXX,      XXXXXXX,      XXXXXXX,      TD(TD_LBC),   TD(TD_RBC),
    XXXXXXX,      XXXXXXX,      KC_DLR,       TD(TD_LPA),   TD(TD_RPA),
    XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX),

```
次はレイヤー7、薬指でLT(7,KC_DOT)をホールドして使用するレイヤーです。

最初は左手だけで全てのキーをカバーするためにホームポジション全てにレイヤーのホールドを設定していたものの、結果的に押せないキーがあることでレイヤーが足りないということがあったため増えたレイヤーでもあります。

基本的にはかっこ関連を基軸として、あまり使わないキーを設定してあるようなレイヤーであり、よく使うのは一度に出力できるPRN、BRCです。

## Vimiumの設定

Vimiumの設定についてZennに投稿しましたので合わせてご一読ください。

https://zenn.dev/ctrl/articles/44564a3fe5fdc2

## 2023年で実現できたこと

- 左手がキーボード、右手がトラックボール 、マイクだけで仕事できるようになった
- Gemini（旧Bard）のおかげで仕事が非常に楽になった
- AIに興味を持ち画像生成もできるようになった 
- 自作キーボードを組み立てること自体は難しくなくなった
- ファームウェアを自分で作れるようになった
- QMKで直接ファームウェアを書き込めるようになった
- マクロの設定方法を覚えた
- タップダンスの設定方法を覚えた

2023年で一番大きな出来事は、自作キーボード作りに夢中になり、ハードウェアについて学べたことです。最初はハンダ付けもとても大変でしたが、先人の方のアドバイスなどを参考にしながら少しずつ慣れてきました。

忙しかったこともあり、SNSや個人的な記事作成についてはあまり進めることができませんでしたが、今年は少しずつアウトプットを増やしていきたいと考えています。

## 2023年で実現できなかったこと

- 基盤を0から作成
- Githubに自分で作成したファームウェアを公開する

キーボードを手に入れることでした。

忙しさは理由になりませんが、中途半端で終わってしまっているので今年、来年にかけてじっくりと取り組んでいきたいと考えており、SNSで繋がる方にご助力をお願いできればと思います。

## まとめと告知

2023年はかなり忙しいこともあり、SNSなどは見るだけになってしまっていましたが、今年は積極的にコミュニケーションを取っていきたいと考えています。

また、リソースに余裕が出てきたため、執筆案件などのお仕事を承ることも可能です。コミュニケーションする中で一緒に仕事をしたい、文章作成したいなどのお気持ちがあれば、遠慮なくご相談ください！

最後までお読みいただきありがとうございました。

https://crowdworks.jp/public/employees/1089210

https://www.lancers.jp/profile/Ctrl

https://coconala.com/users/448062