特徴

2022年1月19日の様子 キーキャップは仮 現在とキー配置は異なる

QMK Firmwareのマクロは、WZ Editor 10、ATOK2017の機能をすぐ使えるよう設定

仕様

仕様
形状
  • 左右一体型 ホームベースに似た六角形
  • 真ん中から左右と手前へ傾斜
大きさ 362mm×215mm×27mm(キーキャップなど突起物を含まず)
重量 約500g
物理配列
  • TK1NISSEを参考
  • 左右に文字キーを置き、中央にテンキーを配置
  • 1号機の失敗を元に、テンキーは45度回した状態にしている
論理配列
  • 日本語入力特化の独自行段系配列
  • 左に子音、右に母音や拗音ようおん促音そくおん(っ)、撥音はつおん(ん)など
キー数
  • 合計:74(最初は101個)
  • 親指キー:5個×2
  • 人差し指、中指、薬指キー:21個×2
  • 小指キー:2個×2
  • 左上に特殊キー2個
  • 中央にテンキー 16個
  • (右上にリセットボタン、LEDインジケータ3個)
キースイッチ CHERRY MX 赤軸
キーキャップ 16mmピッチ対応自作 親指に縦長のキーを4個
キーピッチ 縦16mm、横16~19mm
材質
  • トッププレート:1.5mm厚プラ板
  • キーキャップ:プラ板、プラパイプ、アクリルリキッド、アクリルパウダー
  • 他:1mm厚プラ板、各種プラ棒
コントローラ
  • What's Next Pink(Arduino Micro互換)
  • USB接続(TypeA)
  • キースイッチ用に24個のピン使用可
PCB 無し:0.2mmポリウレタン銅線による空中配線のため
ファームウェア
  • QMK Firmware:2023年4月現在、0.20.3を使用

物理配列

74キー

左右と中央の3箇所に分かれています。

指を方眼紙において印をとり、スキャンしたものをベースにしています。特にTK1NISSEに強い影響を受けています。Kinesis Advantage2のお椀型も考えましたが、大変そうなので止めました。

キーピッチは基本的に16mmです。キースイッチが嵌まる穴が14mm角で、そこからはみ出る爪や押さえの箇所を含んだ寸法は15.6mm角。プラ板の強度や補強に使うプラ材の太さなどを考慮し、キーピッチを16mmにしてみました。

論理配列

非QWERTY

日本語入力に特化した独自の行段系配列です。右側に母音のキーを集めています。名前は付けていませんが、QMK Firmwareのビルドで必要なキーボードの名前は、物理配列を考えていた時の番号から「b02」を使っています。

「p」+数字や記号はテンキーを表しています。QMK Firmwareのテンキーのキーコード名の表記を使っています。

英文を打つには非効率なので、その時は英文用の配列になるようにした事もありますが、5日で止めました。無理。

アンダースコアやチルダの入力はシフトキーを使わず単打で打てるようにしています。

親指のキー

XFキー

日本語変換に関係するキーです。これらのキーを押しながら文字などのキーを押すことでいろいろな役割を果たします。

「ナビ関係」は、カーソルキーやHOMEENDなどナビゲーション関係のキーです。

XF1
単打で空白
左側キー併用でナビ関係/右側併用で数字、記号
XF2
日本語変換時、単打で半角英数字変換
左側キー併用でナビ関係/右側併用で記号
XF3
単打でIME ON、日本語変換
他キー併用で変換に関する機能実行
XF4
単打でIME OFF、ATOK英語入力モードOFF
左側キー併用で記号/右側併用でナビ関係
XF5
単打でEnter

XF1XF5はシャープのパソコンX68000シリーズのキーボードにあったキーから付けています。キーボードの最前列にあり、XF3が変換、XF5がEnterの機能でした。このキーボードもXF3とXF5は同じ機能にしています。スペースキーも変換に使えましたが、私は変換はXF3しか使いませんでした。

他のキー

CAPS
小文字と大文字のトグル操作(SHIFTCAPS LOCK)。
HTML
反対側のキー併用でHTML文書のタグなどを入力/同じ側のキー併用で数字

ALTTABESCは普通のキーボードと同じです。

日本語入力時の主なキー

左に子音、右に母音や拗音ようおんの捨て仮名、促音そくおん(っ)、撥音はつおん(ん)などを集めています。

けいならべによく似ています。母音の並びはたまたまですが、子音の並びは参考にしました。

「ん」はX一文字で設定しています。私が初めて日本語変換を使ったパソコンX1turboⅡ(1986年)がそうなっており、X68000でも同じでした。便利なので、WindowsになってからもWXG4やATOK2008以降で同じように設定しました。

キーマップ

各レイヤのキー配列です。

基本レイヤ

デフォルトのキー配列(英文字は実際には小文字)

ASCII文字の入力用レイヤです。いわゆる半角英字、一部の記号、テンキーの入力。

COPY
PrintScreenと同じ
MUTE
音量の無音化(無音⇄解除のトグル操作)
OPT.1
右側キー併用でファンクションキー
OPT.2
ウェブブラウザでスタイルシートOFF
ALTVYN

COPYは元々表示画面を印刷するキーで、昭和のパソコンにも同名のキーが付いていた機種がありました。ここではPrintScreenに設定し、PriScVistaでスクリーンショットを撮るのに使っています。

IMEインプット メソッド エディタ」ですが、うちの場合はATOK 2017 for Windowsを指します。IME ONやIME OFFはATOK2017の日本語入力ONとOFFを意味します。

XF1レイヤ

XF1押下時(左の紫色の○)

右のキーと併用で数字や数字関係の記号の入力です。

左のキーと併用だと(片手操作)、カーソルキーやHOMEEndPage UpPage Downなど、ナビゲーションキーを操作します。

XF1+XF3
CTRL変換:ATOKで候補ウィンドウが出ている時の前候補表示
XF1+XF5
CTRLEnter:WZ EDITORでHTML文書編集時に段落挿入
case CHB0028:// ()丸括弧
    if (record->event.pressed) {
    SEND_STRING("()" SS_TAP(X_LEFT));
    } else {
    }
    break;

丸括弧の組を打って間に戻る

XF2レイヤ

XF2押下時(左の青い○)

右のキーと併用で記号の入力です。日本語入力時は小書きの文字を打てます。「ぁ」「ょ」等。

左のキーと併用だとXF1押下時と同じナビゲーションキーの操作になります。

XF4レイヤ

XF4押下時(左の青い○)

左のキーと併用で記号の入力です。

右のキーと併用だと(片手操作)、XF1押下時と似た感じのナビゲーションキーの操作になります。

IMEレイヤ

IME ONの状態でXF3押下時(右の赤い○)

ATOKの各機能を使うためのレイヤです。ひらがなやカタカナへの変換、連想変換などを行います。文節移動や文節区切り移動などカーソルが動くものはXF1キーで行います。

各キーにはSHIFTCTRL+文字キーを設定し、ATOKのキーカスタマイズで機能をキーを紐付けています。

XF3+XF1
CTRLTAB:推測変換選択時の変換/前候補

日本語入力時

IME ONの状態でXF3押下時(右の赤い○)

IME ONの状態でXF1を押しながらCAPSを押すと英数+(SHIFT英数)になり、ATOKの英語入力モード+大文字化になります。日本語と英語が混在した文章を書く時、英語の時にIMEをOFFにするのではなく、ONのままで書き進められます。英字の際にも推測変換が効いたり、スペルチェックができたりと便利です。

文章中に出る英字は、私の場合大文字が多いように思います。それなら最初から大文字で書けるよう、英語入力モードになると同時にCAPS LOCKがかかった状態にしてしまおうと思い、そういう風に動くマクロを組みました。もっといいやり方があるかもですが、意図通りに動いているのでOKとします。

HTMLレイヤ(右側キー)

HTMLキー押下時(右の水色の○)

HTML文書でいわゆるタグなどを書くのに使います。開始タグと終了タグを組み合わせて間にカーソルを持ってきたり、よく使う属性を書いたりします。

QMK Firmwareのマクロではなく、WZ EDITORの機能で作っているので、WZ EDITOR上で且つHTMLファイル専用の機能になります。他のエディタや普通のテキストだと使えません。QMKのマクロで書けばいいのでしょうが、とくに困っていないので、このままで行きます。

右のキーと併用では数字が打てるようにしています。

HTMLレイヤ(左側キー)

HTMLキー押下時(左の水色の○)

使用頻度は低いけど無いと困るタグやコメントを書くのに使います。左のキーと併用では数字が打てるようにしています。

数字の並びは右側と違いますが、左手で縦3段のキーを使うのはキツかったので、2段に収まるようにしました。

設定ファイル

一部を記しておきます。

config.h

以下の2行を追加しています。

Ergodox(qmk firmware)の同時押し/レイヤー切替の設定メモ - Qiita自作キーボードに手を出した - ぽよメモを参考にしています。

keymap.c

冒頭に「#include QMK_KEYBOARD_H」が書かれていますが、他に以下の3行を追加しています。

最初のは日本語キーボードの配列を設定しやすいようにするため、2番目はLEDインジケータを使うため、3番目はマクロ文字列送信時に日本語キーボード設定での文字化けを回避するためです。

最初のと3番目は以前「#include "keymap_jp.h"」「#include <sendstring_jis.h>」としていましたが、変更になったようです。

keymap.c 2023年04月29日版
/* Copyright 2020-2023 Mule,KOUNO Motoo
 *
本プログラムはフリー・ソフトウェアです。
あなたは、Free Software Foundationが発行したGNU General Public Licenseのバージョン2、または(あなたの選択により)それ以降のバージョンのいずれかの条件の下で、本プログラムを再配布または変更することができます。
このプログラムは、有用であることを期待して配布されていますが、市場性や特定目的への適合性の暗黙の保証も含めて、いかなる保証もありません。
詳細については、GNU General Public License をご覧ください。このプログラムと一緒に GNU General Public License のコピーを受け取っているはずです。
受け取っていない場合は、をご覧ください。
*/

#include QMK_KEYBOARD_H
#include "keymap_japanese.h"
#include "led.h"
#include <sendstring_japanese.h>  // マクロ文字列送信時に日本語キーボード設定での文字化け回避

// LED Number
#define MICRO_LED_NUM D6
#define MICRO_LED_CAP B7
#define MICRO_LED_SCR B6

// custom keycode
#define   XF2_B   MO(_XF2B)          // XF2
#define   XF2_E   MO(_XF2E)          // XF2 EBASE
#define   XF23SF  OSM(MOD_LSFT)      // XF2→XF3 SHIFT
#define   XF24_d  OSL(_XF24d)        // XF2→XF4 _XF24d
#define   XHTML_R MO(_HTML_R)        // HTML
#define   XHTML_L MO(_HTML_L)        // HTML2
#define   OPT1_KY MO(_OPT1)          // OPT1
#define   OPTC    C(KC_C)
#define   OPTV    C(KC_V)
#define   OPTX    C(KC_X)
#define   OPTZ    C(KC_Z)
#define   OPTY    C(KC_Y)
#define   SF_CAPS S(JP_EISU)
#define   SF_LEFT S(KC_LEFT)
#define   SF_RGHT S(KC_RGHT)
#define   SF_UP   S(KC_UP)
#define   SF_DOWN S(KC_DOWN)
#define   SF_HOME S(KC_HOME)
#define   SF_END  S(KC_END)
#define   CT_HOME C(KC_HOME)
#define   CT_END  C(KC_END)

#define   TG__br  A(C(JP_B))   //  <br> --以下半角
#define   TG__dd  A(C(JP_D))   //  <dd>~
#define   TG__ep  A(C(JP_F))   //  行末移動→ENTER→<p></p>
#define   TG_img  A(C(JP_G))   //  <img src="" alt="">
#define   TG__hr  A(C(JP_H))   //  <hr>
#define   TG_kbd  A(C(JP_K))   //  <kbd><kbd></kbd></kbd>
#define   TG__ol  A(C(JP_M))   //  <ol>~
#define   TG__ul  A(C(JP_N))   //  <ul>~
#define   TG___p  A(C(JP_P))   //  <p></p>
#define   TG_rby  A(C(JP_R))   //  <rp>(</rp><rt></rt><rp>)</rp></ruby>
#define   TG_spn  A(C(JP_S))   //  <span>
#define   TG__dl  A(C(JP_T))   //  <dl>~
#define   TG_sml  A(C(JP_V))   //  <small>
#define   TG__em  A(C(JP_W))   //  <em>
#define   TG_stg  A(C(JP_Y))   //  <strong>
#define   TG___a  A(C(JP_Z))   //  <a href=""></a>
#define   TG__li  A(C(JP_AT))  //  <li>
#define   TG__h1  A(C(KC_F1))  //  <h1></h1>
#define   TG__h2  A(C(KC_F2))  //  <h2></h2>
#define   TG__h3  A(C(KC_F3))  //  <h3></h3>
#define   TG__h4  A(C(KC_F4))  //  <h4></h4>
#define   TG__h5  A(C(KC_F5))  //  <h5></h5>
#define   TG__h6  A(C(KC_F6))  //  <h6></h6>
#define   TG_cm1  A(C(KC_F12)) //  <!--
#define   TG_cm2  A(C(KC_F13)) //  -->
#define   TG_cm3  A(C(KC_F14)) //  <!--  -->
#define   TG_cm4  A(C(KC_F15)) //  <!-- 改行タブ -->
#define   AT_tit  A(C(KC_F10)) //  title=""
#define   AT_lng  A(C(KC_F11)) //  lang=""
#define   AT__id  A(C(KC_F7))  //  id=""
#define   AT_cls  A(C(KC_F8))  //  class=""

// Layer number
#define     _BASE  0
#define     _XF1B  1
#define     _XF2B  2
#define     _XF4B  3
#define    _JBASE  4
#define    _EBASE  5
#define     _XF2E  6
#define     _XF1J  7
#define     _XF2J  8
#define     _XF4J  9
#define    _XF24d 10
#define      _IME 11
#define   _HTML_R 12
#define   _HTML_L 13
#define     _OPT1 14

enum custom_keycodes {
  JP_MODE = SAFE_RANGE,
  EISU_ON,
  EISU_OF,
  CH_0022, // "    jbase 二重引用符 常に半角
  CH_0027, // '    jbase 一重引用符 常に半角
  CH_0030, // 0000       テンキーの0のためATOK設定で常に半角
  CHJ002C, // ,    jbase カンマ 常に半角
  CHB2018, // ‘’  base
  CHE2018, // ‘’ ebase
  CHB201C, // “”  base
  CHE201C, // “” ebase
  CHB0028, // ()    base用 丸括弧 ebase:asciiのため両用可
  CHJFF08, // () jbase
  CHBFF5F, // ⦅⦆  base用 二重丸括弧
  CHJFF5F, // ⦅⦆ jbase ebase
  CHB005B, // []    base用 角括弧 ebase:asciiのため両用可
  CHJFF3B, // [] jbase
  CHB007B, // {}    base用 波括弧 ebase:asciiのため両用可
  CHJFF5B, // {} jbase
  CHB3008, // 〈〉  base用 山括弧
  CHJ3008, // 〈〉 jbase
  CHB300A, // 《》  base用 二重山括弧
  CHJ300A, // 《》 jbase ebase
  CHB300C, // 「」  base
  CHJ300C, // 「」 jbase
  CHB300E, // 『』  base
  CHJ300E, // 『』 jbase
  CHB3010, // 【】  base用 隅括弧
  CHJ3010, // 【】 jbase ebase
  CHB3016, // 〖〗  base用 隅抜き括弧
  CHJ3016, // 〖〗 jbase ebase
  CHB301A, // 〚〛  base用 二重角括弧
  CHJ301A, // 〚〛 jbase ebase
  CHB3014, // 〔〕  base用 亀甲括弧
  CHJ3014, // 〔〕 jbase ebase
  CHB3018, // 〘〙  base用 二重亀甲括弧
  CHJ3018, // 〘〙 jbase ebase
  CHB2019, // ’    base用アポストロフィ(右一重引用符)
  CHJ2019, // ’   jbase用 <span lang="en">付き
  CHE2019, // ’   ebase
  CHBFF0F, // /    base
  CHJFF0F, // /   jbase ebase
  CHB2192, // →    base
  CHJ2192, // →   jbase、ebase
  CHB301D, // 〝〟  base用ダブルミニュート
  CHJ301D, // 〝〟 jbase ebase
  HANN_La,
  HANN_Li,
  HANN_Lu,
  HANN_Le,
  HANN_Lo,
  HANN_ya,
  HANN_yu,
  HANN_yo,
  HANN_wa,
  CSS_OFF,
  CSS_ON,
  LATIN_0,
  KAKKO_1,
  WZHTML,  // WZ EDITOR:HTMLのタグをWZのメニューから打つ
  TAGHTML, // WZ EDITOR:<>(キーボードマクロ)
  TMPHTML, // WZ EDITOR:HTMLテンプレート
  WZ_TIME, // WZ EDITOR:挿入→日付・時刻
  WZ_HOZN, // WZ EDITOR:挿入→水平線
  CR_lt,
  CR_gt,
  CR_quot,
  CR_ensp,
  CR_amp,
  CLCLKEY,
  ERESET,
  EERESET,
  SPC_KEY,
  NAVI_KY,
  XF1B_KY,
  XF1J_KY,
  XF2J_HN,
  XF3_KEY,
  XF4B_NF,
  XF4J_NF,
  XF4J_EJ,
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

  /* map
            1-1,     1-2,     1-3,     1-4,     1-5,     1-6,     1-7,     1-8,     1-9,    1-10,
            2-1,     2-2,     2-3,     2-4,     2-5,     2-6,     2-7,     2-8,     2-9,    2-10,
            3-1,     3-2,     3-3,     3-4,     3-5,     3-6,     3-7,     3-8,     3-9,    3-10,
            4-1,     4-2,     4-3,     4-4,     4-5,     4-6,     4-7,     4-8,     4-9,    4-10,
             P0,    PDOT,    PENT,      P+,      P-,      P*,      P/,     F12,     F11,      F4,
             P1,      P2,      P3,      P6,      P9,      F5,      F3,      F2,      F1,    MUTE,
             P4,      P5,      P8,      P7,     7-5,     7-6,     7-7,     7-8,     7-9,    PSCR,
            8-1,     8-2,     8-3,     8-4,     8-5,     8-6,     8-7,     8-8,     8-9,    8-10,
            9-1,     9-2,     9-3,     9-4,     9-5,     9-6,     9-7,     9-8,     9-9,    9-10,
           10-1,    10-2,    10-3,    10-4,    10-5,    10-6,    10-7,             10-9,   10-10,
           11-1,             11-3
  */

    [_BASE] = LAYOUT(
        XXXXXXX, XHTML_R, XF4B_NF, JP_MODE,  KC_ENT,  KC_ESC, CSS_OFF, JP_MINS, KC_LEFT, KC_RGHT, 
        XXXXXXX, JP_TILD, SF_CAPS, JP_COMM,  JP_DOT,    JP_E,    JP_X,  KC_DEL, XXXXXXX,    OPTZ,
        XXXXXXX, JP_SLSH, KC_BSPC,    JP_A,    JP_I,    JP_O,    JP_C, XXXXXXX, JP_UNDS, XXXXXXX,
        JP_DQUO,    JP_Q,    JP_L,    JP_U, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
          KC_P0, KC_PDOT, KC_PENT, KC_PPLS, KC_PMNS, KC_PAST, KC_PSLS, XXXXXXX, XXXXXXX, XXXXXXX,
          KC_P1,   KC_P2,   KC_P3,   KC_P6,   KC_P9, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MUTE,
          KC_P4,   KC_P5,   KC_P8,   KC_P7, XXXXXXX, XXXXXXX,   JP_AT, XXXXXXX,    OPTC, KC_PSCR,
           JP_F,    JP_B,     JP_H,    JP_M,    JP_R,    JP_Y,    JP_W,    OPTV, XXXXXXX, XXXXXXX,
        XXXXXXX,    JP_P,    JP_S,    JP_K,    JP_T,    JP_N, KC_LSFT, KC_LCTL,    JP_V,    JP_D,
        XXXXXXX,    JP_J,    JP_Z,    JP_G, OPT1_KY, KC_LALT,  KC_TAB,          XHTML_L, XXXXXXX,
        XF1B_KY,            XF2_B
    ),

    [_XF1B] = LAYOUT(
        XXXXXXX, XXXXXXX,   XXXXXXX,    XXXXXXX, C(KC_ENT), XXXXXXX, XXXXXXX, JP_PLUS, SF_LEFT, SF_RGHT,
        XXXXXXX,  JP_EQL,   XXXXXXX,       JP_0,   KC_PDOT,    JP_3,    JP_9, XXXXXXX, XXXXXXX, JP_CIRC,
        XXXXXXX, JP_ASTR,    KC_SPC,       JP_1,      JP_2,    JP_6,    JP_8, XXXXXXX,    JP_7, XXXXXXX,
        JP_HASH, CHB0028,      JP_4,       JP_5,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX,   XXXXXXX,    XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX,   XXXXXXX,    XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX,   XXXXXXX,    XXXXXXX,   XXXXXXX, XXXXXXX, KC_PGUP, XXXXXXX, KC_BSPC, XXXXXXX,
         KC_DEL, XXXXXXX,    KC_END,    KC_HOME,     SF_UP, KC_PGDN, SF_DOWN,  KC_ENT, XXXXXXX, XXXXXXX,
        XXXXXXX,  CT_END,   CT_HOME,    KC_RGHT,     KC_UP, KC_LEFT, SF_LEFT, SF_RGHT, SF_HOME, KC_DOWN,
        XXXXXXX, XXXXXXX,   XXXXXXX,     SF_END,     KC_P1, XXXXXXX, XXXXXXX,          XXXXXXX, XXXXXXX,
        _______,            XXXXXXX
    ),

    [_XF2B] = LAYOUT(
        XXXXXXX, XXXXXXX,  XF24_d,  XF23SF, XXXXXXX, XXXXXXX,    CSS_ON,  JP_GRV, XXXXXXX, XXXXXXX,
        XXXXXXX, CHB2019, CLCLKEY, CHB3010, CHB3016, XXXXXXX,   XXXXXXX,  ERESET, XXXXXXX,    OPTY,
        XXXXXXX, CHBFF0F,  KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        JP_QUOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        CH_0030, JP_COMM, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX,  KC_NUM,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   KC_PGUP, XXXXXXX,    OPTX, KC_SCRL,
         KC_DEL, XXXXXXX,  KC_END, KC_HOME,   SF_UP, KC_PGDN,   SF_DOWN, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX,  CT_END, CT_HOME, KC_RGHT,   KC_UP, KC_LEFT,   SF_LEFT, SF_RGHT, SF_HOME, KC_DOWN,
        XXXXXXX, XXXXXXX, XXXXXXX,  SF_END,   KC_P2, XXXXXXX,   XXXXXXX,          XXXXXXX, XXXXXXX,
        XXXXXXX,          _______
    ),

    [_XF4B] = LAYOUT(
        XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX,    CSS_ON,  SF_END, SF_LEFT, SF_RGHT,
        XXXXXXX, XXXXXXX, XXXXXXX, SF_HOME, KC_DOWN, KC_RGHT,   SF_DOWN,  ERESET, XXXXXXX,    OPTY,
        XXXXXXX, CT_HOME,  CT_END, KC_LEFT,   KC_UP,   SF_UP,   KC_PGDN, XXXXXXX, KC_PGUP, XXXXXXX,
        XXXXXXX, XXXXXXX, KC_HOME,  KC_END, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        CH_0030, JP_COMM, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX,  KC_NUM,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   JP_PIPE, XXXXXXX,    OPTX, KC_SCRL,
        CHB301D, CHB005B, CHB2018, CHB201C, CHB300A,  JP_YEN,   JP_AMPR, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, JP_COLN, JP_PERC, CHB2192, JP_EXLM, JP_QUES,   LATIN_0, KAKKO_1, CHB007B,  JP_DLR,
        XXXXXXX, JP_SCLN, JP_RABK, JP_LABK,   KC_P3, XXXXXXX, A(KC_TAB),          XXXXXXX, XXXXXXX,
        XXXXXXX,          XXXXXXX
    ),

    [_JBASE] = LAYOUT(
        XXXXXXX, XHTML_R, XF4J_NF, XF3_KEY,  KC_ENT,  KC_ESC, CSS_OFF, JP_MINS, KC_LEFT, KC_RGHT, 
        XXXXXXX, JP_TILD, SF_CAPS, JP_COMM,  JP_DOT,    JP_E,    JP_X,  KC_DEL, XXXXXXX,    OPTZ,
        XXXXXXX, JP_SLSH, KC_BSPC,    JP_A,    JP_I,    JP_O,    JP_C, XXXXXXX, JP_UNDS, XXXXXXX,
        CH_0022,    JP_Q,    JP_L,    JP_U, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
          KC_P0, KC_PDOT, KC_PENT, KC_PPLS, KC_PMNS, KC_PAST, KC_PSLS, XXXXXXX, XXXXXXX, XXXXXXX,
          KC_P1,   KC_P2,   KC_P3,   KC_P6,   KC_P9, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MUTE,
          KC_P4,   KC_P5,   KC_P8,   KC_P7, XXXXXXX, XXXXXXX,   JP_AT, XXXXXXX,    OPTC, KC_PSCR,
           JP_F,    JP_B,    JP_H,    JP_M,    JP_R,    JP_Y,    JP_W,    OPTV, XXXXXXX, XXXXXXX,
        XXXXXXX,    JP_P,    JP_S,    JP_K,    JP_T,    JP_N, KC_LSFT, KC_LCTL,    JP_V,    JP_D,
        XXXXXXX,    JP_J,    JP_Z,    JP_G, OPT1_KY, KC_LALT,  KC_TAB,          XHTML_L, XXXXXXX,
        XF1J_KY,          XF2J_HN
    ),	

    [_EBASE] = LAYOUT(
        XXXXXXX, XHTML_R, XF4J_EJ, XF3_KEY,  KC_ENT,  KC_ESC, CSS_OFF, JP_MINS, KC_LEFT, KC_RGHT, 
        XXXXXXX, JP_TILD, SF_CAPS, JP_COMM,  JP_DOT,    JP_E,    JP_X,  KC_DEL, XXXXXXX,    OPTZ,
        XXXXXXX, JP_SLSH, KC_BSPC,    JP_A,    JP_I,    JP_O,    JP_C, XXXXXXX, JP_UNDS, XXXXXXX,
        CH_0022,    JP_Q,    JP_L,    JP_U, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
          KC_P0, KC_PDOT, KC_PENT, KC_PPLS, KC_PMNS, KC_PAST, KC_PSLS, XXXXXXX, XXXXXXX, XXXXXXX,
          KC_P1,   KC_P2,   KC_P3,   KC_P6,   KC_P9, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MUTE,
          KC_P4,   KC_P5,   KC_P8,   KC_P7, XXXXXXX, XXXXXXX,   JP_AT, XXXXXXX,    OPTC, KC_PSCR,
           JP_F,    JP_B,    JP_H,    JP_M,    JP_R,    JP_Y,    JP_W,    OPTV, XXXXXXX, XXXXXXX,
        XXXXXXX,    JP_P,    JP_S,    JP_K,    JP_T,    JP_N, KC_LSFT, KC_LCTL,    JP_V,    JP_D,
        XXXXXXX,    JP_J,    JP_Z,    JP_G, OPT1_KY, KC_LALT,  KC_TAB,          XHTML_L, XXXXXXX,
        XF1J_KY,            XF2_E
    ),

    [_XF2E] = LAYOUT(
        XXXXXXX, XXXXXXX, _______,  XF23SF, XXXXXXX, XXXXXXX,    CSS_ON,  JP_GRV, SF_LEFT, SF_RGHT,
        XXXXXXX, CHE2019, CLCLKEY, CHJ3010, CHJ3016, XXXXXXX,   XXXXXXX, EERESET, XXXXXXX,    OPTY,
        XXXXXXX, CHJFF0F,  KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        JP_QUOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        CH_0030, JP_COMM, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX,  KC_NUM,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   JP_PIPE, XXXXXXX,    OPTX, KC_SCRL,
        CHJ301D, CHB005B, CHE2018, CHE201C, CHJ300A,  JP_YEN,   JP_AMPR, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, JP_COLN, JP_PERC, CHJ2192, JP_EXLM, JP_QUES,   LATIN_0, KAKKO_1, CHB007B,  JP_DLR,
        XXXXXXX, JP_SCLN, JP_RABK, JP_LABK,   KC_P6, XXXXXXX,   XXXXXXX,           XXXXXXX, XXXXXXX,
        XXXXXXX,           _______
    ),

    [_XF1J] = LAYOUT(
        XXXXXXX, XXXXXXX,   XXXXXXX, C(JP_HENK), C(KC_ENT), XXXXXXX, XXXXXXX, JP_PLUS, SF_LEFT, SF_RGHT,
        XXXXXXX,  JP_EQL,   EISU_ON,       JP_0,   KC_PDOT,    JP_3,    JP_9, XXXXXXX, XXXXXXX, JP_CIRC,
        XXXXXXX, JP_ASTR, S(KC_SPC),       JP_1,      JP_2,    JP_6,    JP_8, XXXXXXX,    JP_7, XXXXXXX,
        JP_HASH, CHJFF08,      JP_4,       JP_5,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX,   XXXXXXX,    XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX,   XXXXXXX,    XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX,   XXXXXXX,    XXXXXXX,   XXXXXXX, XXXXXXX, KC_PGUP, XXXXXXX, KC_BSPC, XXXXXXX,
         KC_DEL, XXXXXXX,    KC_END,    KC_HOME,     SF_UP, KC_PGDN, SF_DOWN,  KC_ENT, XXXXXXX, XXXXXXX,
        XXXXXXX,  CT_END,   CT_HOME,    KC_RGHT,     KC_UP, KC_LEFT, SF_LEFT, SF_RGHT, SF_HOME, KC_DOWN,
        XXXXXXX, XXXXXXX,   XXXXXXX,     SF_END,     KC_P7, XXXXXXX, XXXXXXX,          XXXXXXX, XXXXXXX,
        _______,            XXXXXXX
    ),

    [_XF2J] = LAYOUT(
        XXXXXXX, XXXXXXX,  XF24_d,  XF23SF, XXXXXXX, XXXXXXX,    CSS_ON,  JP_GRV, XXXXXXX, XXXXXXX,
        XXXXXXX, CHJ2019, XXXXXXX, CHJ3010, CHJ3016, HANN_Le,   HANN_yo,  ERESET, XXXXXXX,    OPTY,
        XXXXXXX, CHJFF0F,  KC_ESC, HANN_La, HANN_Li, HANN_Lo,      JP_C, XXXXXXX, HANN_wa, XXXXXXX,
        CH_0027, HANN_ya, HANN_yu, HANN_Lu, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        CH_0030, CHJ002C, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX,  KC_NUM,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   KC_PGUP, XXXXXXX,    OPTX, KC_SCRL,
         KC_DEL, XXXXXXX,  KC_END, KC_HOME,   SF_UP, KC_PGDN,   SF_DOWN, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX,  CT_END, CT_HOME, KC_RGHT,   KC_UP, KC_LEFT,   SF_LEFT, SF_RGHT, SF_HOME, KC_DOWN,
        XXXXXXX, XXXXXXX, XXXXXXX,  SF_END,   KC_P2, XXXXXXX,   XXXXXXX,          XXXXXXX, XXXXXXX,
        XXXXXXX,          _______
    ),

    [_XF4J] = LAYOUT(
        XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX,    CSS_ON,  SF_END, SF_LEFT, SF_RGHT,
        XXXXXXX, XXXXXXX, XXXXXXX, SF_HOME, KC_DOWN, KC_RGHT,   SF_DOWN,  ERESET, XXXXXXX,    OPTY,
        XXXXXXX, CT_HOME,  CT_END, KC_LEFT,   KC_UP,   SF_UP,   KC_PGDN, XXXXXXX, KC_PGUP, XXXXXXX,
        XXXXXXX, XXXXXXX, KC_HOME,  KC_END, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        CH_0030, CHJ002C, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX,  KC_NUM,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   JP_PIPE, XXXXXXX,    OPTX, KC_SCRL,
        CHJ301D, CHJFF3B, CHJ300E, CHJ300C, CHJ300A,  JP_YEN,   JP_AMPR, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, JP_COLN, JP_PERC, CHJ2192, JP_EXLM, JP_QUES,   LATIN_0, KAKKO_1, CHJFF5B,  JP_DLR,
        XXXXXXX, JP_SCLN, JP_RABK, JP_LABK,   KC_P9, XXXXXXX, A(KC_TAB),          XXXXXXX, XXXXXXX,
        XXXXXXX,          XXXXXXX
    ),

    [_XF24d] = LAYOUT(
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX,      XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, C(A(KC_DEL)), XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, C(JP_A), XXXXXXX, XXXXXXX, XXXXXXX,      XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,      XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,      XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,      XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,      XXXXXXX, XXXXXXX, XXXXXXX,
        C(JP_F), XXXXXXX, WZ_HOZN, WZ_TIME, XXXXXXX, XXXXXXX, XXXXXXX,      XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, C(JP_V), C(JP_X), C(JP_C), XXXXXXX,      XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, C(JP_Y), C(JP_Z), XXXXXXX,    JP_A, XXXXXXX, XXXXXXX,               XXXXXXX, XXXXXXX,
        XXXXXXX,          XXXXXXX
    ),

    [_IME] = LAYOUT(
        XXXXXXX,  XXXXXXX,   XXXXXXX,   _______,   XXXXXXX,   XXXXXXX,   XXXXXXX, XXXXXXX,   XXXXXXX,   XXXXXXX,
        XXXXXXX,  XXXXXXX,   XXXXXXX,   XXXXXXX,   XXXXXXX,   XXXXXXX,   XXXXXXX, XXXXXXX,   XXXXXXX,   XXXXXXX,
        XXXXXXX,  XXXXXXX,   XXXXXXX,   XXXXXXX,   XXXXXXX,   XXXXXXX,   XXXXXXX, XXXXXXX,   XXXXXXX,   XXXXXXX,
        XXXXXXX,  XXXXXXX,   XXXXXXX,   XXXXXXX,   XXXXXXX,   XXXXXXX,   XXXXXXX, XXXXXXX,   XXXXXXX,   XXXXXXX,
        XXXXXXX,  XXXXXXX,   XXXXXXX,   XXXXXXX,   XXXXXXX,   XXXXXXX,   XXXXXXX, XXXXXXX,   XXXXXXX,   XXXXXXX,
        XXXXXXX,  XXXXXXX,   XXXXXXX,   XXXXXXX,   XXXXXXX,   XXXXXXX,   XXXXXXX, XXXXXXX,   XXXXXXX,   XXXXXXX,
        XXXXXXX,  XXXXXXX,   XXXXXXX,   XXXXXXX,   XXXXXXX,   XXXXXXX,   XXXXXXX, XXXXXXX,   XXXXXXX,   XXXXXXX,
      RCS(JP_F),RCS(JP_B), RCS(JP_H), RCS(JP_M), RCS(JP_R), RCS(JP_Y), RCS(JP_W), XXXXXXX,   XXXXXXX,   XXXXXXX,
        XXXXXXX,RCS(JP_P), RCS(JP_S), RCS(JP_K), RCS(JP_T), RCS(JP_N),   XXXXXXX, XXXXXXX, RCS(JP_V), RCS(JP_D),
        XXXXXXX,RCS(JP_J), RCS(JP_Z), RCS(JP_G),      JP_B,   XXXXXXX, C(KC_TAB),            XXXXXXX,   XXXXXXX,
        XXXXXXX,             XXXXXXX
    ),

    [_HTML_R] = LAYOUT(
        XXXXXXX, _______,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX,   XXXXXXX,   KC_P0, KC_PDOT,   KC_P3,   KC_P9,   XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, S(KC_SPC),   KC_P1,   KC_P2,   KC_P6,   KC_P8,   XXXXXXX,   KC_P7, XXXXXXX,
        XXXXXXX, XXXXXXX,     KC_P4,   KC_P5, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,  TG__li,   XXXXXXX,  WZHTML, XXXXXXX,
         TG__ep,  TG__br,    TG__hr,  TG__ol,  TG_rby,  TG_stg,  TG__em, C(KC_ENT), XXXXXXX, XXXXXXX,
        XXXXXXX,  TG___p,    TG_spn,  TG_kbd,  TG__dl,  TG__ul, TMPHTML,   TAGHTML,  AT_lng,  TG__dd,
        XXXXXXX,  AT_cls,    AT__id,  AT_tit,    JP_C, XXXXXXX, XXXXXXX,            XXXXXXX, XXXXXXX,
        XXXXXXX,            XXXXXXX
    ),

     [_HTML_L] = LAYOUT(
        XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,    TG_cm2, XXXXXXX, XXXXXXX,
        XXXXXXX,  CR_amp, XXXXXXX, XXXXXXX,  TG_cm1,  TG__h3,  TG_sml,   XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX,  TG_cm3, CR_ensp,  TG___a,  TG_img,  TG__h6, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX,
        CR_quot,  TG_cm4,  TG__h4,  TG__h5, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX,
          KC_P0,   KC_P9,   KC_P8,   KC_P7,   KC_P6, XXXXXXX,   KC_P0,   XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX,   KC_P5,   KC_P4,   KC_P3,   KC_P2,   KC_P1, XXXXXXX,   XXXXXXX, XXXXXXX, KC_PDOT,
        XXXXXXX, XXXXXXX,   CR_gt,   CR_lt,    JP_D, XXXXXXX, XXXXXXX,            XXXXXXX, XXXXXXX,
        XXXXXXX,          XXXXXXX
    ),

    [_OPT1] = LAYOUT(
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,    JP_E,  KC_F12, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX,  KC_F10,  KC_F11,   KC_F3,   KC_F9, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX,   KC_F1,   KC_F2,   KC_F6,   KC_F8, XXXXXXX,   KC_F7, XXXXXXX,
        XXXXXXX, XXXXXXX,   KC_F4,   KC_F5, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        CSS_OFF,  CSS_ON, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, QK_BOOT,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX,          XXXXXXX, XXXXXXX,
        XXXXXXX,          XXXXXXX
    ),

};

static bool XF1B_pressed = false;
static uint16_t XF1B_pressed_time = 0;
static bool XF1J_pressed = false;
static uint16_t XF1J_pressed_time = 0;
static bool XF3_pressed = false;
static uint16_t XF3_pressed_time = 0;
static bool XF2J_pressed = false;
static uint16_t XF2J_pressed_time = 0;
static bool XF4B_pressed = false;
static uint16_t XF4B_pressed_time = 0;
static bool XF4J_pressed = false;
static uint16_t XF4J_pressed_time = 0;
static bool XF4E_pressed = false;
static uint16_t XF4E_pressed_time = 0;

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
	switch (keycode) {

    case CH_0022://  二重引用符一つ 半角で入力
        if (record->event.pressed) {
            SEND_STRING(SS_TAP(X_INT5) "\"" SS_TAP(X_INT4));
            //SEND_STRING("@^0022");
        } else {
        }
        break;

    case CH_0027://  一重引用符一つ 半角で入力
        if (record->event.pressed) {
            SEND_STRING(SS_TAP(X_INT5) "'" SS_TAP(X_INT4));
            //SEND_STRING("@^0027");
        } else {
        }
        break;

	case CH_0030:// 0000
		if (record->event.pressed) {
			SEND_STRING(SS_TAP(X_P0) SS_TAP(X_P0) SS_TAP(X_P0) SS_TAP(X_P0));
		} else {
		}
		break;

	case CHJ002C:// jbase カンマ 常に半角 X_INT5:無変換、X_INT4:変換
		if (record->event.pressed) {
			SEND_STRING(SS_TAP(X_INT5) "," SS_TAP(X_INT4));
		} else {
		}
		break;

    case CHB2018:// ‘’ base 一重引用符 以下全角記号 括弧は確定後、次に一文字移動する手間がある
        if (record->event.pressed) {
            SEND_STRING(SS_TAP(X_INT4) "@^^2018" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT) SS_TAP(X_INT5));
        } else {
        }
        break;

    case CHE2018:// ‘’ ebase 一重引用符
        if (record->event.pressed) {
            SEND_STRING("@^^2018" SS_DELAY(20) SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT));
        } else {
        }
        break;

    case CHB201C:// “” base 二重引用符
        if (record->event.pressed) {
            SEND_STRING(SS_TAP(X_INT4) "@^^201+" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT) SS_TAP(X_INT5));
        } else {
        }
        break;

    case CHE201C:// “” ebase 二重引用符
        if (record->event.pressed) {
            SEND_STRING("@^^201+" SS_DELAY(20) SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT));
        } else {
        }
        break;

	case CHB0028:// () base ebase 丸括弧
		if (record->event.pressed) {
			SEND_STRING("()" SS_TAP(X_LEFT));
		} else {
		}
		break;

    case CHJFF08: // () jbase 丸括弧
        if (record->event.pressed) {
            SEND_STRING("()" SS_TAP(X_ENT) SS_TAP(X_LEFT));
        } else {
        }
        break;

    case CHBFF5F: // ⦅⦆ jbase ebase 二重丸括弧
        if (record->event.pressed) {
            SEND_STRING(SS_TAP(X_INT4) "@^^995f" SS_DELAY(20) SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT) SS_TAP(X_INT5));
        } else {
        }
        break;

    case CHJFF5F: // ⦅⦆ base 二重丸括弧
        if (record->event.pressed) {
            SEND_STRING("@^^995f" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT));
        } else {
        }
        break;

	case CHB005B: // [] base ebase 角括弧
        if (record->event.pressed) {
            SEND_STRING("[]" SS_TAP(X_LEFT));
        } else {
        }
        break;

    case CHJFF3B: // [] JBASE用角括弧
        if (record->event.pressed) {
            SEND_STRING("@^^993b" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT));
        } else {
        }
        break;

    case CHB007B: //  {} base ebase 波括弧
        if (record->event.pressed) {
            SEND_STRING("{}" SS_TAP(X_LEFT));
        } else {
        }
        break;

    case CHJFF5B: // {} 波括弧
        if (record->event.pressed) {
            SEND_STRING("{}" SS_TAP(X_ENT) SS_TAP(X_LEFT));
        } else {
        }
        break;

    case CHB3008: // 〈〉 base 山括弧
        if (record->event.pressed) {
            SEND_STRING(SS_TAP(X_INT4) "@^^3008" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT) SS_TAP(X_INT5));
        } else {
        }
        break;

    case CHJ3008: // 〈〉 山括弧
        if (record->event.pressed) {
            SEND_STRING("@^^3008" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT));
        } else {
        }
        break;

    case CHB300A: // 《》 BASE用二重山括弧
        if (record->event.pressed) {
            SEND_STRING(SS_TAP(X_INT4) "@^^300=" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT) SS_TAP(X_INT5));
        } else {
        }
        break;

    case CHJ300A: // 《》 JBASE、EBASE用二重山括弧
        if (record->event.pressed) {
            SEND_STRING("@^^300=" SS_DELAY(20) SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT));
        } else {
        }
        break;

    case CHB300C: // 「」 BASE用カギ括弧
        if (record->event.pressed) {
            SEND_STRING(SS_TAP(X_INT4) "[]" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT) SS_TAP(X_INT5));
        } else {
        }
        break;

    case CHJ300C: // 「」 カギ括弧
        if (record->event.pressed) {
            SEND_STRING("[]" SS_TAP(X_ENT) SS_TAP(X_LEFT));
        } else {
        }
        break;

    case CHB300E: // 『』 BASE用二重カギ括弧
        if (record->event.pressed) {
            SEND_STRING(SS_TAP(X_INT4) "@^^300%" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT) SS_TAP(X_INT5));
        } else {
        }
        break;

    case CHJ300E: // 『』 二重カギ括弧
        if (record->event.pressed) {
            SEND_STRING("@^^300%" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT));
        } else {
        }
        break;

    case CHB3010: // 【】 BASE用隅括弧
        if (record->event.pressed) {
            SEND_STRING(SS_TAP(X_INT4) "@^^3010" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT) SS_TAP(X_INT5));
        } else {
        }
        break;

    case CHJ3010: // 【】 隅括弧
        if (record->event.pressed) {
            SEND_STRING("@^^3010" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT));
        } else {
        }
        break;

    case CHB3016: // 〖〗 BASE用白抜き隅括弧
        if (record->event.pressed) {
            SEND_STRING(SS_TAP(X_INT4) "@^^3016" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT) SS_TAP(X_INT5));
        } else {
        }
        break;

    case CHJ3016: // 〖〗 白抜き隅括弧
        if (record->event.pressed) {
            SEND_STRING("@^^3016" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT));
        } else {
        }
        break;

    case CHB301A: // 〚〛 BASE用二重角括弧
        if (record->event.pressed) {
            SEND_STRING(SS_TAP(X_INT4) "@^^301=" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT) SS_TAP(X_INT5));
        } else {
        }
        break;

    case CHJ301A: // 〚〛 二重角括弧
        if (record->event.pressed) {
            SEND_STRING("@^^301=" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT));
        } else {
        }
        break;

    case CHB3014: // 〔〕 BASE用亀甲括弧
        if (record->event.pressed) {
            SEND_STRING(SS_TAP(X_INT4) "@^^3014" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT) SS_TAP(X_INT5));
        } else {
        }
        break;

    case CHJ3014: // 〔〕 亀甲括弧
        if (record->event.pressed) {
            SEND_STRING("@^^3014" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT));
        } else {
        }
        break;

    case CHB3018: // 〘〙 BASE用二重亀甲括弧
        if (record->event.pressed) {
            SEND_STRING(SS_TAP(X_INT4) "@^^3018" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT) SS_TAP(X_INT5));
        } else {
        }
        break;

    case CHJ3018: // 〘〙 二重亀甲括弧
        if (record->event.pressed) {
            SEND_STRING("@^^3018" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT));
        } else {
        }
        break;

    case CHB2019: // ’ BASE用アポストロフィ U+2019
        if (record->event.pressed) {
            SEND_STRING(SS_TAP(X_INT4) "@^2019" SS_DELAY(20) SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_INT5));
        } else {
        }
        break;

    case CHJ2019: // ’ JBASE用アポストロフィ U+2019
        if (record->event.pressed) {
            SEND_STRING("@^2019" SS_DELAY(20) SS_TAP(X_INT4) SS_TAP(X_ENT));
        } else {
        }
        break;

    case CHE2019: // ’ EBASE用アポストロフィ U+2019
        if (record->event.pressed) {
            SEND_STRING("@^2019" SS_DELAY(20) SS_TAP(X_INT4) SS_TAP(X_ENT));
        } else {
        }
        break;

    case CHBFF0F: // / BASE用全角スラッシュ
        if (record->event.pressed) {
            SEND_STRING(SS_TAP(X_INT4) "@^990f" SS_DELAY(20) SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_INT5));
        } else {
        }
        break;

    case CHJFF0F: // / JBASE用全角スラッシュ
        if (record->event.pressed) {
            SEND_STRING("@^990f" SS_DELAY(20) SS_TAP(X_INT4) SS_TAP(X_ENT));
        } else {
        }
        break;

    case CHB2192: // → BASE用右向き矢印
        if (record->event.pressed) {
            SEND_STRING(SS_TAP(X_INT4) "@k" SS_DELAY(20) SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_INT5));
        } else {
        }
        break;

    case CHJ2192: // → JBASE、EBASE用右向き矢印
        if (record->event.pressed) {
            SEND_STRING("@k" SS_DELAY(20) SS_TAP(X_INT4) SS_TAP(X_ENT));
        } else {
        }
        break;

    case CHB301D: // 〝〟 BASE用ダブルミニュート
        if (record->event.pressed) {
            SEND_STRING(SS_TAP(X_INT4) "@^^301d" SS_DELAY(20) SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT) SS_TAP(X_INT5));
        } else {
        }
        break;

    case CHJ301D: // 〝〟 JBASE、EBASE用ダブルミニュート
        if (record->event.pressed) {
            SEND_STRING("@^^301d" SS_DELAY(20) SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT));
        } else {
        }
        break;

    case HANN_La:// ぁ
        if (record->event.pressed) {
            SEND_STRING(SS_LSFT("a"));
        } else {
        }
        break;

    case HANN_Li:// ぃ
        if (record->event.pressed) {
            SEND_STRING(SS_LSFT("i"));
        } else {
        }
        break;

    case HANN_Lu:// ぅ
        if (record->event.pressed) {
            SEND_STRING(SS_LSFT("u"));
        } else {
        }
        break;

    case HANN_Le:// ぇ
        if (record->event.pressed) {
            SEND_STRING(SS_LSFT("e"));
        } else {
        }
        break;

    case HANN_Lo:// ぉ
        if (record->event.pressed) {
            SEND_STRING(SS_LSFT("o"));
        } else {
        }
        break;

    case HANN_ya:// ゃ
        if (record->event.pressed) {
            SEND_STRING(SS_LSFT("ya"));
        } else {
        }
        break;

    case HANN_yu:// ゅ
        if (record->event.pressed) {
            SEND_STRING(SS_LSFT("yu"));
        } else {
        }
        break;

    case HANN_yo:// ょ
        if (record->event.pressed) {
            SEND_STRING(SS_LSFT("yo"));
        } else {
        }
        break;

    case HANN_wa:// ゎ
        if (record->event.pressed) {
            SEND_STRING("lwa");
        } else {
        }
        break;

    case CSS_OFF: // FirefoxのCSSをOFFにする
        if (record->event.pressed) {
            SEND_STRING(SS_LALT("v") SS_DELAY(20) "y" SS_DELAY(20) "n");
        } else {
        }
        break;

    case CSS_ON: // FirefoxのCSSをONにする
        if (record->event.pressed) {
            SEND_STRING(SS_LALT("v") SS_DELAY(20) "y" SS_DELAY(20) "b");
        } else {
        }
        break;

    case LATIN_0: // 欧文文字
        if (record->event.pressed) {
            SEND_STRING(SS_LALT("i") SS_DELAY(20) "u");
        } else {
        }
        break;

    case WZHTML: // HTMLのタグをWZのメニューから打つ
        if (record->event.pressed) {
            SEND_STRING(SS_LALT("i") SS_DELAY(20) "m" SS_DELAY(2) "m");
        } else {
        }
        break;

    case TAGHTML: // HTMLのタグ前後記号のみ IME OFF、BASEに抜ける BASEに文字が無いキーに割り当てること
        if (record->event.pressed) {
		SEND_STRING(SS_DOWN(X_LALT) SS_LCTL("5") SS_UP(X_LALT));
        } else {
        }
        break;

    case TMPHTML: // HTMLテンプレート WZ挿入→ファイル機能
        if (record->event.pressed) {
          SEND_STRING(SS_TAP(X_INT5));
          layer_move(_BASE);
            SEND_STRING(SS_LALT("i") SS_DELAY(20) "f" SS_TAP(X_ENT));
            SEND_STRING( SS_DELAY(20) "D:\\Work\\wz\\qmk_html" SS_DELAY(80) SS_TAP(X_ENT));
        } else {
        }
        break;

    case WZ_TIME:// WZ EDITOR:挿入→日付・時刻
        if (record->event.pressed) {
            SEND_STRING(SS_LALT("i") SS_DELAY(20) "t");
        } else {
        }
        break;

    case WZ_HOZN:// WZ EDITOR:挿入→水平線
        if (record->event.pressed) {
            SEND_STRING(SS_LALT("i") SS_DELAY(20) "h");
        } else {
        }
        break;

    case CR_lt:// 文字参照:<
        if (record->event.pressed) {
            SEND_STRING("<");
        } else {
        }
        break;

    case CR_gt:// 文字参照:>
        if (record->event.pressed) {
            SEND_STRING(">");
        } else {
        }
        break;

    case CR_quot:// 文字参照:"
        if (record->event.pressed) {
            SEND_STRING(""");
        } else {
        }
        break;

    case CR_ensp:// 文字参照:EN SPACE
        if (record->event.pressed) {
            SEND_STRING(" ");
        } else {
        }
        break;

    case CR_amp:// 文字参照:&
        if (record->event.pressed) {
            SEND_STRING("&");
        } else {
        }
        break;

    case CLCLKEY: // CLCL起動 クリップボード監視
        if (record->event.pressed) {
			SEND_STRING(SS_DOWN(X_LSFT) SS_LALT("c") SS_UP(X_LSFT));
        } else {
        }
        break;

	case EISU_ON:
		if (record->event.pressed) {
			// キーコード EISU_ON が押された時  英数(ATOK英語入力モード)
			SEND_STRING(SS_DOWN(X_LSFT) SS_LCTL("^") SS_UP(X_LSFT) SS_DOWN(X_LSFT) SS_TAP(X_CAPS) SS_UP(X_LSFT));
			layer_on(_EBASE);
		} else {
		}
		break;

	case EISU_OF:
		if (record->event.pressed) {
			// キーコード EISU_OF が押された時  英数(ATOK英語入力モード)+CAPS OFF(トグル操作)
			SEND_STRING(SS_DOWN(X_LSFT) SS_LCTL("^") SS_UP(X_LSFT) SS_DOWN(X_LSFT) SS_TAP(X_CAPS) SS_UP(X_LSFT));
			// 単独では意味のないキーに指定
			layer_move(_JBASE);
		} else {
		}
		break;

    case JP_MODE: // 日本語入力のベース 全角括弧入力
        if (record->event.pressed) {
            SEND_STRING(SS_TAP(X_INT4));
            layer_move(_JBASE);
        } else {
        }
        break;

    case ERESET: // 日本語入力OFF 無変換押下後baseレイヤに移行
        if (record->event.pressed) {
          SEND_STRING(SS_TAP(X_INT5));
          layer_move(_BASE);
        } else {
        }
        break;

    case EERESET: // EBASE用 無変換押下後baseレイヤに移行
        if (record->event.pressed) {
		SEND_STRING(SS_DOWN(X_LSFT) SS_LCTL("^") SS_UP(X_LSFT) SS_DOWN(X_LSFT) SS_TAP(X_CAPS) SS_UP(X_LSFT));
          SEND_STRING(SS_TAP(X_INT5));
          layer_move(_BASE);
        } else {
        }
        break;

    case XF1B_KY:
      if (record->event.pressed) {
        XF1B_pressed = true;
        XF1B_pressed_time = record->event.time;

        layer_on(_XF1B);
      } else {
        layer_off(_XF1B);

        if (XF1B_pressed && (TIMER_DIFF_16(record->event.time, XF1B_pressed_time) < TAPPING_TERM)) {
          register_code(KC_SPC);
          unregister_code(KC_SPC);
        }
        XF1B_pressed = false;
      }
      return false;
      break;

    case XF1J_KY:
      if (record->event.pressed) {
        XF1J_pressed = true;
        XF1J_pressed_time = record->event.time;

        layer_on(_XF1J);
      } else {
        layer_off(_XF1J);

        if (XF1J_pressed && (TIMER_DIFF_16(record->event.time, XF1J_pressed_time) < TAPPING_TERM)) {
          register_code(KC_SPC);
          unregister_code(KC_SPC);
        }
        XF1J_pressed = false;
      }
      return false;
      break;

    case XF3_KEY:
      if (record->event.pressed) {
        XF3_pressed = true;
        XF3_pressed_time = record->event.time;

        layer_on(_IME);
      } else {
        layer_off(_IME);

        if (XF3_pressed && (TIMER_DIFF_16(record->event.time, XF3_pressed_time) < TAPPING_TERM)) {
          register_code(JP_HENK);
          unregister_code(JP_HENK);
        }
        XF3_pressed = false;
      }
      return false;
      break;

    case XF2J_HN:
      if (record->event.pressed) {
        XF2J_pressed = true;
        XF2J_pressed_time = record->event.time;

        layer_on(_XF2J);
      } else {
        layer_off(_XF2J);

        if (XF2J_pressed && (TIMER_DIFF_16(record->event.time, XF2J_pressed_time) < TAPPING_TERM)) {
			SEND_STRING(SS_DOWN(X_LSFT) SS_LCTL("q") SS_UP(X_LSFT));
        }
        XF2J_pressed = false;
      }
      return false;
      break;

    case XF4B_NF:
      if (record->event.pressed) {
        XF4B_pressed = true;
        XF4B_pressed_time = record->event.time;

        layer_on(_XF4B);
      } else {
        layer_off(_XF4B);

        if (XF4B_pressed && (TIMER_DIFF_16(record->event.time, XF4B_pressed_time) < TAPPING_TERM)) {
          SEND_STRING(SS_TAP(X_INT5));
          //layer_move(_BASE);
        }
        XF4B_pressed = false;
      }
      return false;
      break;

    case XF4J_NF:
      if (record->event.pressed) {
        XF4J_pressed = true;
        XF4J_pressed_time = record->event.time;

        layer_on(_XF4J);
      } else {
        layer_off(_XF4J);

        if (XF4J_pressed && (TIMER_DIFF_16(record->event.time, XF4J_pressed_time) < TAPPING_TERM)) {
          SEND_STRING(SS_TAP(X_INT5));
          layer_move(_BASE);
        }
        XF4J_pressed = false;
      }
      return false;
      break;

    case XF4J_EJ:
      if (record->event.pressed) {
        XF4E_pressed = true;
        XF4E_pressed_time = record->event.time;

        layer_on(_XF2E);
      } else {
        layer_off(_XF2E);

        if (XF4E_pressed && (TIMER_DIFF_16(record->event.time, XF4E_pressed_time) < TAPPING_TERM)) {
			SEND_STRING(SS_DOWN(X_LSFT) SS_LCTL("^") SS_UP(X_LSFT) SS_DOWN(X_LSFT) SS_TAP(X_CAPS) SS_UP(X_LSFT));
            layer_move(_JBASE);
        }
        XF4E_pressed = false;
      }
      return false;
      break;

    default:
      if (record->event.pressed) {
        // reset the flags
        XF1B_pressed = false;
        XF1J_pressed = false;
         XF3_pressed = false;
        XF2J_pressed = false;
        XF4B_pressed = false;
        XF4J_pressed = false;
        XF4E_pressed = false;
      }
      break;


    }

    return true;
};

// LED インジケータ設定
void matrix_init_user(void) {
  setPinOutput(MICRO_LED_NUM);
  setPinOutput(MICRO_LED_CAP);
  setPinOutput(MICRO_LED_SCR);
}

void led_set_user(uint8_t usb_led) {
  if (IS_LED_ON(usb_led, USB_LED_NUM_LOCK)) {
    writePinHigh(MICRO_LED_NUM);
  } else {
    writePinLow(MICRO_LED_NUM);
  }
  if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
    writePinHigh(MICRO_LED_CAP);
  } else {
    writePinLow(MICRO_LED_CAP);
  }
  if (IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK)) {
    writePinHigh(MICRO_LED_SCR);
  } else {
    writePinLow(MICRO_LED_SCR);
  }
}

プログラムはわからないので、公開されているものを見ながらパズルを読み解く要領でなんとかやっています。一応動いているようなので良しとしていますが。

特にQMK Firmware で Raise/Lower と変換/無変換を同じキーに割り当てるの記事と、gist に置いておくバージョンは大変参考になりました。ありがとうございました。

ATOKの設定変更

ATOKのプロパティ(環境設定)から設定

設定を変更した際はバックアップをとり、別媒体に保存しておきます。

バックアップは、スタートメニューの[プログラム]→[ATOK]→[ATOK2017]→[ATOK2017ツール]→バックアップツールを起動。

常に半角で入力

テンキーの数字と記号、アンダースコアは、常に半角文字になるようATOKを設定しています。

テンキーの半角文字確定入力設定

アンダースコア等の記号、他の文字

キーカスタマイズ

キーカスタマイズ 機能とキーの割り当て

デフォルトだと、ひらがな(後)変換やカタカナ(後)変換などは、CTRLUCTRLIなどに割り当てられています。私のは独自配列なので、そのままだとあちこちに飛ぶことになります。なので、キーカスタマイズは大幅に書き換えています。

ローマ字カスタマイズ

ローマ字入力は、子音と母音の組み合わせ、もしくは母音のキーのみを打って入力します。組み合わせの規則は、MS-IMEやATOKが主に用いられていると思います。富士通のローマ字入力表のは「とぅ」や「てぃ」など書かれていないものがありますが、その分わかりやすいです。

私は普通のQWERTY配列キーボードを使っていたときも、「ん」をXで打つ(これは昭和からですが)など、いろいろ手を加えていました。今回はさらにカスタマイズをしています。

ローマ字カスタマイズ

ローマ字カスタマイズの画面

ATOKのローマ字カスタマイズで、[追加]から設定を変更していきます。

小文字の「ゃ」「ゅ」「ょ」

小文字の「ゃ」「ゅ」「ょ」がつく文字は、子音+QLXで入力できるよう設定しました。「きゃ」ならKQの2打です。

Xは単打で「ん」にしていますが、子音の次に設定することで子音+「ょ」になります。「マンション」だとmaxsxxになります。元々xは「ん」のみの設定でしたが、「ょ」をどこに置くかで試行錯誤しまくった結果、このようなことになりました。

小文字の「っ」

Cは単打で小さな「っ」です。いつもは子音を2つ続けて打っていますが、必要な場合はC単打も使っています。

小文字の「ぁ」「ぃ」「ぅ」「ぇ」「ぉ」

小文字の「ぁ」「ぃ」「ぅ」「ぇ」「ぉ」がつく文字は、子音+XF1を押しながらAIUEOで入力できます。母音の場所は、XF1の併用で数字が打てるようになっているので、実際には子音+数字で文字が入力されるよう設定しています。

「とぅ」だとTXF1を押しながらUXF1Uは数字の「5」なので、「t5」で「とぅ」になるよう設定しています。

t+数字はかなりごちゃごちゃしてしまいました。

t1         つぁ
t2         てぃ
t3         ちぇ
t4         てゅ
t5         とぅ
t6         つぉ

この辺は、使用頻度で決めています。t2は「た行」で「ぃ」がつく文字で、「たぃ」「ちぃ」「つぃ」「てぃ」「とぃ」がありますが、使ったことがあるのは「つぃ」「てぃ」の二つ。「てぃ」はセキュリティやフロンティア、アトランティスなどいろいろ使っているのに対し、「つぃ」は「ツィオルコフスキー」しか使っていませんでした。よって「てぃ」に決定。「つぃ」はz2で出せるようにしました。

小文字の「ゅ」がつく「tl」は「ちゅ」を登録しているので、「てゅ」はt4にしました。私は「コンスティテューション」くらいしか使ってないので、これでいいだろうと思ってます。

「つぁ」~「つぉ」は、Zで入力できるようにしています(「つぁ」「つぉ」の2つはTで打てますが)。「じゃ」や「じぇ」はJを使います。最初設定した時は馴染めず、すぐ元に戻しましたが、いろいろ考えて再度設定した後はなぜか普通に使えています。

小文字のみの入力

QMKのマクロで、XF2キー+AIUEOQLX_で小文字の「ぁぃぅぇぉゃゅょゎ」を打てるようにしています。「っ」はC単打で出るので、QMKでは設定していません。

ローマ字入力の綴り

綴りや文字の選択は以下を参考にしています。

表の背景色は、以下のレベルを表します。レベル2や3は私の使用頻度や判断によるもので、一般的な区分ではありません。

a   a   i   u   e   o V vu
K ka ki ku ke ko G ga gi gu ge go
S sa si su se so Z za zi zu ze zo
T ta ti tu te to D da di du de do
N na ni nu ne no
H ha hi hu fu he ho B ba bi bu be bo
P pa pi pu pe po
M ma mi mu me mo
Y ya yu yo yA yU yO
R ra ri ru re ro
W wa y7 w7 wo lwa
N   x   c
A   A   I   U   E   O L lka lke
1(ァ) 2(ィ) 5(ゥ) 3(ェ) 6(ォ) Q(ャ) L(ュ) X(ョ)
Y イァ イィ イゥ イェ ye イォ イャ yq イュ イョ
W ウァ w1 ウィ wi ウゥ ウェ we ウォ w6 ウャ ウュ ウョ
V ヴァ va ヴィ vi ヴゥ ヴェ ve ヴォ vo ヴャ ヴュ vl ヴョ
K キァ キィ キゥ キェ キォ きゃ kq きゅ kl きょ kx
G ギァ ギィ ギゥ ギェ ギォ ぎゃ gq ぎゅ gl ぎょ gx
K クァ k1 クィ k2 クゥ k5 クェ k3 クォ k6 クャ クュ クョ
G グァ g1 グィ g2 グゥ g5 グェ g3 グォ g6 グャ グュ グョ
S シァ s1 シィ s2 シゥ シェ s3 シォ しゃ sq しゅ sl しょ sx
J ジァ ジィ j2 ジゥ ジェ je ジォ j6 じゃ ja じゅ ju じょ jo
SW スァ スィ スゥ スェ スォ スャ スュ スョ
Z ズァ ズィ ズゥ ズェ ズォ ズャ ズュ ズョ
T チァ チィ チゥ チェ t3 チォ ちゃ tq ちゅ tl ちょ tx
D ヂァ ヂィ ヂゥ ヂェ ヂォ ぢゃ dq ぢゅ ぢょ
TS ツァ z1 t1 ツィ z2 ツゥ z5 ツェ z3 ツォ z6 t6 ツャ ツュ ツョ
  ヅァ ヅィ ヅゥ ヅェ ヅォ ヅャ ヅュ ヅョ
T テァ ティ t2 テゥ テェ テォ テャ テュ t4 テョ
D デァ ディ d2 デゥ デェ d3 デォ デャ デュ dl デョ
T トァ トィ トゥ t5 トェ トォ トャ トュ トョ
D ドァ ドィ ドゥ d5 ドェ ドォ ドャ ドュ ドョ
N ニァ n1 ニィ n2 ニゥ ニェ n3 ニォ にゃ nq にゅ nl にょ nx
  ヌァ ヌィ ヌゥ ヌェ ヌォ ヌャ ヌュ ヌョ
H ヒァ ヒィ h2 ヒゥ ヒェ h3 ヒォ ひゃ hq ひゅ hl ひょ hx
B ビァ b1 ビィ b2 ビゥ ビェ b3 ビォ b6 びゃ bq びゅ bl びょ bx
P ピァ ピィ p2 ピゥ ピェ p3 ピォ ぴゃ pq ぴゅ pl ぴょ px
F ファ fa フィ fi フゥ f5 フェ fe フォ fo フャ フュ fl フョ fx
  ブァ ブィ ブゥ ブェ ブォ ブャ ブュ ブョ
P プァ プィ プゥ プェ プォ プャ プュ プョ
HW ホァ ホィ ホゥ h5 ホェ ホォ ホャ ホュ ホョ
M ミァ ミィ m2 ミゥ m5 ミェ m3 ミォ みゃ mq みゅ ml みょ mx
  ムァ ムィ ムゥ ムェ ムォ ムャ ムュ ムョ
R リァ r1 リィ r2 リゥ リェ r3 リォ りゃ rq りゅ rl りょ rx
L ルァ ルィ ルゥ ルェ ルォ ルャ ルュ ルョ

規則的に言えば「ゐ」「ゑ」は「wi(w2)」「we(w3)」ですが、「うぃ」「うぇ」の方が多いはずなので違う感じに割り当てました。

「てゅ」も変則的ですが「ちゅ」の方が圧倒的に多いので上記のような設定に。

これらの組み合わせは(滅多に使わないやつは)どうせ全部覚えられないので、思ってたのが出ないって時は半音と組み合わせて書けばいいかと思ってます。

辞書ユーティリティ

XF1XF2で記号が出せるようにするため、専用の辞書を作って読みと記号を登録します。品詞は適当です。

キーボード辞書

これで、「@^^300%」と打って変換すると二重カギ括弧(『』)が出るようにします。

その後QMKのマクロで、括弧を出した後カーソルを間に戻すなどの操作を設定。keymapに書き込んでいきます。

    case CHJ300E: // 『』
        if (record->event.pressed) {
            SEND_STRING("@^^300%" SS_TAP(X_INT4) SS_TAP(X_ENT) SS_TAP(X_LEFT));
        } else {
        }
        break;

二重カギ括弧
  1. 「@^^300%」を打つ
  2. 「SS_TAP(X_INT4)」で二重カギ括弧に変換
  3. 「SS_TAP(X_ENT)」で確定
  4. 「SS_TAP(X_LEFT)」でカーソルを1個左に移動

WZ EDITOR 10の設定追加

HTML文書の作成編集にはWZ EDITOR 10を使っています。HTMLキー押下時にいわゆるHTMLのタグなどを入力できるよう、WZ EDITORのキーボードマクロを使って設定しておきます。

  1. [ツール]→[キーボードマクロ記録開始/終了]でキーボードやマウスの操作開始
  2. 操作が終わったら再度[ツール]→[キーボードマクロ記録開始/終了]で記録終了
  3. [ツール]→[キーボードマクロ一覧]で記録した動作を選択し、右のコマンドマクロ出力をクリック
  4. [ツール]→[カスタマイズ]→[キー一覧]で右の右のユーザー追加定義をクリック
  5. 右下のキー定義などを使い、クリップボードに保存したコマンドマクロを適当なキーに結びつける
  6. 「定義ファイル編集」ウィンドウの[ファイル]→[保存して閉じる]

HTMLレイヤの各キーには、CTRL+ALT+キーの文字を設定しています。HTMLキーを押しながらRキーを押すと、CTRLALTRが入力されます。

<ruby>|<rp>(</rp><rt></rt><rp>)</rp></ruby>(|はカーソルの位置)を打てるコマンドマクロをCTRLALTRに設定すると、HTMLRで前記の文字列が入力できます。

HTMLキーを使った上記の動作は、WZ EDITORの機能を使っている以上このエディタでしか使えませんが、HTML文書はWZ EDITORしか使っていないので問題なしです。

QMKのマクロはASCII 文字とEnter、タブが使えるようなので、そっちでも作れそうです。ただ、他のエディタやテキスト入力エリアにHTMLタグの類いを入力することはなさそうなのと、せっかくWZ EDITORのキーボードマクロで作ったので、このままで行きます。

ユーザー追加定義にコマンドマクロをコピー

修正や追加は定義ファイルを直接編集しています。もしかしてコマンドマクロ使わなくても良かったんだろうか。でも使わないとパターンが分からなかったし、これはこれで良しとします。

Radeon Softwareの設定変更

現在グラフィックスドライバ&ユーティリティとしてAMD Radeon Softwareをインストールしています。

このコントロールパネル、大量のホットキーが登録されていますが、SHIFTCTRL+文字キーの組み合わせなので、他のソフトとかぶります。というかIMEレイヤのと組み合わせ方が同じです。

Radeon Softwareはホットキーで操作することはないので、こちらのホットキーを無効にします。

2022年1月11日公開のRadeon Software Adrenalin 22.1.1での操作です。

ホットキーをすべて無効に

Radeon Softwareを立ち上げ

スタートメニューなどからRadeon Softwareを立ち上げます。右上にある歯車のアイコン(設定)→タブの[ホットキー]でホットキーオプション画面を出します。

「ホットキーを使用」を無効に

最初に「ホットキーを使用」の項目があるので、トグルスイッチをクリックして無効にします。他の項目の内容で文字のキーが赤から灰色になります。これで完了。

2021年9月時点のドライバでは、ここを無効にしてもホットキーの内容が普通に実行されました。なので各項目を一つずつ無効にしていきましたが、その後修正されたようです。

ホットキーのカスタマイズ

ホットキーを別の文字に割り振ったり、個別に無効にする場合は以下のように。

キーの組み合わせをクリック

キーの組み合わせが書かれている箇所をクリックすると説明が出ます。

変更する場合、文字キー単体ではダメでした。SHIFT+文字キーもダメでした。SHIFTCTRLALTと一緒に指定するようです。

CTRLALTはそれぞれ一つと文字キーの組み合わせで指定できました。

元に戻す時

組み合わせや個別の無効化を元に戻す時は、戻したい項目名の横にある、くるっと回っている矢印にマウスカーソルを重ねると色が明るくなるので、クリックします。ホットキーがリセットされます。


グラフィックドライバって、最新バージョンにする時はいろいろ面倒だった記憶がありますが、今は難しいこともなく上書きインストールで終わってしまいます。再起動も無し(念のため、した方がいいのかもしれませんが)。便利になりました。

文書更新履歴

2023年04月30日
全体的に変更。
2022年12月03日
キーバインド変更を反映。
2022年06月14日
06月11日の更新時、5月6日に編集途中だったもので更新してしまったので、完成版で更新し直す。
2022年04月21日
HTMLキーとLEFTキーの廃止、CHARキーとNAVIキーを入れ替えて機能の一部入れ替えなど変更につき、画像と文章を変更。
2022年04月21日
ダブルクォートの組や00の廃止、NAVIキーの一部変更につき画像と文章を変更。
2022年01月26日
XF1、2、5の役割変更に伴い、図と解説を変更。
2022年01月23日
このページを公開。