最初思路来源于 linxinhong/VimDesktop: 通过Autohotkey来VIM化桌面上大部分程序
AutoHotkey v2-beta 请使用 thqby/AutoHotkey_H 以避免某些问题。
- 完全自定义软件功能热键,并把命令做了分类(字母区分大小写就有
52个分类,还支持各种键盘符号,所以分类会更多),以Excel打比方- 对
值的处理,则用v前缀的功能,比如v12会自动在选中区域按顺序生成1-n的值,vab则生成A-Z的值 - 对
批注的处理,则用c前缀的功能,比如ce就是编辑当前批注,c.添加当前单元格内容到批注
- 对
- 基本上是按单键的组合方式,按下第一个键后,与它相关的热键会全部显示出来,减少了记热键的麻烦,并简化了过程(大部分功能按两个键即可)。
为什么大部分软件的热键都是带修饰键呢?是因为单键一般用来打字输入的。那
vimd用单键,不会出问题吗?见[[#智能]] - 支持对数字的处理:按命令前,智能判断
数字按键,比如我按100,vimd会记住这个数字到count,后面在执行命令的时候,代码里可以指定count如何使用(比如我可以用此方法快速跳转到第100行,或者此命令执行count次)
-
各软件都会分成两个模式
mode0相当于原生功能,除了会定义escape键来切换到mode1,这里需要优先处理原生的按键功能(比如当前在编辑Excel单元格,按键是想退出编辑,如果再次按键,才是切换模式)mode1是vimd的核心模式,核心在于[[#智能]]
-
各软件以
exeName区分制作插件。如果子窗口需要单独定义,则需要多次定义setWin,再分别定义热键,多个单按键组合,则每个按键都会由vimd拦截调度(比如va和vb都定义了功能,则按v,a,b都会被拦截,为了效率,一个按键定义一次即可,只要能拦截按键,逻辑都在vimd里处理),由于可能定义的功能太多,所以记录按键功能的对象,会以this.hotwin为key1,再以第一个按键作为key2进行二次分组。每个objDo都会记录 -
超级按键:
- 按下
keySuperVim后,会临时切换到mode1(同时会记录当前模式到modeBeforeSuper,并标记typeSuperVim=1),执行一次命令或取消后会切换回modeBeforeSuper。 - 按下另一类超级键如
{F5},会强制生效会临时切换到mode1,与上面方案的差异就是这种方式执行了两个动作,缺点是这个键在其他方面就完全失效了,全由vimd接管
- 按下
通过一个核心的判断函数,在每个按键按下时判断当前是否是可输入状态,如果是则输入,否则就执行命令,非常智能,如果不想要此功能,则不要定义对应函数即可。
比如在微信里,用mode1模式,
但是大部分光标在输入状态,vimd会智能识别到并直接send,而不是执行vimd命令,这是它智能的地方,
这时想执行vimd命令,有三种方式:
- 鼠标点击不能打字区域(不要为
输入状态),按vimd按键执行 - 按RControl临时转为强制vim模式(模式没增加,但是逻辑上不作输入状态判断了),再按vimd按键执行
- 直接把vimd功能设置为模式,第1个按键则不判断输入状态,实现此功能