Autohotkey 按住一个按钮+按另一个宏

Autohotkey 按住一个按钮+按另一个宏,autohotkey,Autohotkey,我太习惯在我的Mac笔记本电脑上使用VI风格的导航,以至于每当我需要在家里切换到我的Windows电脑时,我都很讨厌。在我发现自动热键之前,我感到很痛苦。它相当强大。然而,我仍然不知道我在OSX中有什么东西可以使用 带s按钮的HJLK导航。所以我会按住s,同时按住h——光标向左移动,对于j——它向下移动,等等 我可以用自动热键来做这样的吗?我知道使用Ctrl或Alt可能是可行的,但我希望s按钮的行为像一个特殊的按钮。还请记住,它必须是导航-你不应该让我们去切换方向。在按住s的同时,先按jjj,然

我太习惯在我的Mac笔记本电脑上使用VI风格的导航,以至于每当我需要在家里切换到我的Windows电脑时,我都很讨厌。在我发现自动热键之前,我感到很痛苦。它相当强大。然而,我仍然不知道我在OSX中有什么东西可以使用

带s按钮的HJLK导航。所以我会按住s,同时按住h——光标向左移动,对于j——它向下移动,等等


我可以用自动热键来做这样的吗?我知道使用Ctrl或Alt可能是可行的,但我希望s按钮的行为像一个特殊的按钮。还请记住,它必须是导航-你不应该让我们去切换方向。在按住s的同时,先按jjj,然后按h,应将光标向下移动三次,然后向左移动一次

您可以使用光圈和符号组合两个关键点。说:

&可以在任意两个键或鼠标按钮之间使用符号AND将它们组合成自定义热键

应该做

如果要切换上述热键的效果,可以改为使用热键命令定义热键,或者更简单地使用:

另外,如果您根本不希望覆盖原始的key函数,那么

当热键触发时,其键的本机功能将不会被阻止,并且不会被系统隐藏

也许是这样

$i::HkHelperFunc("s", "{Up}", "i")
$h::HkHelperFunc("s", "{Left}", "h")
$j::HkHelperFunc("s", "{Down}", "j")
$k::HkHelperFunc("s", "{Right}", "k")

HkHelperFunc(key, keyIfKeyDown, keyIfKeyUp) {
    If GetKeyState(key)
        SendInput, {BS}%keyIfKeyDown%
    Else
        SendInput, %keyIfKeyUp%
}
或者,由于无需删除任何字符,因此可能会更干净一些:

$s::  
    sDown := True
    Input, L, L1 T0.3
    If (sDown && (L = "I" || L = "H" || L = "J" || L = "L"))
        traytip ;do nothing
    Else If (ErrorLevel != "Timeout")
        SendInput, s%L%
Return

$s UP::
    sDown := False
Return

#If sDown
i::SendInput, {Up}
h::SendInput, {Left}
j::SendInput, {Down}
k::SendInput, {Right}

这将阻止单个s键,因此您将无法键入它。起初它似乎可以工作,但有时它无法识别s键被自己按下。
$i::HkHelperFunc("s", "{Up}", "i")
$h::HkHelperFunc("s", "{Left}", "h")
$j::HkHelperFunc("s", "{Down}", "j")
$k::HkHelperFunc("s", "{Right}", "k")

HkHelperFunc(key, keyIfKeyDown, keyIfKeyUp) {
    If GetKeyState(key)
        SendInput, {BS}%keyIfKeyDown%
    Else
        SendInput, %keyIfKeyUp%
}
$s::  
    sDown := True
    Input, L, L1 T0.3
    If (sDown && (L = "I" || L = "H" || L = "J" || L = "L"))
        traytip ;do nothing
    Else If (ErrorLevel != "Timeout")
        SendInput, s%L%
Return

$s UP::
    sDown := False
Return

#If sDown
i::SendInput, {Up}
h::SendInput, {Left}
j::SendInput, {Down}
k::SendInput, {Right}