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

2024-01-05

Is there a way to make simultaneous key presses into a keybinding, e.g. for the keys w, e, f, when pressed within 0.05 seconds of each other, to trigger a command?

更具体:

  1. If w, e, f are pressed within 0.05 seconds of each other, then upon the pressing of the last one, XMonad should trigger said command. XMonad should also have intercepted the three keys so that they are not superfluously sent to the focused window.

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

My goal in this is to use w, e, f to "Escape" into a vim-like "Normal Mode", a XMonad.Actions.Submap (submap).


更新为failed方法,以防任何人都可以找到解决方法:

I attempted to implement this using submaps, so that, for example, if you pressed w you would end up in chord_mode_w, if you pressed e from there you would end up in chord_mode_we, and if you pressed f from there you would finally end up in normal_mode, for instance. The implementation was very messy: I included, in my main keybindings, something like:

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

for detecting w (the rest would be similar), along with (incomplete) submaps such as:

 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")
                    ...
               ]

一个完整的实现显然会非常混乱,但理论上应该让我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,回到主键绑定,让我无限期地回到和弦模式。)


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

Submap 确实可以almost你想要什么(它可以让你大部分到达那里)......我会建议你可能想要改变你正在尝试做的事情,哪怕是很小的改变,然后子地图可以完美地处理它。

您可以配置 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 f2)找到一种方法将您描述的延迟逻辑破解到子图中的操作中

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

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

YMMV,希望对某人有帮助

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XMonad:有没有办法绑定同时触发的键和弦? 的相关文章

  • 当前本地键盘映射的 Emacs 名称?

    我正在编写一个 elisp 函数 它将给定的键永久绑定到当前主要模式的键盘映射中的给定命令 例如 define key python mode map C f1 python describe symbol 命令和按键序列是从用户处交互收集
  • Java KeyListener 与键绑定

    我正在尝试编写一个计算器并遇到问题 我已经为所有按钮制作了一个动作侦听器 现在我想让从键盘输入数据成为可能 我是否需要为 KeyListener 或 Keybinding 完成所有操作 或者是否有其他方法可以在单击按钮后将其发送到 acti
  • Xcode 5 中的按键绑定

    我曾经这样做过 Xcode 重复行 但 IDETextKeyBindingSet plist 不再存在 有一个名为 KeyBindings 的文件夹 其中有一个空白文本文件 那么我们现在如何设置按键绑定呢 具体来说 我只想使用 comman
  • os x 上自定义类似 emacs 的键绑定:DefaultKeyBinding.dict 无法按预期工作

    我正在尝试添加 OS X 10 7 5 中类似 emacs 的键绑定 特别是 在默认键绑定中 alt d 和 alt b 插入特殊字符 而我希望它们删除一个单词并移回一个单词 我已经创建了一个文件 Library KeyBindings D
  • 键绑定和按住键

    我已经为 JTextArea 组件创建了一个键绑定 当被调用时 它会创建一个自身的新实例并将焦点设置到它上面 如果您按住 Enter 键 调用键绑定 我的程序将开始吐出一堆 JTextArea 实例 有没有办法强制用户再次按 Enter 键
  • GNU readline 和键绑定

    I ve read from the GNU getline documentation that it s capable for binding some callback functions to some keys I know a
  • 终端模拟器中的 Emacs 键绑定发生变化

    我注意到终端模拟器中的一些 Emacs 键绑定发生了变化 xfce4 terminal For example M SPC under TTY sets the mark but in xfce4 terminal it does noth
  • Ipython 终端的自定义按键绑定

    是否可以定义自定义键绑定和 或停用 Ipython 终端界面的默认键绑定 For example I have bound C j and C l to move left and right in my terminal by confi
  • registerKeyboardAction(...) 和 getInputMap().put(...) + getActionMap().put(...) 有什么区别?

    这两种方法有什么区别 getInputMap JComponent WHEN FOCUSED put KeyStroke getKeyStroke pressed F10 someAction getActionMap put someAc
  • Java:如何从任何 JComponent 中删除默认的 KeyStrokes?

    我想控制哪个击键属于哪个Jcomponent 我什至想了解如何删除与Jcomponent并用其他最喜欢的击键替换它们 我遵循了这个神谕tutorial http docs oracle com javase tutorial uiswing
  • Sublime text:如何将键绑定添加到 hex_viewer 包命令

    我已经在 sublime text 3 上安装了 Hex Viewer 包 为了切换它 我使用 ctrl shift p 打开命令面板 然后我搜索 hex 并选择包的命令来切换十六进制视图 我想知道如何将键绑定到特定的包命令 我知道键绑定配
  • 重新映射 tkinter 中的默认键绑定

    我正在向我的根窗口添加一个键绑定 Tk 实例 其中包含一个文本小部件 root bind Control o setconnpanelopen 问题是 似乎control o默认情况下绑定到 插入换行符 因此我的程序会触发 但它也会插入换行
  • 设置按钮助记键事件,无需使用 ALT

    Is there a way to set a button key event in Java so that Alt does not have to be pressed For example when this is used s
  • Emacs 全局设置键到 C-TAB

    我正在尝试在 Emacs 中设置 Ctrl TAB 的键绑定 我使用了以下调用 global set key read kbd macro C TAB my func 然而 每当我使用它时 我都会得到一个
  • 在 wpf c# 中的某些控件中禁用全局 KeyBindings

    我有一个主窗口 其中有一些键绑定 如下所示
  • 简单的按键绑定无法按预期工作

    I m trying to bind ctrl x to editor action clipboardCutAction cut but with the condition that it is only invoked when te
  • 无法获取用于 tmux 和 OSX 的删除键

    在通过自制软件安装了 tmux 的 OSX 上 我似乎无法让 删除 键起作用 我正在使用 iterm2 并将删除映射到 H 如果没有 tmux 删除 键可以正常工作 修复 Apple M1 Pro OSX 12 4 tmux 3 3a 上的
  • 将功能绑定到按键不起作用

    My code import tkinter master tkinter Tk master title test1 master geometry 300x300 masterFrame tkinter Frame master mas
  • 在 JS/jQuery 中绑定方向键

    如何在 Javascript 和 或 jQuery 中将函数绑定到左右箭头键 我查看了 jQuery 的 js hotkey 插件 包装内置绑定函数以添加参数来识别特定键 但它似乎不支持箭头键 document onkeydown func
  • 在 Vim 中,为什么用 'j' 表示向下,用 'k' 表示向上?

    我使用 Vim 已经很多年了 但从未真正考虑过它 我的一个朋友问这是为什么 他指出在我们的文化中 左键通常映射到上 而右键映射到下 使 Vim 键向后 我知道它们位于主排 这意味着您不必将手指移动到任何地方即可击中它们 但这完全是不同的点

随机推荐