有没有一种方法可以使同时按下按键成为绑定,例如w,e,f键在彼此之间的0.05秒内按下时是否触发命令?

更具体:


如果w,e,f在彼此之间的0.05秒内被按下,则在最后一个按下时,XMonad应该触发所述命令。 XMonad还应该拦截了这三个键,以便它们不会被多余地发送到焦点窗口。
否则(如果至少0.05秒内未按下其中之一),XMonad应该照常将按键发送到聚焦窗口。


我的目标是使用w,e,f将其“转义”到类似于vim的“正常模式”,即XMonad.Actions.Submap(子图)。



使用失败的方法进行更新,以防万一有人可以看到修复它的方法:

我尝试使用子图实现此功能,例如,如果按w键,您将以chord_mode_w结尾;如果按w键,则将以chord_mode_we结尾;如果按f键,则将以normal_mode结尾。最终会以normal_mode结尾。该实现非常混乱:我在主要的键绑定中包含以下内容:

("w", spawn "xdotool key <chord_mode_w_keybinding> ; sleep 0.05 ; xdotool key <abort_keybinding>")
(chord_mode_w_keybinding, chord_mode_w)


用于检测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")
                    ...
               ]


完整的实现显然会非常混乱,但是从理论上讲,如果我在彼此之间的0.05秒内按“ wef”,则应该将我发送到pasteString,否则中止并键入字符。但是,有两个问题:


XMonad.Util.Paste(以及normal_mode中的其他粘贴功能)对于正常键入​​而言太慢
即使将中止延迟设置得更高,我也只会在很小的时间内进入pasteString。不知道背后的原因。


(我中止而不是生成另一个xdotool时使用xdotool的原因是,chord_mode_w_keybinding的输出将重新触发chord_mode_e_keybindingchord_mode_f_keybinding,中的一个,回到主键绑定中,发送我会无限期地回到和弦模式。)

最佳答案

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

Submap实际上确实可以完成几乎所有您想要的事情(它可以为您提供大部分帮助)...并且我建议您可能要稍微改变一下您想做的事情,然后Submap可以完美地处理它。

您可以配置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!\"" ) ])
    ])


但是,以上内容几乎肯定不是您真正想要做的事情……因为现在无法向窗口发送w按键(我必须在输入此答案之前禁用该配置,这需要发送多个w按键事件进入活动窗口)

我现在在玩此游戏时看到的行为是:如果我按下w,xmonad会捕获该事件(不会将其发送到活动窗口),并且现在处于等待e或其他内容的状态否则...如果我按其他操作,xmonad不再处于该状态,但不会“重播”那些被困的事件。因此,如果我按w然后是其他不是e的键,则结果只是xmonad退出了监听子图中的键的状态。它永远不允许w进入活动窗口...我觉得很不方便。

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

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

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

YMMV,希望它可以帮助某人

关于key-bindings - XMonad:有没有办法绑定(bind)同时触发的琴键?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27747079/

10-13 05:12