はじめに
MacとWinどちらも使用するplanckユーザーにとって全角半角切替は最初ぐらいの関門だと思います。
その一つの解決方法として以下に記載しておきます。
目的
MacとWin共に同じ操作方法が可能な全角半角切替キーを作成します。
ついでに切替キーだけだと勿体ないので長押しでRaise/Lowerレイヤーへの切替機能も付与します。
レイヤー切替の速度も任意で変更できるようにします。
やること
やることは単純で、MacとWinで切替ショートカットを同じにしてそれを実行する処理を書くだけです。
難点は端末側でこの処理を行う必要ことです。
- Macの全角半角のショートカットをCtrl + Spaceに設定する
- Windowsの全角半角ショートカットをCtrl + Spaceに設定する
- keymap.cへの実装
- キーボードへの書き込み
Macの全角半角のショートカットをCtrl + Spaceに設定する
Mac元々の機能を使用して変更します。超簡単
1. 左上のリンゴマークからシステム環境変数を開く
2. "キーボード"を押下
3. "ショートカット"タブから"入力ソース"を選択
4. "前の入力ソースを選択"でCtrl + Spaceに設定
5. おわり
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行が追加したキーコードの定義(名前は適当)
enumplanck_keycodes{QWERTY=SAFE_RANGE,COLEMAK,DVORAK,PLOVER,BACKLIT,EXT_PLV,CONV_LOWER,CONV_RAISE};
計測時間格納用の変数定義
planck_keycodes{}の下辺りに記述します。
staticuint16_tkey_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()はプレスイベントとリリースイベントを両方送信します。
これで実装は終わりです。
boolprocess_record_user(uint16_tkeycode,keyrecord_t*record){switch(keycode){// ここから上省略caseCONV_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));}}returnfalse;break;caseCONV_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));}}returnfalse;break;}
おわりに
端末側に変更を加える必要がありますが、MacとWinで同じ操作で切替できるのは便利です。
良かったらためしてみてください。