Keyboard 自动热键:获取和弦以触发热字符串

Keyboard 自动热键:获取和弦以触发热字符串,keyboard,autohotkey,chord,Keyboard,Autohotkey,Chord,我使用数千个AHK热字符串。例如(简化): 与大多数AHK用户不同,我允许的唯一结束键是\。所以当我键入btw\时,顺便说一句,我得到了。空格键、回车键或其他类似键不会触发热字符串。这确保了热字符串不会被无意中设置 现在,我也使用和弦。下面是我的一个和弦的简化版本: ~t & g:: ~g & t:: SendInput {Backspace} SendInput {Space}the{Space} Return 这些和弦的工作方式是,如果我将手指按在t

我使用数千个AHK热字符串。例如(简化):

与大多数AHK用户不同,我允许的唯一结束键是
\
。所以当我键入
btw\
时,顺便说一句,我得到了
。空格键、回车键或其他类似键不会触发热字符串。这确保了热字符串不会被无意中设置

现在,我也使用和弦。下面是我的一个和弦的简化版本:

~t & g::
~g & t::
    SendInput {Backspace}
    SendInput {Space}the{Space}
    Return
这些和弦的工作方式是,如果我将手指按在
t
g
键之间的边界上,AHK会键入
(包括前后的空格)非常有用

现在,我想把这一点提高一点:我希望和弦能够自动触发热弦。例如,假设我想通过
的方式键入
。我可以键入
btw\
,然后一起键入
t
g
。但是,如果我可以跳过反斜杠,而让和弦自动触发热字符串,那就更好了。(当然,只有在和弦前面的文本是热字符串的情况下。)

现在很明显,我希望这不仅适用于
btw
t
+
g
,而且适用于我大量收藏中的hotstring和chord的任何组合

我该怎么做?

(我想到的一个想法是,AHK可能有一个函数,它在每次点击结束键时都会启动,这样做的效果是“查看用户目前键入的文本。它是热字符串吗?如果是,请执行它。”如果我有办法从我的chord脚本中调用该函数,那就可以解决我的问题了。但是,我不知道怎么做。)

使用可能是您的一个选择。棘手的部分是确定文本是否为热字符串。可能保存了所有东西的数组?下面是一些伪代码

#Include DynamicHotstrings.ahk

hotstrings("(\w+)\\", "check")
Return

check:
    args := $1
    if (args = "btw") ; Ideally you would check an array to see if this was a hotstring
        msgbox % args ; SendInput
return
将热字符串放入数组可以简单地手动维护它们,解析脚本,甚至使用类似的脚本


我希望这为您指明了正确的方向。

您的问题让我非常困扰,我一直在玩弄,直到找到一个似乎效果不错的解决方案:

#HotString *B0
SendMode, Input

endChars := "`n `t"
interruptChars := chr(8) ; 8 is BACKSPACE
counter := 33
while(counter <= 126)
{
    interruptChars .= chr(counter++)
}
Loop, Parse, endChars
{
    Hotkey, *~%A_LoopField%, FinishHotstring
}
Loop, Parse, interruptChars
{
    Hotkey, *~%A_LoopField%, InterruptHotString
}

; this is our pending hotstring replacement
pendingHS := ""
; this var will hold the number of BACKSPACEs needed
; to erase the input before replacing the hotstring
pendingBS := -1

Exit

::btw::
    pendingHS := "by the way"
    RegExMatch(A_ThisLabel, ":.*?:(.*)", abbr)
    pendingBS := StrLen(abbr1)
return

::bt::
    pendingHS := "Bluetooth"
    RegExMatch(A_ThisLabel, ":.*?:(.*)", abbr)
    pendingBS := StrLen(abbr1)
return

~t & g::
~g & t::
    if(pendingHS) {
        pendingBS++
        Send % "{BACKSPACE " pendingBS "}" pendingHS " the "
        pendingHS := ""
    } else {
        Send % "{BACKSPACE} the "
    }
Return

FinishHotstring:
    if(pendingHS) {
        pendingBS++
        Send, % "{BACKSPACE " pendingBS "}" pendingHS
        pendingHS := ""
    }
return

InterruptHotString:
    if(pendingHS) {
        pendingHS := ""
    }
return
#热字符串*B0
发送模式,输入
endChars:=“n`t”
中断字符:=chr(8);8是退格
计数器:=33

虽然(counter在花了大约10个小时之后,我决定放弃这个项目。除了所有通常的AHK恐怖和bug之外,还有一个棘手的问题,如果我键入
我爱太阳
,然后同时键入
7
u
,我会得到
我爱周日和
而不是
我爱太阳and
,因为AutoHotKey无法知道我不是故意在那个例子中扩展热字符串的。

你考虑过,简单地让热字符串立即启动,而不是等待结束字符吗?
:*:btw::顺便说一句
@MCL问题是,这样我在使用ho时需要更加小心t字符串。我目前使用
q
处理
问题
,这是不可能的。这也会使我无法处理包含彼此的热字符串,如
il2
il2k
(它们是
我想
我想知道
)我对这个对话很感兴趣,因为我也使用\,但也使用=,[,],/作为退出字符。每个退出字符都用于特定的语言(口语或编程)…继续执行建议,并让我们了解最终解决方案。我真的不明白这将如何解决我的问题。您是否建议当用户点击和弦时,我将手动转到
检查
?如果是,它将如何访问键入的文本?@RamRachum
检查将为每个
单词调用输入。如果单词是hotstring,则可以将其存储,然后触发的下一个和弦可以发送相应的字符串。这里的问题是,您必须定义某种超时,以确定用户是否要附加“chord hotstring”或者只发送hotstring替换内容。另外,@ElliotDeNolf:您只需通过检查现有hotstring即可。然后您可以发送替换文本:
send,::btw
Wow,这是一个非常有用的函数,我不知道,谢谢!这不是一个打字错误吗?一方面,它看起来是这样,另一方面d、 脚本正在运行…@RamRachum pleaser请参阅。“如果NeedleRegEx中存在任何捕获子模式,则它们的匹配项将存储在基名称为OutputVar的数组中。例如,如果变量的名称为Match,则与第一个子模式匹配的子字符串将存储在Match1中,第二个子模式将存储在Match2中,依此类推。”。“我明白了。这个解决方案令人印象深刻。但是……我不知道我是否想与AHK处理HotString的方式有太多分歧。我有自己对HotString的自定义,现在我必须确保这些在与您的解决方案结合使用时仍能正常工作……我只希望AHK能让我们访问其内部例程,该例程执行以下操作:“这是热字符串吗?如果是,请执行它。”"跳舞吧,这样我们就不必绕圈子了。是的,这是个累赘。你在说什么自定义设置?基本上,你只需要将
pendings
设置为在触发
endChar
时想要输出的任何内容。在自动替换热字符串的情况下转换脚本是很简单的,复杂的热字符串意味着e工作。
#HotString *B0
SendMode, Input

endChars := "`n `t"
interruptChars := chr(8) ; 8 is BACKSPACE
counter := 33
while(counter <= 126)
{
    interruptChars .= chr(counter++)
}
Loop, Parse, endChars
{
    Hotkey, *~%A_LoopField%, FinishHotstring
}
Loop, Parse, interruptChars
{
    Hotkey, *~%A_LoopField%, InterruptHotString
}

; this is our pending hotstring replacement
pendingHS := ""
; this var will hold the number of BACKSPACEs needed
; to erase the input before replacing the hotstring
pendingBS := -1

Exit

::btw::
    pendingHS := "by the way"
    RegExMatch(A_ThisLabel, ":.*?:(.*)", abbr)
    pendingBS := StrLen(abbr1)
return

::bt::
    pendingHS := "Bluetooth"
    RegExMatch(A_ThisLabel, ":.*?:(.*)", abbr)
    pendingBS := StrLen(abbr1)
return

~t & g::
~g & t::
    if(pendingHS) {
        pendingBS++
        Send % "{BACKSPACE " pendingBS "}" pendingHS " the "
        pendingHS := ""
    } else {
        Send % "{BACKSPACE} the "
    }
Return

FinishHotstring:
    if(pendingHS) {
        pendingBS++
        Send, % "{BACKSPACE " pendingBS "}" pendingHS
        pendingHS := ""
    }
return

InterruptHotString:
    if(pendingHS) {
        pendingHS := ""
    }
return