はじめに
MacとWinどちらも使用するplanckユーザーにとって全角半角切替は最初ぐらいの関門だと思います。
その一つの解決方法として以下に記載しておきます。
目的
MacとWin共に同じ操作方法が可能な全角半角切替キーを作成します。
ついでに切替キーだけだと勿体ないので長押しでRaise/Lowerレイヤーへの切替機能も付与します。
レイヤー切替の速度も任意で変更できるようにします。
やること
やることは単純で、MacとWinで切替ショートカットを同じにしてそれを実行する処理を書くだけです。
難点は端末側でこの処理を行う必要ことです。
- Macの全角半角のショートカットをCtrl + Spaceに設定する
- Windowsの全角半角ショートカットをCtrl + Spaceに設定する
- keymap.cへの実装
- キーボードへの書き込み
Macの全角半角のショートカットをCtrl + Spaceに設定する
Mac元々の機能を使用して変更します。超簡単
- 左上のリンゴマークからシステム環境変数を開く
- "キーボード"を押下
- "ショートカット"タブから"入力ソース"を選択
- "前の入力ソースを選択"でCtrl + Spaceに設定
- おわり
Windowsの全角半角ショートカットをCtrl + Spaceに設定する
こちらは普段使いのIMEの設定を変更する必要があるので各自調べてください。
…と言いたい所ですが説明にならないのでGoogle日本語入力を例に変更します。
- google日本語のツールからプロパティを開く
- "キー設定"からことえりを選択 > 編集を開く
- 編集で"Ctrl Space"を探し下記のパターンを作成する
モード | 入力キー | コマンド |
---|---|---|
直接入力 | Ctrl Space | IMEを有効化 |
入力文字なし | Ctrl Space | IMEを無効化 |
変換前入力中 | Ctrl Space | IMEを無効化 |
変換中 | Ctrl Space | IMEを無効化 |
参考エントリ
Google 日本語入力でctrl spaceで半角全角の変更を出来るように変更したときのメモ
keymap.cへの実装
行う事は下記の4点です
- 自作変換キーコードをRaiseとLowerの2種類定義
- 計測時間格納用の変数定義
- メインレイヤーキーマップへの自作キーコードの記述
- process_record_user()へのcaseの追加
自作変換キーコードをRaiseとLowerの2種類定義
下記2行が追加したキーコードの定義(名前は適当)
enum planck_keycodes {
QWERTY = SAFE_RANGE,
COLEMAK,
DVORAK,
PLOVER,
BACKLIT,
EXT_PLV,
CONV_LOWER,
CONV_RAISE
};
計測時間格納用の変数定義
planck_keycodes{}の下辺りに記述します。
static uint16_t key_timer;
メインレイヤーキーマップへの自作キーコードの記述
追加した定義をキーボードのデフォルトのRaise、Lowerの位置に指定
[_QWERTY] = LAYOUT_planck_grid(
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT ,
BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, CONV_LOWER, KC_SPC, KC_ENT, CONV_RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
process_record_user()へのcaseの追加
process_record_user()は既存のメソッドでこちらに追記する形になります。
caseに指定されたキーがrecord->event.pressedでキーが押されたか検知します。
押されると計測値がkey_timerに入り指定のレイヤーに切り替わります。
else以下はキーを離すを処理でレイヤーもとに戻します.
ここでもし離すまでの時間が120ms以下ならCtrl + Spaceを送信します。
tap_code16()はプレスイベントとリリースイベントを両方送信します。
これで実装は終わりです。
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
// ここから上省略
case CONV_LOWER:
if (record->event.pressed) {
key_timer = timer_read();
layer_on(_LOWER);
}else{
layer_off(_LOWER);
if(timer_elapsed(key_timer) <= 120){
tap_code16(LCTL(KC_SPC));
}
}
return false;
break;
case CONV_RAISE:
if (record->event.pressed) {
key_timer = timer_read();
layer_on(_RAISE);
}else{
layer_off(_RAISE);
if(timer_elapsed(key_timer) <= 120){
tap_code16(LCTL(KC_SPC));
}
}
return false;
break;
}
おわりに
端末側に変更を加える必要がありますが、MacとWinで同じ操作で切替できるのは便利です。
良かったらためしてみてください。