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)