让wox支持autohotkey,实现用汉字词触发快捷操作~

wox,
见小众软件:

是一款类似utools,火柴,listray……的软件。

wox的优点在于可以自定义针对某一关键词的快捷键。
比如设置快捷键 ALT+B ⇒ “bd ”,
只用按下alt+b就可以进行百度搜索了,而不用像其他几个同类软件一样,还得手动输入“bd ”

背景介绍完毕。
第一步,我设置了快捷键:ALT+空格 ⇒ “ahk ”
第二步,启用ahk,代码如下:

Enter::
{
IfWinNotActive, ahk_exe wox.exe
{
    send,{Enter}
}
IfWinActive, ahk_exe wox.exe
{
    send , +{Home}
    sleep, 20
    send, ^c
    send, {Enter}
    Switch Clipboard
{
case "ahk 小众软件":{
    send , {esc}
    run www.appinn.com
    return
}
case "ahk 自定词句":{
    send , {esc}
    /* 
    自定命令
    */
    return
}
Default:
    send , {esc}
}
return
}
}
return

上述代码实现了输入“小众软件”,通过ahk打开www.appinn.com
通过添加不同的自定词句,以及不同的命令,可以实现更多的可能。

GIF 2021-8-7 15-37-24
【如图,按下atl+空格,启动已经预先输入了“ahk ”的命令框,此时输入自己的命令,按下回车,启动对应ahk指令】

3 Likes

老哥,可以研究一下这个方案吗? CLaunch之美 - 知乎 (zhihu.com)

我觉得可以用来平替Quicker

1 Like

在大佬的基础上重写了一下:

  • 把自定义文本、自定义命令存在数组里了,方便修改;
  • 兼容单行文本、多行文本、自定义命令;
  • 改用if判断,先判断触发词,再进循环逐一比对;
  • 执行完毕后恢复原剪贴板内容。

使用方法:

  • 在wox输入框中输入ahk +自定义命令(注意ahk后有空格),触发数组中对应的文本或命令
  • 例如,输入ahk doc则执行OpenAHKDoc函数跳转到文档网站

问题:

  • 是否有可能结合wox添加自动补全自定义命令的插件?
  • 大量条目下循环比对的速率问题?

代码如下:

; wox自定义指令 - by @dog, @Azona77 - https://meta.appinn.net/t/topic/25130
SetTitleMatchMode, 3
#IfWinActive  Wox ahk_exe wox.exe
$Enter::
{
    ; 记录原剪贴板内容
    ClipboardOld := ClipboardAll
    ; 复制当前行
    send , {End}
    send , +{Home}
    send, ^c
    send, {End}
; ==============================
; 定义数组,存放匹配规则和对应的文本
; 分行定义数组语法详见 - https://www.autohotkey.com/boards/viewtopic.php?t=66878
array := {"ten": "10"
    ,"example1": Func("OpenAHKDoc")
    ,"example2": "单行文本案例"
    ,"example3": "多行文本案例 - 使用``n分隔`n这是第二行"
    ,"example4": "
(
多行文本案例 - 直接粘贴至括号内,注意缩进
- 这是第二行
)"
    ,"doc": Func("OpenAHKDoc")
    ,"CustomFunc": Func("ActionExample")
    ,"New command": "aa"}

; 定义要触发的函数
OpenAHKDoc() {
    run, https://wyagd001.github.io/zh-cn/docs/Hotkeys.htm
}
    
ActionExample() {
    tooltip, You selected Example!, 1000
    ; 这里可以添加其他需要执行的代码
    sleep 1000
    tooltip
}
; ==============================

If (InStr(Clipboard, "ahk ") = 1)
    {
        ; 如果是ahk开头,则将剪贴板内容的第五个字符开始(即除去前四个字符)赋值给新变量
        TriggerWord := SubStr(Clipboard, 5)

        For key, value in array
        {
            ; 修剪剪贴板内容的前后空白字符
            if (TriggerWord = key) {
                ; 判断value的类型
                if (IsFunc(value)) {
                    ; 如果value是函数,则调用它
                    send, {esc}
                    value.Call()
                    ; 恢复剪贴板内容
                    Clipboard := ClipboardOld
                    return
                } else {
                    ; 否则,将value作为文本发送
                    send, {esc}
                    Clipboard := value
                    send, ^v
                    return
                }
            }
        }
    Clipboard := ClipboardOld
    Send, {Enter}
}
Clipboard := ClipboardOld
Send, {Enter}
}
return

1 Like

这个相当于变相实现了wox插件的功能吧

1 Like

比wox插件要轻量吧?wox插件得再回来调用ahk(前提是要用ahk相关的功能,不然直接写对应wox插件就行了)
而且直接在ahk中实现也方便配置和迁移