2017
Jan
08

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 就會直接送出方向鍵 "上"。

Example
  1. KEYMAP_ANSI(
  2. GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, \
  3. CAPS,FN16, FN17, FN18,TRNS,TRNS,TRNS,PGUP,FN12,PGDN,PSCR,TRNS,INS, TRNS, \
  4. FN0,TRNS,TRNS,TRNS,TRNS,TRNS,HOME,FN14,FN13,FN15,END, TRNS, TRNS, \
  5. TRNS,FN1, FN2,FN3,FN6,TRNS,TRNS,TRNS,PGUP,PGDN,TRNS, TRNS, \
  6. TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS),

還記得這篇文章的一開始說的嗎,我還要用 Ctrl 鍵來改變鍵盤輸出值,所以我設定 FN12 ~ 15 ,而不是 UP, DOWN ...,接著我還要設定 FN12 ~ 15 分別要做什麼事,寫法如下。

Example
  1. const uint16_t PROGMEM fn_actions[] = {
  2. .
  3. .
  4. .
  5. [12] = ACTION_FUNCTION_OPT(MY_PG_CONTROL, 1),
  6. [13] = ACTION_FUNCTION_OPT(MY_PG_CONTROL, 2),
  7. [14] = ACTION_FUNCTION_OPT(MY_PG_CONTROL, 3),
  8. [15] = ACTION_FUNCTION_OPT(MY_PG_CONTROL, 4),
  9. }

這樣寫完,當我按下 Fn + i ,鍵盤會先去執行 action_function ,接著我要在 action_function 裡用 get_mods 來判斷 Ctrl 鍵是否有被點擊,如果有被點擊我就送出 PageUp ,若是 Ctrl 沒有被點擊,我就送出 Up 。

Example
  1. #define MODS_CTRL_MASK (MOD_BIT(KC_LCTRL)|MOD_BIT(KC_RCTRL))
  2.  
  3. void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
  4. {
  5. static uint8_t mod = 0;
  6. static uint8_t key;
  7. switch (id) {
  8. case MY_PG_CONTROL:
  9. mod = get_mods();
  10. if (record->event.pressed) {
  11. switch (opt) {
  12. case 1:
  13. key = (mod & MODS_CTRL_MASK) ? KC_PGUP : KC_UP;
  14. break;
  15. case 2:
  16. key = (mod & MODS_CTRL_MASK) ? KC_PGDN : KC_DOWN;
  17. break;
  18. case 3:
  19. key = (mod & MODS_CTRL_MASK) ? KC_HOME : KC_LEFT;
  20. break;
  21. case 4:
  22. key = (mod & MODS_CTRL_MASK) ? KC_END : KC_RIGHT;
  23. break;
  24. }
  25. if (mod & MODS_CTRL_MASK) {
  26. del_mods(mod);
  27. add_key(key);
  28. send_keyboard_report();
  29. add_mods(mod); // return Ctrl but not sent
  30. } else {
  31. add_key(key);
  32. send_keyboard_report();
  33. }
  34. } else {
  35. del_key(key);
  36. send_keyboard_report();
  37. }
  38. break;
  39. }
  40. }
這樣就完成囉,重新 Compile 一次再重刷鍵位

這裡有我修改 keymap 的全部原始嗎: https://github.com/puritys/tmk_keyboard_custom/blob/master/keyboard/gh60/keymap_puritys.c




回應 (Leave a comment)