XMonad:有没有办法绑定同时触发的键盘?

spa*_*sue 2 xmonad key-bindings

有没有一种方法,使同时按键成键绑定,例如用于键w,e,f,当0.05秒彼此的内按下,触发命令?

更具体:

  1. 如果w,e,f被0.05秒彼此的内压,则在按下的最后一个,XMonad应该触发所述命令.XMonad也应截获三个键,以便它们不会被多余地发送到聚焦窗口.

  2. 否则(如果在0.05秒的时间内没有按下其中一个)XMonad应像往常一样将密钥发送到聚焦窗口.

我在这个目标是用w,e,f"逃"到一个VIM般的"正常模式",一个XMonad.Actions.Submap(子图).


使用失败的方法更新,以防任何人都可以看到修复它的方法:

我尝试使用子图实现这一点,所以,例如,如果你按下了,w你最终会进入chord_mode_w,如果你e从那里按下,你最终会进入chord_mode_we,如果你f从那里按下,你最终会最终进入normal_mode,例如.实现非常混乱:我在主要的键绑定中包括:

("w", spawn "xdotool key <chord_mode_w_keybinding> ; sleep 0.05 ; xdotool key <abort_keybinding>")
(chord_mode_w_keybinding, chord_mode_w)
Run Code Online (Sandbox Code Playgroud)

用于检测w(其余部分类似),以及(不完整的)子图,例如:

 chord_mode_w = submap . mkKeymap c $
              [
                      ("e",  chord_mode_we )
                    , ("f",  chord_mode_wf )
                    , (abort_keybinding, pasteString "w")

                    -- in order for the submap to not eat all other letters,
                    -- would need to include all mappings like:
                    , ("a", pasteString "wa")
                    , ("b", pasteString "wb")
                    ...
              ]

 chord_mode_we = submap . mkKeymap c $
               [
                      ("f",  normal_mode )
                    , (abort_keybinding, pasteString "we")


                    -- in order for the submap to not eat all other letters,
                    -- would need to include all mappings like:
                    , ("a", pasteString "wea")
                    , ("b", pasteString "web")
                    ...
               ]

 chord_mode_wf = submap . mkKeymap c $
               [
                      ("e",  normal_mode )
                    , (abort_keybinding, pasteString "wf")

                    -- in order for the submap to not eat all other letters,
                    -- would need to include all mappings like:
                    , ("a", pasteString "wfa")
                    , ("b", pasteString "wfb")
                    ...
               ]
Run Code Online (Sandbox Code Playgroud)

一个完整的实现显然会非常混乱,但理论上应该让我去,normal_mode如果我在0.05秒之内按下"wef",中止并输入字符.然而,有两个问题:

  1. pasteString(以及其他粘贴函数XMonad.Util.Paste)对于正常输入来说太慢了

  2. normal_mode即使我将中止延迟设置得更高,我也只会在一小部分时间内结束.不确定这背后的原因.

(我之所以用pasteString中止,而不是产卵时,另一个xdotool是产量xdotool将重新触发之一chord_mode_w_keybinding,chord_mode_e_keybinding,chord_mode_f_keybinding,回到主键绑定,送我回和弦模式下去.)

Bla*_*ler 6

https://hackage.haskell.org/package/xmonad-contrib-0.13/docs/XMonad-Actions-Submap.html

Submap确实做了你想要的几乎所有的事情(它可以让你大部分时间都在那里)......我会建议你可能想要改变你想要做的事情,那么轻微,然后Submaps完美地处理它.

您可以配置Submap以捕获w键事件,并开始等待e,然后等待f.我甚至试过这个,并确认它有效:

, ((0, xK_w), submap . M.fromList $
    [ ((0, xK_e),    submap . M.fromList $
      [ ((0, xK_f),  spawn "notify-send \"wef combo detected!\"" ) ])
    ])
Run Code Online (Sandbox Code Playgroud)

但是,上面几乎肯定不是你真正想做的事情......因为现在不可能将w按键发送到窗口(我必须在输入这个答案之前禁用该配置,这需要发送几个w按键事件到活动窗口)

我刚才看到的这种行为是:如果我按下w,xmonad会捕获该事件(不会将其发送到活动窗口)并且现在处于等待其中任何一个e或其他的状态...如果我按下其他内容,xmonad不再处于该状态,但它不会"重播"那些被困事件.因此,如果我按下w然后按下其他一些不是的键e,结果只是xmonad退出了侦听子图中键的状态.它永远不允许w通过活动窗口...我发现不方便.

我认为你的选择是:1)解决具有修饰符的初始键绑定,因此你的多键命令将是Mod4-w e f 2)找到一种方法来破解你描述的子图中的动作的延迟逻辑

我开始使用这样的配置,我在概念上嵌套了在嵌套子图树下很少需要的类似操作,类似于我上面粘贴的内容.但是,该树的根始终具有修饰符,因此它不会窃取我想要转发到活动窗口的按键.我Mod3-semicolon用作该树的根,然后有许多未经修改的按键只是字母(它们是动作的助记符).

对我来说,这似乎是一个更好的解决方案,而不是等待几百毫秒,然后转发事件,除非它们匹配.我觉得我觉得这很烦人,因为它会延迟任何w按键事件......

YMMV,希望它可以帮助某人