我的问题如下:我使用 Karabiner Elements 将我的大写锁定重新映射到 F18,然后 Hammerspoon 使用 F18 作为“超级键”来执行特定于应用程序的快捷方式。
我当前的代码如下所示:
-- A global variable for the Hyper Mode
k = hs.hotkey.modal.new({}, "F17")
launch = function(bundleID)
hs.application.launchOrFocusByBundleID(bundleID)
k.triggered = true
end
-- Single keybinding for app launch
singleapps = {
{'f', 'com.apple.Finder'},
{'c', 'com.google.Chrome'},
}
for i, app in ipairs(singleapps) do
k:bind({}, app[1], function() launch(app[2]); end, nil, function() launch(app[2]); end)
当使用超级键在任何地方都有类似 vim 的导航时,我也将 HJKJ 映射到箭头键:
arrowKey = function(arrow, modifiers)
local event = require("hs.eventtap").event
event.newKeyEvent(modifiers, string.lower(arrow), true):post()
event.newKeyEvent(modifiers, string.lower(arrow), false):post()
end
k:bind({}, 'h', function() arrowKey('LEFT', {}); end, nil, function() arrowKey('LEFT', {}); end)
k:bind({}, 'j', function() arrowKey('DOWN', {}); end, nil, function() arrowKey('DOWN', {}); end)
k:bind({}, 'k', function() arrowKey('UP', {}); end, nil, function() arrowKey('UP', {}); end)
k:bind({}, 'l', function() arrowKey('RIGHT', {}); end, nil, function() arrowKey('RIGHT', {}); end)
所以HYPER-H
基本上输出左箭头键。但我的问题是我还想HYPER-COMMAND-H
输出 command-left-arrow-key 因为这会将光标带到行首。
k:bind({'cmd'}, 'n', function() arrowKey('LEFT', {'cmd'}); end, nil, function() arrowKey('LEFT', {'cmd'}); end)
我有它看起来像这样。但是,问题是 HYPER-COMMAND-H 有效,但 COMMAND-HYPER-H无效。如果我弄乱了修饰符的顺序(这通常无关紧要),它会完全中断,这非常不方便。
我将如何做到这一点,以便顺序无关紧要?F18 不是正确的修饰键,所以我遇到了真正的麻烦。