gpt4 book ai didi

hammerspoon - 绑定(bind)到多个按钮点击

转载 作者:行者123 更新时间:2023-12-03 17:16:40 25 4
gpt4 key购买 nike

要绑定(bind)到我使用的 1 键:

hs.hotkey.bind(hyper, '1'

如何绑定(bind)1个键的多次按下?就像是:
hs.hotkey.bind(hyper, '1+1'

阅读 the documentation ,没有提到这个功能。

多次按我的意思是按 1两次运行一些代码并按 1三次运行单独的一段代码。

最佳答案

您将不得不自己实现这一点。以下是如何完成此操作的基本摘要:

  • 从零开始计时,并将第一次按下的标志设置为 false,这表示第一次按下还没有发生
  • 使用 hs.eventtap 观察和观察按键,特别是 hs.eventtap.event.types.keyPress
  • 当事件( keyPress )发生时,检查按下的键是否是正确的键
  • 如果是右键,检查是否是第二次按下,是否及时,如果不是及时或不是第二次按下,则将计时器设置为当前时间,并将第一个标志设置为 true
  • 如果是第二次按下并且及时,则执行我们的处理程序并重置计时器和第一个标志
  • 如果不是正确的键,则重置计时器和第一个标志

  • 翻译成代码,这就是它的样子(我不是 Lua 专家)。请注意,这些标志可以在此处实现为 bool 值,或者作为一个包含按键的内部表,到目前为止您可以检查:

    local timer = require("hs.timer")
    local eventtap = require("hs.eventtap")
    local keycodes = require("hs.keycodes")
    local events = eventtap.event.types --all the event types

    timeFrame = 1 --this is the timeframe in which the second press should occur, in seconds
    key = 50 --the specific keycode we're detecting, in this case, 50

    --print(keycodes.map["`"]) you can look up the certain keycode by accessing the map

    function twoHandler()
    hs.alert("Pressed ` twice!") --the handler for the double press
    end

    function correctKeyChecker(event) --keypress validator, checks if the keycode matches the key we're trying to detect
    local keyCode = event:getKeyCode()
    return keyCode == key --return if keyCode is key
    end

    function inTime(time) --checks if the second press was in time
    return timer.secondsSinceEpoch() - time < timeFrame --if the time passed from the first press to the second was less than the timeframe, then it was in time
    end

    local pressTime, firstDown = 0, false --pressTime was the time the first press occurred which is set to 0, and firstDown indicates if the first press has occurred or not

    eventtap.new({ events.keyDown }, function(event) --watch the keyDown event, trigger the function every time there is a keydown
    if correctKeyChecker(event) then --if correct key
    if firstDown and inTime(pressTime) then --if first press already happened and the second was in time
    twoHandler() --execute the handler
    elseif not firstDown or inTime(pressTime) then --if the first press has not happened or the second wasn't in time
    pressTime, firstDown = timer.secondsSinceEpoch(), true --set first press time to now and first press to true
    return false --stop prematurely
    end
    end
    pressTime, firstDown = 0, false --if it reaches here that means the double tap was successful or the key was incorrect, thus reset timer and flag
    return false --keeps the event propogating
    end):start() --start our watcher

    为了更好地理解,我逐行注释了代码。如果您想检测 3 次或 4 次或其他任意 N 次按下,只需为 N - 1 次按下设置标志并添加一些检查,但是具有连续按下 2 次以上的组合键是不常见的。它确实看起来有点冗长,但AFAIK这就是你的做法。为避免重复代码和样板,请尝试将其放入类结构或模块中,以便您可以重用代码。

    至于为 2 次连续按下或 3 次连续按下执行不同的处理程序,这会有点麻烦,因为您必须等待整个时间范围才能知道用户是否会再次按下以知道要执行哪个处理程序。这会导致轻微的延迟和糟糕的用户体验,我建议不要这样做,尽管您可以通过重构代码并进行更多检查来实现这一点,例如它是否是时间框架并且第一个标志被触发,然后执行处理程序一按。

    关于hammerspoon - 绑定(bind)到多个按钮点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44303244/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com