AutoHotKey 莫名知识点拾遗(12 Tips in)

1、前缀和组合键的效果并不一样

LAlt & RButton<!RButton 之间并不画等号,简言之,如果涉及功能键,优先选用前缀,否则效果可能略差

2、有些空格真的不能加

比如函数名和后面参数的小括号之间,就不一定不能有空格,否则报错 "Return's parameter should be blank except inside a function",英文渣表示查询一番才搞明白

3、编辑前先看编码

AHK 文件里如果有中文,需要用 GB2312 编码(GBK 似乎也行),但是某些编辑器,对,说的就是 VS Code,默认用 UTF-8 打开,我就是因为这个丢掉了 WinSize 的全部注释。不过新版 VS Code(貌似)修复了这个问题。但是编辑前先确认一下编码还是极好的。

4、多层对象要用小括号计算

一般我们用 Object.key.subkey 来提取多重对象里的值,但是在 AHK 里面,额,我们需要用到小括号 (Object.key)["subkey"],文档中描述是先计算前面,再计算后面(废话,小括号的作用不就是这个么,啊喂ヽ(●-`Д´-)ノ?!

但是重点在于计算,所以在 AHK 里面, Object.key 不像别的语言里是一个类似指针的变量而是一个计算式。所以呢,%Object.key% 这种写法也是不存在的,因为百分号标记的是变量,而不能是计算式。

5、写 ini 必须带目录

IniWrite, 123, config.ini, Section , Key 这个写法是不会产生任何效果的,但也没有报错,对于文件名部分文档中的说法是:

Filename:
.ini 文件名, 如果未指定绝对路径则假定在 A_WorkingDir 中.

但实际上你要这样写才行,所以上面那句说明就是呵呵哒

IniWrite, 123, %A_WorkingDir%\config.ini, Section , Key

6、数组分为两种

关联数组,其实就是 key 为数字的对象,不过这也基本符合其他语言中数组的特性,并没什么槽点,槽点还在上面,取其中的某个元素是计算,是计算……

伪数组,根本就不是数组,只是可以自己构造有规律的变量名而已,就是一组变量。所以多维数组可以写成 Array%j%_%k% 中间的下划线十分出戏。

但是这部分语法非常之混乱,一般的,是没人想去认真研究他们的。我的建议是,好好用对象吧,嗷

7、索引从 1 开始

就是这么的特立独行,但是其实可以更改……更反人类(额,反程序猿

8、对象插入新属性(有误,看第九条

标准做法是 Object..Insert( key, value ),你看,你提供方法,我使用,这不挺好么,但实际上,如果不涉及变量还好,当 keyvalue 是变量时,可能并不能如你所愿,我按照文档反复写了几次也无法理解。只好十分蛮横的使用 Object[%key%] := value 来实现。

9、字符串和变量名之殇

AHK 并没有明确的变量类型。

这句话敢这么堂而皇之的说出来已经足够让人吐槽了。字符串无需加引号,倒是在计算中经常需要用百分号来标识变量,这语法已经是逆常识而行了。

但是到了对象,用法又有变化:Object.key 或者 Object["key"] 中的 key 当做字符串理解,而需要用到变量的时候是 Object[key] 而并不是 Object[%key%]

上面这句话我大概掉坑里二十余次,反复遍历对应才得出来经验。

10、对象中键(key)的排序

CSS 写多了,喜欢称键为属性。所以本帖中如有类似情况,自行理解,我就不逐一校正了。

一般的,各种语言中,虽然可能不承认(因为存在特殊情况),但是你设置的键的顺序,就是遍历时候的顺序,但是在 AHK 中,我们很厉害的按照英文字母排序。

这导致我遍历对象写出的 ini 文件可读性非常差,虽然分了节

11、代码的折行

挺常见的操作,比如我们写一个结构略复杂的对象,一般会采用类 CSS 的写法:

Object {
    a: "喵",
    b: "汪"
}

非常清晰明了的写法,但是在 AHK 里,对不起,这样操作会被报错。我们的写法应该是:

Object { a: "喵"
    ,b: "汪" }

以 “and”, “or”, ||, &&, 逗号或句点开始的行会自动合并到其前一行(在 v1.0.46+, 除了 ++ 和 – 外其他所有的表达式运算符开头的行也会如此).

反正也算勉强断行,可以添加注释了吧

12、正则匹配汉字

想匹配中文,网上找的办法好像不起作用,这就十分尴尬。最后发现文档中语焉不详的 Unicode 字符属性 是个神器。

只要写 、p{Han} 就可以匹配汉字了,十分方便。于是深入研究了一下:

Unicode Property 描述 Unicode 字符的属性,.NET、Java、PHP 和 Ruby(限 1.9 以上版本)中可以使用 Unicode Property。

Unicode Block 描述 Unicode 字符所在的区间,其特征是名称以 In 或 Is 为前缀,.NET 和 Java 中可以使用 Unicode Block。

Unicode Script 描述 Unicode 字符所在的书写系统,名字类似 Unicode Block,但没有 In 或 Is 前缀,PHP 和 Ruby(限 1.9 以上版本)中可以使用 Unicode Script。

无论 Unicode Property、Unicode Block、Unicode Script,其对应的排除型字符组都是将开头的\p 改为\P,其它不变。

在我的尝试中应该是不支持 Unicode Block ,如果你发现支持,麻烦写个例子给我(理解能力差,必须看示例才能懂)。

然后匹配日语的话是:[\p{Han}\p{Hiragana}\p{Katakana}]

匹配韩语: [\p{Han}\p{Hangul}]

匹配中日韩:[\p{Han}\p{Hiragana}\p{Katakana}\p{Hangul}]

其他的就不一一举例,总之,有了关键词,自己查询维基百科即可、

1 个赞

我讨厌AHK就因为它那见鬼的语法规范。

至今我只会短语替代。。。

也许,这里有很多地方我理解的并不对。但是,我的代码,就是这么一个坑一个坑摔出来的。现在遇到问题,读了文档也未必能解决,只能自己反复猜测,反复尝试,宛如盲人一样,用双手摸着地面往前爬行。

过去的经验居然大部分成了绊脚石……

所以到现在我还不会用数组……

变相说楼主太闲,举报了

:rofl: