一、热字符串概述
相比于热键,热字符串这里可能就冷清很多,热字符不管从形式还是执行效果,都有点像热键的一个拓展功能,相应的就得不到大家的关注。但是,笔者看来热字符串逻辑是一个很大的逻辑突破,特别是对于中文用户,为什么这么说呢?这里我简要分析一下,热字符串的作用是输入特定字符串然后执行相关功能,常见的执行功能有:
- 拓展功能,比如我输入aak,直接在浏览器地址栏上屏www.autoahk.com
- 替换功能,如果我输入autoakh,其中k和h位置反了,它帮我们自动矫正为autoahk
- 格式化为本,比如我输入minnong(悯农),它就打出四行的诗
- 附带操作,如果我输入aak,直接在浏览器地址栏上屏www.autoahk.com,并按下enter按键
- ……
先列举这些,从上面列举的功能中,可以总结出一个共同点,就是输出过程中对输出内容进行了多次“深加工”,这个逻辑思路很重要,而且这个思路在非英文用户区早已经成为核心用法,比如我们日常用到最多的输入法其实就是一个输入字母转化为汉字并上屏的过程,比如我们游戏中使用wasd这几个按键控制角色移动……类似的例子还有很多,笔者不再一一列举。综上,笔者认为热字符串是可能是被中文用户严重低估了的一个重要功能。
二、简单热字符串
类比热键,热字符串也有两种格式:
第一种单行写法:两个双冒号包围字符串,紧贴写拓展的字符串:
::ahk::AutoHotkey ;缩写拓展
在上面的例子中, 每当您输入缩写ahk时会被自动替换为 “AutoHotkey”(不过, 默认情况下您必须在输入 ahk 后输入终止符, 例如 空格, . 或 Enter).
注意:与热键不同,热字符串单行写法不支持命令。
第二种多行写法(或者叫标准写法):两个双冒号包围字符串,换行写功能,最后以return结束:
::ahk::
Send AutoHotkey
Return
注意:命令必须放在热字串的下面。
三、终止符
除非使用了星号选项, 否则您必须在热字串的缩写后输入 终止符 才能触发它. 终止符最开始由以下内容组成: -()[]{}’:;”/\,.?!`n `t(注意 `n 是 Enter, `t 是 Tab, 且在它们之间还有一个原义的空格). 可以通过编辑下列的示例来更改这个字符集合, 这个例子中为 所有的 热字串设置新的终止符, 而不仅是在它下面的那些.
#Hotstring EndChars -()[]{}:;'"/\,.?!`n `t
[v1.1.28+]: 当脚本运行时通过调用 Hotstring() 函数, 可以更改结束字符, 正如下面文档所述:
Hotstring("EndChars", "-()[]{}:;")
四、执行选项
可以使用下面的两种方式改变热字串的默认行为:
#Hotstring 指令, 它会影响脚本中实际在它后面的所有热字串. 下列示例会让 C 和 R 选项生效: #Hotstring c r.
把选项放在热字串的第一个双冒号之间. 下列示例会让 C 和 * 选项(区分大小写且 “不需要终止符”) 对当前热字串生效:
:c*:j@::john@somedomain.com.
下面列表中对每个选项进行说明. 当使用上面的方法指定多个选项时, 可以在选项间包含空格.
*(星号): 不需要终止符(即空格, 句点或回车) 来触发热字串. 例如:
:*:j@::jsmith@somedomain.com
上面的示例会在您输入 @ 字符时立即进行替换. 如果在 #Hotstring 指令中含有此选项, 那么可以使用 *0 来关闭它.
?(问号): 即使此热字串在另一个单词中也会被触发; 即, 在字符串被混排前立即输入字符. 例如, 如果 :?:al::airline 为热字串, 那么输入 “practical ” 会得到 “practicairline “. 使用 ?0 来关闭此选项.
B0(B 后跟着零): 不进行自动退格来擦除您输入的缩写. 关闭此选项后可以使用 B 来启用. 脚本还可以通过 {bs 5} 实现自己的退格, 这里发送 5 次 Backspace. 同样地, 可以通过 {left 5} 发送 5 次 ← 的键击. 例如, 下面的热字串产生 “<em></em>” 并把光标向左移动 5 个位置(这样它就在标签之间了):
:*b0:<em>::</em>{left 5}
C: 区分大小写: 当您输入缩写时, 它必须准确匹配脚本中定义的大小写形式. 使用 C0 可以关闭区分大小写的特性.
C1: 不遵循输入的大小写形式. 使用此选项可以让自动替换热字串不区分大小写且阻止它们遵循您实际输入字符的大小写形式. 遵循大小写形式的热字串(这是默认状态) 会在您输入的缩写都为大写时产生大写形式的的替换文本. 如果您的输入的首字母为大写, 那么替换的首字母也会为标题格式(大写, 如果首个字符是字母). 您按其他任何大小写形式输入时, 替换会准确按照定义进行发送. 如果在 #Hotstring 指令中含有此选项, 那么可以使用 C0 来关闭它, 这样可以让热字串重新遵循大小写.
Kn: 按键延迟: 这个非常少用的选项设置在自动退格或自动替换产生的键击之间的延迟. 给 n 指定新的延迟; 例如, 指定 k10 来设置 10 ms 的延迟而 k-1 则取消延迟. 此选项的实际效果取决于当前生效的发送模式:
- SI(SendInput): 由于此模式是没有延迟的, 所以按键延迟会被忽略. 例外是当 SendInput 不可用时, 此时热字串会恢复到下面的 SendPlay 模式(它会遵循按键延迟).
- SP(SendPlay): 默认延迟为零, 这对于 SendPlay 相当于 -1(没有延迟). 此模式中, 这个延迟实际是按住时长而不是键击之间的延迟.
- SE(SendEvent): 默认延迟为零. 在大多情况下建议使用零的延迟, 因为这样快速且与其他进程配合比较好(由于会内部执行 Sleep 0). 指定 k-1 则不使用延迟, 这样可以在您 CPU 经常高负荷运行时让自动替换更快速地进行. 设置为 -1 时, 脚本的进程优先级会成为键击发送速度的重要因素. 要提升脚本的优先级, 请使用 Process, Priority,, High.
O: 进行替换时忽略自动替换热字串的终止符. 它可以用于当您希望使用终止符让热字串保持清晰, 却不希望终止符显示在屏幕上的时候. 例如, 如果 :o:ar::aristocrat 为热字串, 那么输入 “ar” 后跟着空格键会产生不含尾随空格的 “aristocrat”, 这样可以让您在不需要 Backspace 的情况下补上单词的复数或所有格形式. 使用 O0(字母 O 后跟着零) 来关闭此选项.
Pn: 字符串的优先级(例如 P1). 这个非常少用的选项对自动替换热字串没有效果.
R: 发送替换文本的原始文本; 即准确地按照原样发送, 而不把 {Enter} 转换成 Enter, 把 ^c 转换成 Ctrl+C, 等等. 此选项在含延续片段热字串中自动生效. 使用 R0 来关闭此选项.
注意: Text 模式可能更可靠. R 选项和 T 选项是相互排斥的.
SI, SP 或 SE [v1.0.43+]: 设置自动替换热字串发送键击的方法. 这些选项是互相排斥的: 每次只会有一个生效. 下面对每个选项进行说明:
- SI 表示 SendInput, 它通常比其他模式拥有较好的速度和可靠性. 另一个好处是和下面的 SendPlay 一样, SendInput 会在热字串自动替换文本时会延迟您输入的内容. 这样避免了您的键击穿插到替换的内容中. 当 SendInput 不可用时, 热字串会自动使用 SendPlay。
- SP 表示 SendPlay, 它可以让热字串运行在更大范围的游戏中。
- SE 表示 SendEvent, 在比 [1.0.43] 早的版本中这是默认选项。
如果未使用上面的任何一个选项, 则在 v1.0.43 及更高的版本中默认模式为 SendInput. 然而, 与 SI 选项不同的是, 在 SendInput 不可用时会使用 SendEvent 而不是 SendPlay.
T [v1.1.27+]: 发送替换文本的原始文本, 不需要将每个字符转换成按键. 有关详情, 请参阅 Text 模式. 使用 T0 或 R0 关闭此选项, 或使用 R 覆盖它.
X [v1.1.28+]: 执行. 取代替换文本, 热字串接受一个命令或表达式来执行. 例如, :X:~mb::MsgBox 会在用户输入 “~mb” 时显示一个消息框, 而不是用 “MsgBox” 自动替换. 在定义大量热字串调用函数时, 这是最有用的, 否则每一个热字串就需要三行.
当使用热字串函数时, X 选项会导致 替换 参数被解释为标签或函数名, 而不是替换文本. 但是, X 选项只有在每次调用函数时才有这种效果.
Z: 这个非常少用的选项会在每次热字串触发后重置热字串识别器. 换句话说, 脚本将开始等待全新的热字串, 而不考虑您之前输入的任何内容. 这可以避免意外地触发字符串. 为了进行说明, 请思考下面的字符串:
:b0*?:11::
SendInput xx
return
由于上面没有使用 Z 选项, 所以输入 111(三个连续的 1) 会触发热字串两次, 因为中间的 1 既是首次触发的 末尾 字符, 又是第二次触发的 起始 字符. 在 b0 前面加上字母 Z 后, 您必须输入四个 1 而不是三个才能触发热键两次. 使用 Z0 来关闭此选项.
::/mail::gmail@gmail.com
;←分号开始表示这一行是注释,AHK 是不会执行的。这个语句和热键的定义很类似,注意前面多了两个分号。
::/gs::
clipboard = 煎蛋娱乐有限公司
;把文字发送到剪贴板(Clipboard)
Send ^v
;Send 也是很常用的命令,表示向当前程序发送按键,根据上一篇快餐店文章我们可以推断,这句命令是向当前程序发送 Ctrl + V(粘贴的快捷键)。也就是把已经发送剪贴板的文字粘贴出来。
return
;代表这一小段程序的结束。像上面只有一行的代码是不需要 return 命令的
::/dd::
d = %A_YYYY%-%A_MM%-%A_DD%
;获得系统时间比如今天的时间:2007-10-21。如果需要“年”的话请替换上面的“-”。
clipboard = %d%
;把 d 的值发送到剪贴板,变量是不用声明的,想引用变量的值,就在变量的前后加“%”。第二行的变量是 AHK 自带的变量。
Send ^v
return
五、趣味案例
粘贴复制,进化——热字符串,热字符串节省了复制粘贴的过程,再进化——带有理解能力的热字符串,今天就给大家展示一下这个魔性的操作和实现!
魔性操作
复制下面一段话,粘贴的时候自动转化为新的样式并自动添加信息!
名字: 河许人
问题: 需要帮助
解决: 帮助他们
总结: 问题得到解决
转化后的信息
名字: 河许人
日期:20180222110213
QQ:1083519055
问题: 需要帮助
解决: 帮助他们
更新: 问题得到解决
下面是实现代码
:*:temp::
RegExMatch(Clipboard, "`n)名字: (.*)`n问题: (.*)`n解决: (.*)`n总结: (.*)", Match)
Clipboard =
(
名字: %Match1%
日期:%A_Now%
QQ:1083519055
问题: %Match2%
解决: %Match3%
更新: %Match4%
)
Send, ^v
使用方法:首先选择(Ctrl+c)要魔法的一段话(注意当前脚本中只支持这个格式),然后在需要生成的地方输入temp就会生成转化后的信息,其实这只是一个引子,欢迎大家一起来脑洞!
六、拓展推荐
笔者基于这个原理,设计了影子输入法,仅供大家学习参考。