Keyboard 在QMK中使用两个单键(OSM)进行踢踏舞

Keyboard 在QMK中使用两个单键(OSM)进行踢踏舞,keyboard,qmk,qmk-firmware,Keyboard,Qmk,Qmk Firmware,我正在寻求在QMK中实现特定踢踏舞的帮助。我希望有一个单键组合像OSM一样的控件和像OSM一样的Alt(也许以后会添加一个基本键作为三次点击动作) 具体来说,它的行为应该如下所示: 单键点击:一次点击修改器:等待下一次按键,然后发送Ctrl+该键 单次按住:与正常的Ctrl键类似 双击:一次性修改器:等待下一次按键,然后发送Alt+该键 双重按住:像正常的Alt 因此,实际上,单点按住/单点点击将模拟单点点击修改器,而双点按住/单点点击将模拟另一个修改器 例如,我想使用Ctrl+left或Ctr

我正在寻求在QMK中实现特定踢踏舞的帮助。我希望有一个单键组合像OSM一样的控件和像OSM一样的Alt(也许以后会添加一个基本键作为三次点击动作)

具体来说,它的行为应该如下所示:

  • 单键点击:一次点击修改器:等待下一次按键,然后发送Ctrl+该键
  • 单次按住:与正常的Ctrl键类似
  • 双击:一次性修改器:等待下一次按键,然后发送Alt+该键
  • 双重按住:像正常的Alt
  • 因此,实际上,单点按住/单点点击将模拟单点点击修改器,而双点按住/单点点击将模拟另一个修改器

    例如,我想使用Ctrl+left或Ctrl+right在文本中按单词导航

    • 点击TD,然后按左键:按Ctrl+left(向后一个单词)
    • 按住TD键,向左按一次:按Ctrl+left键(向后一个单词)
    • 按住TD键,向左按两次:发送Ctrl+left和Ctrl+left(两次) 字数倒转)
    使用Alt(按段落移动)双击和双保持时相同

    首先,我试着这样做:

    /***此踢踏舞的代码*/
    静态分接c_a_状态={
    .是否按动作=正确,
    .state=0
    };
    无效c_a_完成(qk_踢踏舞_状态_t*状态,无效*用户数据){
    c_a_state.state=cur_dance(state);
    开关(c_a_state.state){
    case SINGLE_TAP:set_oneshot_mods(MOD_BIT(KC_LCTL));break;//模拟OSM进行Ctrl
    大小写单保持:寄存器代码(KC\U LCTL);中断;//按下时的正常修饰符(Ctrl)
    case DOUBLE_TAP:set_oneshot_mods(MOD_BIT(KC_LALT));break;//模拟OSM for Alt
    case DOUBLE\u HOLD:寄存器代码(KC\u LALT);break;//按住时的法线修饰符(Ctrl)
    case DOUBLE\u SINGLE\u TAP:break;//没有原因,但它在我的模板中
    }
    }
    无效c_a_重置(qk_踢踏舞_状态_t*状态,无效*用户数据){
    开关(c_a_state.state){
    案例单点点击:清除单点点击;断开;
    案例单一保存:取消注册代码(KC\U LCTL);中断;
    外壳双重轻敲:清除一次性轻敲模块();断开;
    案例双重持有:取消注册代码(KC);中断;
    外壳双_单_分接头:断开;
    }
    c_a_state.state=0;
    }
    /***踢踏舞动作列表*/
    qk_踢踏舞(动作)t踢踏舞(动作){
    [CVXA]=动作\u轻拍\u舞蹈\u FN\u高级(空,CVXA\u完成,CVXA\u重置),
    [e_ctrl]=动作\u轻拍\u舞蹈\u FN\u高级(空,e_完成,e_重置),
    [f_search]=动作\u踢踏舞\u FN_高级(空,f_完成,f_重置),
    [CTL\U ALT]=动作\u轻拍\u舞蹈\u FN\u高级(空,c\u a\u完成,c\u a\u重置),
    };
    
    现在我得到的是:

    • 轻触TD,然后按向左:无
    • 按住TD键,向左按一次:按Ctrl+left键(向后一个单词)
    • 按住TD键,向左按两次:发送Ctrl+left和Ctrl+left(两次) 字数倒转)
    因此,点击时的单键键不起作用,但保持时的普通修改器起作用。似乎与Alt相同。我认为这可能是因为oneshot mods在键控时重置。因此,我试着不用这个:

    void c_a_重置(qk_踢踏舞_状态_t*状态,void*用户数据){
    开关(c_a_state.state){
    case SINGLE_TAP:break;//我刚刚遗漏了清除部分,但这似乎中断了暂停操作
    案例单一保存:取消注册代码(KC\U LCTL);中断;
    外壳双_水龙头:断开;
    案例双重持有:取消注册代码(KC);中断;
    外壳双_单_分接头:断开;
    }
    c_a_state.state=0;
    }
    
    现在,当我点击TD键一次,然后点击箭头键时,我会出现一次性行为。它可以毫无问题地添加修改器。我可以重复这一点,只要我喜欢,工程与双点击,也

    但它破坏了正常的保持行为。因此,我的结论是:

    • 点击TD,然后按左键:按Ctrl+left(向后一个单词)
    • 按住TD键,向左按一次:按Ctrl+left键(向后一个单词)
    • 按住TD键,向左按两次:按Ctrl+left,然后只按left而不按Ctrl(因此向后一个单词加上向后一个字符)
    现在我不明白在点击后不在键盘上重置怎么会干扰被称为保持的步骤。有人能告诉我这个问题的解决方案吗?我知道oneshot_mods必须在某个时候被清除,应该是在按下另一个键时-但是我应该把它放在哪里呢