You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Awesome WM中编写[super+d,e]这类按键绑定序列?

在Awesome WM中实现按键序列绑定(如[Super+d, e]或[Super+d, Super+r])

基础的awful.key()仅支持单组按键组合,无法处理序列式按键绑定(先按Super+d,松开后再按后续按键)。使用awful.keygrabber可以完美解决这个问题,以下是实用的实现方案:

核心实现思路

通过awful.key()绑定初始触发键(Super+d),触发后启动awful.keygrabber.run()监听后续按键,匹配到目标按键序列后执行对应动作并停止监听,支持超时自动退出或ESC取消。

代码示例

基础版(无超时)

awful.key({ "Mod4" }, "d", function()
    awful.keygrabber.run(function(mods, key, event)
        -- 仅处理按键按下事件,避免重复触发
        if event == "press" then
            -- 匹配[Super+d, e]:按下e(若需严格无修饰键可判断#mods==0)
            if key == "e" then
                awful.spawn("thunar") -- 替换为你需要执行的动作
                awful.keygrabber.stop()
            -- 匹配[Super+d, Super+r]:按下r且按住Super键
            elseif key == "r" and awful.util.table.hasitem(mods, "Mod4") then
                awesome.restart() -- 替换为你需要执行的动作
                awful.keygrabber.stop()
            -- 按ESC退出序列监听
            elseif key == "Escape" then
                awful.keygrabber.stop()
            end
        end
        -- 返回true保持监听,直到主动停止
        return true
    end, nil, "Press e to open file manager, Super+r to restart Awesome, ESC to cancel")
end, { description = "Trigger key sequence menu", group = "launcher" })

优化版(带超时自动退出)

添加3秒超时,无操作时自动退出监听:

awful.key({ "Mod4" }, "d", function()
    -- 创建超时计时器
    local seq_timer = timer({ timeout = 3 })
    seq_timer:connect_signal("timeout", function()
        awful.keygrabber.stop()
        seq_timer:stop()
    end)
    seq_timer:start()

    awful.keygrabber.run(function(mods, key, event)
        if event == "press" then
            seq_timer:stop() -- 有按键按下时重置计时器
            if key == "e" then
                awful.spawn("thunar")
                awful.keygrabber.stop()
            elseif key == "r" and awful.util.table.hasitem(mods, "Mod4") then
                awesome.restart()
                awful.keygrabber.stop()
            elseif key == "Escape" then
                awful.keygrabber.stop()
            end
        end
        return true
    end, nil, "Press e (file manager), Super+r (restart), ESC/cancel (3s timeout)")
end, { description = "Trigger key sequence menu", group = "launcher" })

关键逻辑说明

  • awful.keygrabber.run()的回调函数接收三个参数:mods(当前按住的修饰键列表)、key(按下的按键)、event(事件类型:press/release)
  • 通过判断mods和key的组合,精准匹配目标序列
  • 调用awful.keygrabber.stop()主动终止监听,避免持续占用按键输入
  • 可选的提示文本会显示在Awesome的状态栏,引导用户操作

内容的提问来源于stack exchange,提问作者Marshelo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 20:45:33