最初思路来源于 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个按键则不判断输入状态,实现此功能