之前我为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,我不清楚是其本身的问题还是在那一场景下的特殊问题。
问题终获解决
沿着这个思路看一下,果然是我粗心大意,填写字符串时忘记加双引号,从而导致“函数对象”无效,进而导致“HotKey”报错。
针对该问题的三个反思
之所以这个错误,难以排查,主要的原因就是三个。
-
首先,当然是HotKey有严重BUG,“函数对象”为空导致的错误,却提示 KeyName 参数错误。这个锅AHK是必须背的,已经坐实。
-
其次,Func函数本身存在严重问题,当其找不到参数中描述的对象时,居然没有任何异常抛出,也没有设置ErrorLevel为1,而是return 0。为今后的问题排查埋下了很大隐患。
-
最后,还是AHK老生常谈的“空变量”调用问题,这个可以通过#Warn解决,但是#Warn和SciTE4AutoHotkey的DeBug模式存在严重的兼容性问题,导致我忘记开启。如果当时开起来的话,应该会给出下列提示,这个问题可能就会发现得更早。
应对问题的三个方案
向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
更多文章
版权声明:
该文章版权系“心如止水”所有,欢迎分享、转发,但如需转载,请联系QQ:2531574300,得到许可并标明出处和原链接后方可转载。未经授权,禁止转载。
作者:心如止水
网友评论