2019年06月23日

【薙刀式】編集モードのQMK

QMKで組むとき、
キーコード以外のものをマクロで出力しないといけないが、
それを組むことが面倒だ。

僕はまだQMKで薙刀式を使っていないが、
将来的に組み込むことを想定して、先にまとめておく。
コピペなどしてご利用を。


そのまま打てるものは、KC_形式でレイヤーに置けばいける。
そうでないものはtap_code()やSend_string()でマクロ内に組み込めばいけるはず。
動作は未確認のものも含むので、バグがあったらすいません。


【編集モード1】

左手

ファイルエンド C(KC_END)
ファイルトップ C(KC_HOME)

前から10文字目(マクロ)
tap_code(KC_HOME);
tap_code(KC_DOWN); ......(10回書く)
前から20文字目、30文字目、同様。
(繰り返しの関数があるかもだけど、未確認)

リドゥ C(KC_Y)
保存 C(KC_S)
ページダウン KC_PGDN
ページアップ KC_PGUP
アンドゥ C(KC_Z)
カット C(KC_X)
コピー C(KC_C)
ペースト C(KC_V)
※ Macで実装する場合、これらは全てC()ではなく、G()になることに注意。
コマンドキー(GUIキー)と、コントロールキーの違い。
あとでMac対応のことについて詳しく書く。


右手

ホーム KC_HOME
文末まで消去(マクロ)
tap_code(S(KC_END));
tap_code(KC_BKSP);

再変換 KC_HENK
(マックだとキーバインドが異なる。
あとでまとめる。以下ウィンドウズ前提)

デル KC_DEL
入力キャンセル(マクロ)
tap_code(KC_ESC);
tap_code(KC_ESC);
tap_code(KC_ESC);

確定して文末(マクロ)
tap_code(KC_ENTER);
tap_code(KC_END);

上 KC_UP
選択範囲を上に S(KC_UP)
上5(マクロ)
tap_code(KC_UP);を五回書く
カタカナ変換 C(KC_I)

エンド KC_END
下 KC_DOWN
選択範囲を下に S(KC_DOWN)
下5(マクロ)
tap_code(KC_DOWN);を五回書く
ひらがな変換 C(KC_U)



【編集モード2】

(記号関係は、確定もいれるのですべてマクロで)

/ SEND_STRING(SS_TAP(X_SLASH) SS_TAP(X_ENTER));
: SEND_STRING(SS_TAP(X_QUOTE) SS_TAP(X_ENTER));
(JISキーボードとして認識させている場合。
USキーボードなら
SEND_STRING(SS_LSFT(SS_TAP(X_SCOLN)) SS_TAP(X_ENTER));
で動くはず。未確認)
tap_codeを使わないのは、僕が知らない状態で書いたコードのため。
動いたものを記録しておくので、適宜読み替えてください。

・〇【】〈〉……── この記号はKC_では出ないので、あとで一括して記述。

先頭に空白1挿入して文末へ(マクロ)
tap_code(KC_HOME);
tap_code(KC_ENTER);
tap_code(KC_SPC);
tap_code(KC_END);
空白3はSPCの部分を三回にすればよいので略。

? SEND_STRING(SS_LSFT(SS_TAP(X_SLASH)) SS_TAP(X_ENTER));
! SEND_STRING(SS_LSFT(SS_TAP(X_1)) SS_TAP(X_ENTER));


右手

カギカッコ関係のマクロ

 」改行空白
tap_code(KC_RBRC);
tap_code(KC_ENTER);
tap_code(KC_ENTER);
tap_code(KC_SPC);
 」改行次「
tap_code(KC_RBRC);
tap_code(KC_ENTER);
tap_code(KC_ENTER);
tap_code(KC_LBRC);
tap_code(KC_ENTER);
 」改行のみ
tap_code(KC_RBRC);
tap_code(KC_ENTER);
tap_code(KC_ENTER);

文頭まで削除
tap_code(S(KC_HOME));
tap_code(KC_BKSP);

確定アンドゥ
tap_code(C(KC_BKSP));

ふりがな先頭記号 S(KC_BSLS)
ふりがなマクロ
(あとに述べるように記号対策をしている前提で)
tap_code(S(KC_BSLS));
tap_code(KC_END);
SEND_STRING("furihira" SS_TAP(X_SPACE) SS_TAP(X_ENTER));
SEND_STRING("furitoji" SS_TAP(X_SPACE) SS_TAP(X_ENTER));
tap_code(KC_UP);

「 KC_LBRC
」 KC_RBRC
( S(KC_9)
) S(KC_0)

その他記号については、次にまとめた。


【記号入力について】

キーコードに対応している記号はすぐに打てるが、
物語に必要な記号類は、キーコード一発で出すことが出来ない。
エレガントではないが実際には使える方法として、
以下のように特殊な読みを単語登録しておいて、
その読みをQMK側で出力、変換、確定することで、
記号入力を実装する。

以下に記号、単語登録読み、マクロ実装例を示す。

・なかぐろ SEND_STRING("nakaguro" SS_TAP(X_SPACE) SS_TAP(X_ENTER));
〇しろまる SEND_STRING("siromaru" SS_TAP(X_SPACE) SS_TAP(X_ENTER));

…さんてん
SEND_STRING("santen" SS_TAP(X_SPACE) SS_TAP(X_ENTER));
SEND_STRING("santen" SS_TAP(X_SPACE) SS_TAP(X_ENTER));
(三点リーダは出版では二つ一組。以下のダッシュ記号も同様)

─ながだっしゅ
SEND_STRING("nagadasshu" SS_TAP(X_SPACE) SS_TAP(X_ENTER));
SEND_STRING("nagadasshu" SS_TAP(X_SPACE) SS_TAP(X_ENTER));

『にじゅひら SEND_STRING("nijuhira" SS_TAP(X_SPACE) SS_TAP(X_ENTER));
』にじゅとじ SEND_STRING("nijutoji" SS_TAP(X_SPACE) SS_TAP(X_ENTER));
【すみひら SEND_STRING("sumihira" SS_TAP(X_SPACE) SS_TAP(X_ENTER));
】すみとじ SEND_STRING("sumitoji" SS_TAP(X_SPACE) SS_TAP(X_ENTER));
《ふりひら SEND_STRING("furihira" SS_TAP(X_SPACE) SS_TAP(X_ENTER));
》ふりとじ SEND_STRING("furitoji" SS_TAP(X_SPACE) SS_TAP(X_ENTER));
〈 やまひら SEND_STRING("yamahira" SS_TAP(X_SPACE) SS_TAP(X_ENTER));
〉 やまとじ SEND_STRING("yamatoji" SS_TAP(X_SPACE) SS_TAP(X_ENTER));



【Mac対応について】

WindowsとMacでは、以下のようなショートカットに異同がある。
QMK内にフラグをおいて、明示的にユーザーから、
「いまWinですよ/Macですよ」
と指示できるようにしておく、というのがとりあえずの僕の回答。
(そのためのキーバインドが必要になってくるが)

IMEオン
Win:
tap_code(KC_HENK);
Mac:
tap_code(KC_LANG1);

IMEオフ
Win:
tap_code(KC_MHEN);
Mac:
tap_code(KC_LANG2);

WinのデフォルトではIMEオンオフは変換/無変換ではないが、
薙刀式ではこのように設定した前提で色々組んでいる。

再変換
Win:
SEND_STRING(SS_TAP(X_INT4));
Mac:
tap_code(KC_LANG1);
tap_code(KC_LANG1);

カタカナ変換
Win:
SEND_STRING(SS_LCTRL("i"));
Mac:
SEND_STRING(SS_LCTRL("k"));

ひらがな変換
Win:
SEND_STRING(SS_LCTRL("u"));
Mac:
SEND_STRING(SS_LCTRL("j"));

リドゥ
Win:
SEND_STRING(SS_LCTRL("y"));
Mac:
SEND_STRING(SS_LGUI(SS_LSFT("z")));

また、Winでのコントロール系のショートカットは、
Macではコマンドキー(GUI)に読み替える必要がある。
僕は全部実装していないので、
いま結構手間がかかることに気づいた……。


【エディタやIMEによるショートカットの相違】

エディタによっては、ショートカットに対応していなかったり、
別のキーバインドが当てられているものがあったりする。
またIMEによっても、ショートカットが異なるものがあったりする。
僕の使用環境、iText、MS-IME前提で書いてあるが、
違う人はそれなりに読み替えてください。


このへんが統一されない限り、
文書編集はいっこうに良くならない。
しかしそれを待っていたら死ぬので、
適宜対応していくしかないです。




編集モードは使い慣れていくと、
縦書き編集に関してはとても便利だと思う。
横書きをメインにしている人は、
縦と横の関係が変わるので、適宜改造されたく。
posted by おおおかとしひこ at 21:29| Comment(4) | カタナ式 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
すごく助かります。編集モードへの入り方、3キー目を押さなかったら、文字入力になる方法を考え直してから、編集モードを充実させたいです。
Posted by eswai at 2019年06月24日 11:30
>eswaiさん

Send_stringのものは動きましたが、
それ以外は書いた通り試してないものもあるのでご注意。
マクロ書かないといけないのと、
KC_だけで行けるのと混在してるので、
ややこしいかと思われます。
あとOSの設定がJISかUSかで、
同じキーコードを送っても違う文字と認識される
(S(KC_2)が"か@かという問題)ので、
その辺は注意しないとさらに頭がこんがらがります。

JISかUSか、WinかMacかで、
4通りあるわけで…
(メインで使うJIS/Winに割り切るのが賢いかなあ)

>3キー目を押さなかったら
DvorakJで検証しましたが、
たとえば「あ」「い」を押したままの状態ではなにも起こらず、
どちらかを離せば直ちに「押した方」から出力されました。
バッファにためた順の出力でOKかと。
Posted by おおおかとしひこ at 2019年06月24日 14:09
編集モードの空打ち対策もあり、編集モードはレイヤーをやめて、文字入力と同じ辞書にいれるように書き直しました。記号などQMKだけで対応できないところは、まだ未対応ですが、先日お伺いした修正点も含めて、かなり完成度が上がってきたと思います。
https://github.com/eswai/qmk_firmware/tree/master/keyboards/crkbd/keymaps/naginata
Posted by eswai at 2019年06月29日 16:23
>eswaiさん

お疲れ様です。
ざっと見ただけですが、構造的に美しくなったことはわかります。
配列(キーボード配列じゃなくて変数の配列)を使ってることは分かるけど、
以降の理解はcの再勉強からだなあ…。
キーコードのタップや上げ下げで行けるやつは大丈夫そうだけど、
そうじゃない現在未実装のぶんはマクロで組むことになるんでしょうかね。

細かいことですが、
「ーー」は長音記号二つで長ダッシュに変換してくれるエディタとそうじゃないやつがあり、
フォントによっては間が微妙に開くパターンがあるので、
小説書きの間では「罫線」で出る記号を使ったり、などの工夫があります。
http://howto.fanweb.jp/archives/301
…で、色々面倒になり、
記号に関してはPC依存(それぞれで登録)にしたほうがいいのかなあ、
などと考えた次第。
文字コードを直接出せる仕様のような気がするけど、
その辺がよくわかってません。

しかしこれらが簡単に実装できるDvorakJ、改めてすげえなあ。
Posted by おおおかとしひこ at 2019年06月30日 01:35
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。