AHK程序设计「河许人」Autohotkey

[AHK随笔] AHK中的一大败笔,一不小心就出错。

2018-12-10  本文已影响7人  d61f25068828

之前我为iThoughts(思维导图工具)设置了,一键打出MarkDown标题的热键,因为我常用的标题一共有6级,所以我之前是这么写的。

原本的设计以及缺陷

; ## 一键打出 标题一
^!u::
SendByClip(ReplaceiThoughtsMarkDownTitle(1))
return

; ## 一键打出 标题二
^!i::
SendByClip(ReplaceiThoughtsMarkDownTitle(2))
return

;以此类推,一直到标题六。因为篇幅所限,没必要列出。

但是后来我发现,其实“一键打出MarkDown”格式字符串,在很多的编辑器中都是用得到的。如果是单纯的复制,改改,确实可以用,但是会造成程序的可维护性下降,之后不好升级和排除错误。所以准备把这个功能进一步的封装一下,提高可维护性。

改造过程中出现错误

为了实现这一目标,我打算先在简单例子上试验。

theKey:="^!u"
theFunObject:=Func(println).Bind(1) 
Hotkey,% theKey,% theFunObject

这个代码的意思是,使用变量theKey中的键,注册函数对象theFunObject。如果这一步成功了,我就可以把它改造成数组,那么这个例子就完成了。

结果运行起来之后,却出现以下报错:

Error:  Nonexistent hotkey.

Specifically: ^!u
第一次尝试出现Error

依据Error提示排查,却发现对应参数并没有问题

根据提示,首先怀疑参数 KeyName “^!u” 填错了,所以翻阅了帮助文件,但发现并没有;然后我不通过“theKey”,直接以传统的形式填上“^!u”,还是提示错误,这就很想不通了,因为改造之前也是用的这个形式,完全没有问题,那么只有一个可能性就是“问题不在KeyName”。

好在,之前就发现HotKey的报错是有些问题的,当使用函数对象时,出现“Error: Nonexistent hotkey.”,可能意味着是函数对象的错误,但当时我并不确定。因为我是在一个新的环境中应用HotKey,我不清楚是其本身的问题还是在那一场景下的特殊问题。

[基础] AHK函数对象系列-绑定方法对象v3

问题终获解决

沿着这个思路看一下,果然是我粗心大意,填写字符串时忘记加双引号,从而导致“函数对象”无效,进而导致“HotKey”报错。

针对该问题的三个反思

之所以这个错误,难以排查,主要的原因就是三个。

#Warn提示

应对问题的三个方案

向AHK作者报告程序BUG.

AHK本身的设计错误很难通过其他方法避免,应尽快向AHK作者报告这一问题。

封装自己的Func函数

Func函数的设计实在太烂,不仅对象没有创建成功不会抛出异常,而且bind漏填了关键参数,都不会抛出,这种烂货也是没有留下的必要了。

找个更好的DeBug工具

找个DeBug的工具替代SciTE4AutoHotkey的DeBug模块,以便在DeBug下可以愉快使用#Warn。当然最好的是找到一个既支持高亮又支持DeBug的编辑器,但不排除DeBug和编辑工作分离的可能性。我看帮助文档上列出了不少,应该总有一款能合适吧。

End

心如止水是Java/AHK的持续学习者,很欢迎您来和我探讨Java/AHK问题。 QQ:2531574300 ^_^

AHK版本:1.1.30.00

文章版本信息

v1

更多文章

[专栏] AHK程序设计 - 简书(优先持续更新)

[基础] [GIF动图] 绕过中文输入法发送文本的3种方法

[基础] AHK函数对象系列-绑定函数对象

[基础] AHK函数对象系列-绑定方法对象

[基础] 在AHK中实现函数重载的效果

[基础] 在AHK中实现函数重载的效果

版权声明:

该文章版权系“心如止水”所有,欢迎分享、转发,但如需转载,请联系QQ:2531574300,得到许可并标明出处和原链接后方可转载。未经授权,禁止转载。

作者:心如止水
上一篇 下一篇

猜你喜欢

热点阅读