2016-12-06 1 views
3

Ich habe meine CAPSLOCK an F18 (Karabiner) gebunden, um als eine Modifizierungsschlüssel zu fungieren. Ich versuche CAPSLOCK + h, j, k, l zu simulieren, um als VIM-Bewegungsschlüssel zu fungieren. Alles funktioniert, aber es gibt ein Problem mit der Verzögerung beim Wiederholen. Das heißt, es ist sehr langsam, wenn ich die CAPSLOCK + h drücke, was die Taste "< -" wiederholt drücken sollte, aber es ist sehr verzögert und sendet nur eine pro Sekunde. Irgendwelche Ideen, warum das passiert? Mein init.lua ist unten:Key Repeats sind in meinem Hammerspoon Skript verzögert

-- A global variable for the Hyper Mode 
k = hs.hotkey.modal.new({}, "F17") 

-- Enter Hyper Mode when F18 (Hyper/Capslock) is pressed 
pressedF18 = function() 
    k.triggered = false 
    k.modifier = false 
    k:enter() 

    trigger_modifier = function() 
    k.modifier = true 
    end 

    -- Only trigger as modifier if held longer than thisj 
    hs.timer.doAfter(0.35, trigger_modifier) 
end 

-- Arrow keys 
k:bind({}, 'h', function() 
    hs.eventtap.keyStroke({}, 'Left') 
    k.triggered = true 
end) 

k:bind({}, 'j', function() 
    hs.eventtap.keyStroke({}, 'Down') 
    k.triggered = true 
end) 

k:bind({}, 'k', function() 
    hs.eventtap.keyStroke({}, 'Up') 
    k.triggered = true 
end) 

k:bind({}, 'l', function() 
    hs.eventtap.keyStroke({}, 'Right') 
    k.triggered = true 
end) 

-- Leave Hyper Mode when F18 (Hyper/Capslock) is pressed, 
-- send ESCAPE if no other keys are pressed. 
releasedF18 = function() 
    k:exit() 

    if not k.triggered then 
    -- If hotkey held longer than this amount of time 
    -- let it remain as modifier and don't send ESCAPE 
    if not k.modifier then 
     hs.eventtap.keyStroke({}, 'ESCAPE') 
    else 
     print("Modifier detected") 
    end 
    end 
end 

-- Bind the Hyper key 
f18 = hs.hotkey.bind({}, 'F18', pressedF18, releasedF18) 

Antwort

4

Ich hatte etwas ähnliche Langsamkeit. Es sieht so aus, als ob in einer der neuesten Versionen etwas Langsamkeit eingeführt wurde. Sie können die untere Funktion mit der folgenden Funktion aufrufen: fastKeyStroke. Ich habe meine hjkl Implementierung hinzugefügt, damit Sie sehen können, wie sie verwendet wird. Beachten Sie auch, dass ich 5 Parameter in hs.hotkey.bind übergebe, wie in der docs für die Wiederholung von Schlüsseln angegeben.

local hyper = {"shift", "cmd", "alt", "ctrl"} 

local fastKeyStroke = function(modifiers, character) 
    local event = require("hs.eventtap").event 
    event.newKeyEvent(modifiers, string.lower(character), true):post() 
    event.newKeyEvent(modifiers, string.lower(character), false):post() 
end 

hs.fnutils.each({ 
    -- Movement 
    { key='h', mod={}, direction='left'}, 
    { key='j', mod={}, direction='down'}, 
    { key='k', mod={}, direction='up'}, 
    { key='l', mod={}, direction='right'}, 
    { key='n', mod={'cmd'}, direction='left'}, -- beginning of line 
    { key='p', mod={'cmd'}, direction='right'}, -- end of line 
    { key='m', mod={'alt'}, direction='left'}, -- back word 
    { key='.', mod={'alt'}, direction='right'}, -- forward word 
}, function(hotkey) 
    hs.hotkey.bind(hyper, hotkey.key, 
     function() fastKeyStroke(hotkey.mod, hotkey.direction) end, 
     nil, 
     function() fastKeyStroke(hotkey.mod, hotkey.direction) end 
    ) 
    end 
) 

Source über die Langsamkeit

+2

Ja, das jetzt die richtige Antwort ist - hs.eventtap.keyStroke() ist eigentlich nur das gleiche newKeyEvent() Paar mit einem hs.timer.usleep() zwischen. Wir haben den kurzen Schlaf hinzugefügt, um zu versuchen, die Schlüsselereignisse zu vermeiden, die nicht in der richtigen Reihenfolge ankommen. Die nächste Version wird eine konfigurierbare Verzögerung hinzufügen, so dass Sie sie ausschalten können, wenn Sie wollen :) –

+0

Excellent, danke für die Info @ChrisJones –

Verwandte Themen