我的问题如下:我使用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)
使用超级密钥时,我还将HJKJ映射到箭头键,使vim像导航一样无处不在:
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不是一个合适的修改键,所以我遇到了麻烦。