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)