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