终于实现了任意输入模式下,按下快捷键录入 New/filename.txt 回车即可按照我想要的方式创建文件了!
其实我觉得这个还是很好的一个需求方向的,比如可以实现如下:
-
qq/”张三”,”你好吗?” 回车, →给张三发送qq消息”你好吗?”
-
bing/5 回车 →下载5张必应壁纸到选定文件夹中保存….
-
weaeher/3,tss 回车 →语音播报未来三天的天气情况…
-
listen/张学友,1 回车 →随机播放张学友的一首歌曲…
-
clock/5:00pm 回车 →下午5点闹钟…..
-
note/”明天上午到公司收拾人哈哈哈” 回车 → 新建便签,并提醒
-
…………………………………………………………………………..
我觉得….有趣多了,是动态的执行,不是死的,全靠想需求….你们觉得呢?
CapslockMagic中提到了一种猴子输入模式,存在着该模式下输入的内容的无法进行修改和删除.
故而寻找解决办法,
经过分析发现:
InputHook中onchar里面的input buffer是无法进行更新的!
故而, 只能另起炉灶.而这种方式是柚子输入法或影子输入法里面使用的逐个字符上屏的方式,简单的利用就可以为自己所有!
具体详细介绍有文章: 灼雪|十二个小时写一个属于你自己的输入法
这样,我也就将onchar和onend都注释掉,对backspace退格键在inputhook进行启用并且定义其功用
最终实现我想要的一个需求:
输入 new/file.name.txt 即可创建文件.这种方式是等待所有内容录完之后按结束键执行!
(AHK下的这种方式有一个缺陷是开始菜单里面是无法录入直接内容的)
使用这种原理即可是实现: 关键字/args , 匹配关键字关联的函数调用,并将args文本内容传入执行!
(这个也是之前在论坛上面问, 也没有人回答的需求,影子输入法里面现在也不支持这个功能)
具体相关代码如下:
加上B是的Backspace在input模式下可用
text := InputHook("B","{enter}{ESC}") ;回车或ESC结束输入,我这里没有matchlists,如果有需要,自定义短语集合匹配也是可以的
条件模式下激活Backspace的功能,逐个字符删除!
global n:=1 #IF (!MODE)&&text.InProgress;激活的条件还判断hook模式已经结束没有 backspace:: { if (n>1&&textinput=="") Return else textinput := SUBSTR(textinput,1,-1) n+=1 if (textinput=="") text.Stop() ;自动退出特殊输入模式 else Tooltip(extinput, a_caretx +10, A_CaretY +20) Return } #IF
条件模式下,逐个条件字符上屏!
Textinput := Textinput . A_Thishotkey Tooltip(Textinput, A_Caretx +10, A_Carety +20) Return #if
调用的函数,当输入完成之后,执行相关功能,可用是自定义短语或命令集,或者我这种传入参数内容执行更加灵活和方便吧
enterhook(ih) { tooltip "?" textinput := "" ;每次开始前清空上次输入 ih.start() ih.wait() ih.stop() if (textinput~="new" . fkey . "(.*?)") && (text.EndReason) ;已经完成输入 { ;eg, fkey:"'" 或者/ new/filename.txt new'filename.txt Tooltip Gtext := StrSplit(textinput, fkey)[2] NameRule:=StrSplit(Gtext,".")[1] FileType:="" if StrSplit(Gtext,".")[2]!="" FileType := "." StrSplit(Gtext, ".")[2] textinput := "" ;清空本次输入 MyFolderFileCreate(PathANDruleGET(), NameRule, FileType) Return } SetTimer RemoveTip, -500 }
最后再适配一个合适的tooltip外观, 效果还是不错的,比如:
进一步的可以优化,left,right的光标位置来调整删除字符………..待优化中
还有移动tooltip这个可以实现的:
OnMessage(0x201, "WM_LBUTTONDOWN") ;添加鼠标拖动tooltip的效果
以上代码不够好, 还需要完善优化,不过大致满是个人需求了
?赞噢,这个输入法功能进化后,更像终端命令行了(Cmd/ PowerShell / Terminal),只需配置终端文件 alias。