60% 鍵盤,我的使用習慣是 Fn + ijkl 來操作方向鍵,Ctrl + Fn + ijkl 控制 上一頁,下一頁, Home, End 等等,而 Ctrl + Fn + ? 需要使用到三個鍵,我在網路上看了很多英文跟中文的文章,但都找不太到可以設定三組合鍵 Remap 的範例,後來我自已研究 tmk_keyboard 原始檔,成功找到一個解法方式。
利用 get_mods 來偵測是否有按 Ctrl 鍵
我用的方法很簡單,tmk 有支援一個 Method 叫 "get_mods",利用這個 Method 可以用來檢查 Ctrl 鍵是否有被點擊,如果你有改過 Fn + ? 這種雙組合鍵 Remap 的 Case ,那麼你只要會寫一點 C 語言,加上 get_mods 就能達到三個組合鍵 Remap 。
接下來我一步一步的教你怎麼修改, 首先 tmk 還有另一個功能叫 ACTION_LAYER_MOMENTARY , 這個功能可以讓我按下 Fn 鍵時,切換到指定的 key layout ,雙組合鍵 Remap 就是這樣實做的。
舉個例子,我指定 Fn ACTION_LAYER_MOMENTARY (2); , 代表讓我按下 Fn 鍵後,key Layout 會切換到 Layout 2,若這時我再按下 "i" 這個鍵 (Fn 不放開), 鍵盤就會送出 Layout 2 "i" 鍵設定的值。
點擊 Fn 會轉換成 Layout 2 ,這個 Layout 我習慣叫他 Fn Layout , 來看看 Fn Layout 的設定,請注意 i j k l 這幾個鍵的位置,我分別設定給 FN12, FN13, FN14, FN15 這四個值,如果你設定成 UP, DOWN, LEFT, RGHT,那麼當你按下 Fn + i 就會直接送出方向鍵 "上"。
- KEYMAP_ANSI(
- GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, \
- CAPS,FN16, FN17, FN18,TRNS,TRNS,TRNS,PGUP,FN12,PGDN,PSCR,TRNS,INS, TRNS, \
- FN0,TRNS,TRNS,TRNS,TRNS,TRNS,HOME,FN14,FN13,FN15,END, TRNS, TRNS, \
- TRNS,FN1, FN2,FN3,FN6,TRNS,TRNS,TRNS,PGUP,PGDN,TRNS, TRNS, \
- TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS),
還記得這篇文章的一開始說的嗎,我還要用 Ctrl 鍵來改變鍵盤輸出值,所以我設定 FN12 ~ 15 ,而不是 UP, DOWN ...,接著我還要設定 FN12 ~ 15 分別要做什麼事,寫法如下。
- const uint16_t PROGMEM fn_actions[] = {
- .
- .
- .
- [12] = ACTION_FUNCTION_OPT(MY_PG_CONTROL, 1),
- [13] = ACTION_FUNCTION_OPT(MY_PG_CONTROL, 2),
- [14] = ACTION_FUNCTION_OPT(MY_PG_CONTROL, 3),
- [15] = ACTION_FUNCTION_OPT(MY_PG_CONTROL, 4),
- }
這樣寫完,當我按下 Fn + i ,鍵盤會先去執行 action_function ,接著我要在 action_function 裡用 get_mods 來判斷 Ctrl 鍵是否有被點擊,如果有被點擊我就送出 PageUp ,若是 Ctrl 沒有被點擊,我就送出 Up 。
- #define MODS_CTRL_MASK (MOD_BIT(KC_LCTRL)|MOD_BIT(KC_RCTRL))
- void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
- {
- static uint8_t mod = 0;
- static uint8_t key;
- switch (id) {
- case MY_PG_CONTROL:
- mod = get_mods();
- if (record->event.pressed) {
- switch (opt) {
- case 1:
- key = (mod & MODS_CTRL_MASK) ? KC_PGUP : KC_UP;
- break;
- case 2:
- key = (mod & MODS_CTRL_MASK) ? KC_PGDN : KC_DOWN;
- break;
- case 3:
- key = (mod & MODS_CTRL_MASK) ? KC_HOME : KC_LEFT;
- break;
- case 4:
- key = (mod & MODS_CTRL_MASK) ? KC_END : KC_RIGHT;
- break;
- }
- if (mod & MODS_CTRL_MASK) {
- del_mods(mod);
- add_key(key);
- send_keyboard_report();
- add_mods(mod); // return Ctrl but not sent
- } else {
- add_key(key);
- send_keyboard_report();
- }
- } else {
- del_key(key);
- send_keyboard_report();
- }
- break;
- }
- }
這裡有我修改 keymap 的全部原始嗎: https://github.com/puritys/tmk_keyboard_custom/blob/master/keyboard/gh60/keymap_puritys.c
回應 (Leave a comment)