文章目录
- 引言
- 理论
- 编程方案
引言
快捷键大家都不陌生.但是目前的快捷键普遍存在以下几个问题。
- 不统一,即word、ppt、浏览器、各种编辑器、邮件客户端等等,都有属于自己的一套快捷键。
- 快捷键冲突,即不同软件使用了相同的快捷键,而且作用域是全局的。
- 软件设计混乱,许多软件的快捷键设计并没有过多的思考,纯粹是给个按键让用用户使用,不考虑人性化问题。特别是一些软件为了避免快捷键冲突,设置一些反人类的三键触发。
- 自定义设计混乱,AutoHotkey的爱好者或者初学者不少,但是在设计快捷键的时候都和前面说的一样。想到一个功能,就找一个还没有用的快捷键组合来触发。久而久之,要嘛忘了快捷键和功能的对应关系,要嘛压根就忘了这个快捷键。
上述几个问题的现象我统称为“快捷键灾难”,包括快捷键饱和以及无组织结构的快捷键设计关系。
“统一各个软件的快捷键” 这个想法估计很多接触AutoHotkey的编程人员都有过。AutoHotkey中文社区里面的啊让在日记中便有所提及。
那么,使用AutoHotkey到底能不能统一大部分软件的快捷键,答案是肯定的,但是在代码工程上设计上需要有一定的技巧。
稍微了解过AutoHotkey的都知道,AutoHotkey可以在每个代码脚本的开头设置快捷键的软件作用域,即,该脚本的快捷键仅在指定的软件中使用。通过为不同的软件独立编写一个快捷键管理脚本,似乎也能达到我们所要的目的。但是很遗憾,这种方式实际操作起来不出5个软件,且在多次调整后,你就会忘了各个软件的快捷键之间的关系了。
理论
我的博士研究课题是关于假肢手的控制问题,即解决如何让假肢手知道人的控制意图。而解决该问题的思路有两种,第一 拓宽人机带宽,第二,提高假手的智能性。
这与快捷键设计有什么毛线关系吗,有的。快捷键本质上就是人如何控制电脑的问题。 电脑和假肢一样是一台机器。那么相应的思路一:增加人机宽带,有4种方案。
第一方案:物理层面上可以给电脑配备更多的按键,例如部分鼠标具有多个按钮就是一个典型案例,但是显然帮助有限;
第二方案:识别更多的人机交互组合,即增加按键的组合逻辑关系,也就是增加更多的快捷键,这是大部分人常用的。比如设置三键触发,冷门的按键等等。
这种方法由于使用了非优质快捷键,很容易在具体的使用中直接被习惯性的淘汰。
优质快捷键:指的是操作舒服的快捷键,特别是左手单独可以舒服触发的。例如 shift+w 或者 shift+e这类。(自己定义的,没有标准,存在个体差异)
第三方案:引入时间特征,例如按一次快捷键,二次快捷键触发不同的功能。就像摩斯码一样。 这种方式存在触发慢、触发不稳定、不自然等问题。
第四方案:有限状态机,常见于部分爱好者在方向键上的控制。就是把键盘字母分为 “文本输入” 和“控制命令”两种状态,通过修饰符在两种状态下进行切换,例如shift +alt 进行切换。 这种方案可以让已有的人机接口翻倍,多一个状态,就多一组人机接口。但是操作慢(个人觉得),记忆容易混乱。能够增加的带宽十分有限,原因仍在于优质快捷键本身不多。
那么,提高电脑的智能性便是唯一的选择和出路。
也就是说,在键盘不可变的情况下,在优质快捷键数量固定的情况下,要提高电脑的智能性。
提高电脑的智能性是什么意思?跟现在的AI有关系?还是? 其实没有那么高级,就是让你的电脑知道你当前操作的上下文是什么。还是不理解对不对,大白话来讲,就是让电脑知道你现在是在word软件还是在ppt软件, 如果是在ppt 软件, 你选中的是文本,还是选中的图片; 如果是在word里面,要知道你是否选了文字,选中的是单词,但是句子,还是段落。
编程方案
那么引言中所提到的编程技巧指的是什么?就是从编程角度说,我们是要面向快捷键编程、面向软件编程还是面向功能编程。答案是面向快捷键编程,为什么,因为快捷键是可数可列的,且优质快捷键就只有常用的那些; 而功能是无穷尽的,新的软件,新的需求,是无法穷尽的。前面提到的“快捷键灾难”就是因为大家是面向功能来设计快捷键而导致的。
那么什么是面向快捷键编程,可以看下面的代码。
$!r::
{
if func_在这个程序中(soft_东方财富)
{
SendInput ,96
SendInput ,{Enter}
return
}
if func_在这个程序中(soft_ahk编辑器)
{
ahkFuc_运行程序()
return
}
if func_在这个程序中(soft_python编辑器)
{
SendInput,^{Enter}
return
}
if func_在这个程序中(soft_edge浏览器)
{
func_个性化提示("刷新页面",1000)
SendInput,^r
return
}
if func_在这个程序中(soft_word软件)
{
func_个性化提示("已更新编辑域",3000)
SendInput,{F9}
return
}
if func_在这个程序中(soft_自用资源管理器)
{
SendInput,{F2}
return
}
return
}
这代码有什么特殊吗,其实就是在代码组织上是按照以下的是逻辑关系设计的。
快捷键——>不同软件——>不同软件元素1——>不同软件元素n——> 功能
而不是
不同软件——>快捷键——>功能
所以我把这个程序分为人机接口层(按键层),软件层,通用层。在代码组织上如下图:
图中的第一行、第二行脚本指的就是键盘第一行、第二行字母的快捷键。
--------------- 2023-09-30 未完待续 ---------------