这次没有带lib,之后四个套件合并发布的时候带着lib一起
序言:这个工具做啥的?
首先看一张图
这是eme,这个工具的作用就是快速在选定的工作区内搜索文件然后使用当前的编辑器快速打开这个文件,让原本没有自带快速打开功能的编辑器也能完成快速打开,全局编辑器增强,当然不仅仅是适用于ahk,其他的语言文件一样可以预览和打开
1. 缘起
vscode按下^p可以快速切换文件这个功能实在是很舒服,但是scite等编辑器没有,所以决定做一个脚本来变相实现这个功能
演示vsocde的效果
2. 致谢
感谢zzz大佬的超级命令管理器,以及僵尸大佬本地化修改超级命令管理器的创意,站在大佬的肩膀上,这个工具实际上就是超级命令管理器的分支版本
3.功能特点
1. 支持自定义编辑器
只在编辑器内触发,比如我定义 了scite,np3等没有自带文件管理器的编辑器
2.预览文件
vscode自带的这个功能是不能进行预览的,但是这个可以进行预览
3. 跳转文件管理器打开
支持自定义打开的文件管理器
4. 代码快速上屏或者复制
5.支持自定义工作区,搜索的文件内容来自工作区
这个功能就是类似代码片段的管理的使用了,也就是说可以仍旧当作代码片段的管理器
功能演示scite
np3
eme
4. 下个版本加入的特性
vscode自带一个挺不错的文件管理器在侧面,vim这样的也可以通过插件来装上一个这样的功能,但是有些编辑器就是没法原生实现的,所以我在下个版本中打算做一个ahk的实现方案
5.功能联动
之前是做了一个多编辑器跳转工具的,之后我制作的所有编辑器相关的工具将集成在一个汇总工具上进行发布
整体工具暂时命名为ahk编辑增强套件,由多个组建构成
6. 多个编辑器中的实际使用体验示例
7. 源码
/* 参照vscode的^p设计的全局功能
可以实现在np3,scite,eme等没有自带资源管理器的编辑器中实现以下功能
1. 快速打开工作区中文件
2. 快速打开历史文件
3. 生成一个类似vscode的文件管理页面,查看设置的工作区内文件
4. 支持首字母快搜
5. 支持预览文件
*/
;*************************************使用功能的编辑器组***********************
GroupAdd, editorall,ahk_exe Notepad.exe
GroupAdd, editorall,ahk_exe SciTE.exe
GroupAdd, editorall,ahk_exe EmEditor.exe
;************************************* ***********************
;相信会用这个工具的大兄弟都会自己修改源码的,所以我懒得做配置gui和ini了,全部提到开头自己改
;************************************* 一些参数 ***********************
指定编辑器路径 := "C:\AHK\SciTE\SciTE.exe"
指定文件管理器路径:="C:\SoftDir\totalcmd10.5_ez\TOTALCMD.EXE"
ahkPath:="C:\AHK\AutoHotkey.exe"
框体位置x := 1000
框体位置y := 400
框体位置w := 600
字号 := 16
字体 := "微软雅黑"
BackgroundColor := "ffc0cb"
TextColor := "666666"
Gtts := 0
workSpace:=["C:\AHK\Lib\","C:\HznCodeProject\WorkingScripts\"]
查看文件类型:="(ahk|txt)$"
;************************************* 一些快捷键 ***********************
Hotkey, IfWinActive, ahk_group editorall
Hotkey, ^p, 显示隐藏搜索框
Hotkey, if, (WinExist("ahk_id " MyGuiHwnd) && (Showstr))
Hotkey, Down, 下一条
Hotkey, Up, 上一条
Hotkey, Enter, 编辑脚本
Hotkey, ^v, 直接输入
Hotkey, ^c, 复制到剪切板
Hotkey, ^o, 打开文件路径
Hotkey, ^r, ahk运行
Hotkey, if
Hotkey, if, (WinExist("ahk_id " MyGuiHwnd))
Hotkey, if
;************************************* 不用动的 ***********************
; hlog(1,1,1)
#SingleInstance Force
#MaxMem 640
#KeyHistory 0
#Persistent
SetBatchLines -1
DetectHiddenWindows On
SetWinDelay -1
SetControlDelay -1
SetWorkingDir %A_ScriptDir%
FileEncoding UTF-8
CoordMode, ToolTip, Screen
CoordMode, Caret , Screen
ListLines Off
#Include %A_ScriptDir%
#Include <py>
#Include <utility>
#Include <btt>
#Include <fileplus>
MyFile := New FilePlus
OnMessage(0x020A,"Mouse_MButton_W1")
OnMessage(0x0201,"Mouse_LButton_D1")
HpTip =
(
显隐搜索框`tCtrl Shift Enter
-----------------------------------
选择条目`tUp/Down
输出到输入框`tCtrl v
复制到剪切板`tCtrl c
直接编辑器打开脚本`tEnter
打开脚本目录`tCtrl o
-----------------------------------
隐藏搜索框`tEsc
重启脚本`tAlt r
-----------------------------------
从其他地方复制文本后,打开搜索
框,以“+”开头并补全提示的路
径在目标位置新建脚本文件
)
BttStyle := {Margin:10 ; If omitted, 5 will be used. Range 0-30.
, TabStops:[50, 80, 100] ; If omitted, [50] will be used. This value must be an array.
, TextColor:0xff999999 ; ARGB
, BackgroundColor:0xff010101 ; ARGB
, Font:"微软雅黑" ; If omitted, ToolTip's Font will be used. Can specify the font file path.
, FontSize:18 ; If omitted, 12 will be used.
, FontRender:5 ; If omitted, 5 will be used. Range 0-5.
, FontStyle:"Regular"}
;*******************************************************
;************************************* 重点修改***********************
更新文件列表:
Dir_File_All := {}
Dir_File := []
arr:={}
for k,v in workSpace{
loop Files, %v%\*.*, R
{
if regexmatch(A_loopFilePath,查看文件类型)
FileList .=A_LoopFilePath "`n"
}
}
FileList := Trim(FileList, "`n")
Sort, FileList
loop Parse, FileList, `n, `r
{
SplitPath, A_LoopField,name,dir
FileJP := py.initials_muti(name)
FileQP := py.allspell_muti(name)
Dir_File[1] := FileJP FileQP name
Dir_File[2] := name
arr["" name ""]:=A_LoopField ;引入一个辅助数组以名字作为key来索引全路径
Dir_File_All["" A_LoopField ""] := Dir_File
Dir_File := []
}
Btt(HpTip, 0, 0, ,"BttStyle")
SetTimer, MoveBtt, -2000
return
对比:
ControlGetText, 检索内容, , ahk_id %SSK%
SetTimer, 搜索脚本, -10
return
搜索脚本:
Showstr := ""
Showarr := {}
For k,v in Dir_File_All
{
if InStr(v[1], 检索内容)
Showarr.Push(v[2])
}
For Showstrk,Showstrv in Showarr
{
Showstr .= "|" Showstrk " " Showstrv
n := A_Index
}
Showstr := (检索内容) ? Showstr : ""
更新List(Showstr)
return
choosestr:
Gui, ss:Submit, NoHide
arrKey:=RegExReplace(command,"\d\s+")
Add_Script_Path :=Bttstr :=Script_Path_Long:=Script_Str := ""
ControlGetText, 检索内容, , ahk_id %SSK%
Script_Path_Long := arr[arrKey]
FileRead, Script_Str, % Script_Path_Long
Bttstr := RegExReplace(Script_Str,"m`a).{100}", "$0`n")
Bttstr :=Script_Path_Long "`n" Bttstr
Gtt()
GttPos := Btt(Bttstr, 框体位置x + 框体位置w + 5, 框体位置y, ,"BttStyle")
return
更新List(ListStr := "") {
global
GuiControl, ss:, Command, % (ListStr) ? ListStr : ""
ListN := ((n < 15) ? n : 15) * 30
ListN := !(ListStr) ? 0 : ListN
GuiControl, ss:Move, Command, % "h" ListN
ChooseRow := 1
GuiControl, ss:Choose, command, % ChooseRow
gosub choosestr
Gui, ss:show, AutoSize
if !(ListStr) {
Gtt()
Btt()
GuiControl, ss:, Command, |
; Btt(HpTip, 框体位置x + 框体位置w + 5, 框体位置y, ,"BttStyle")
}
}
;************************************* 重点修改***********************
显示隐藏搜索框:
WinGet,ed1, ProcessName,A
WinGet, editorPath, ProcessPath,A
SetTimer, MoveBtt, Off
if (WinExist("ahk_id " MyGuiHwnd))
{
Gui, ss:Destroy
Btt()
Gtt()
return
}
Gui, ss:Margin, 0, 0
Gui, ss:-Caption +Border
Gui, ss:+AlwaysOnTop -DPIScale +ToolWindow +HwndMyGuiHwnd +E0x02000000 +E0x00080000
Gui, ss:Font, s%字号%, %字体%
Gui, ss:Add, Edit, g对比 v搜索框 HwndSSK w%框体位置w% -E0x200
Gui, ss:Font, s%字号%, %字体%
Gui, ss:Add, ListBox, hwndLIST h0 vCommand -HScroll -E0x200 w%框体位置w% gchoosestr
GuiControl, ss:Move, Command, h0
ControlColor(SSK, MyGuiHwnd, "0x" BackgroundColor, "0x" TextColor)
ControlColor(LIST, MyGuiHwnd, "0x" BackgroundColor, "0x" TextColor)
Gui, ss:show, AutoSize x%框体位置x% y%框体位置y%
; Btt(HpTip, 框体位置x + 框体位置w + 5, 框体位置y, ,"BttStyle")
return
下一条:
ChooseRow := (ChooseRow < n) ? ChooseRow + 1 : ChooseRow
GuiControl, ss:Choose, command, % ChooseRow
Sleep 50
gosub choosestr
return
上一条:
ChooseRow := (ChooseRow > 1) ? ChooseRow - 1 : ChooseRow
GuiControl, ss:Choose, command, % ChooseRow
Sleep 50
gosub choosestr
return
ssGuiEscape:
ssGuiClose:
gosub Gui_Destroy
return
Gui_Destroy:
Btt()
Gtt()
Gui, ss:Destroy
return
直接输入:
Clipboard := ""
gosub Gui_Destroy
Clipboard := Script_Str
ClipWait, 2
Sleep 100
Send, ^v
return
复制到剪切板:
Clipboard := ""
gosub Gui_Destroy
Clipboard := Script_Str
ClipWait, 2
return
ahk运行:
gosub Gui_Destroy
Run,%Script_Path_Long%
return
编辑脚本:
; Run, %指定编辑器路径% %Script_Path_Long%
gosub Gui_Destroy
Run, %editorPath% %Script_Path_Long%
sleep 200
if (ProcessName="SciTE.exe")
WinActivate ahk_exe SciTE.exe
return
打开文件路径:
SplitPath,Script_Path_Long, , sPath
Run,%指定文件管理器路径% %sPath%
gosub Gui_Destroy
return
MoveBtt:
btt()
return
Mouse_MButton_W1(wParam, lParam, msg, hwnd){
global
if (A_Gui = "_BTT1") && (Gtts = 1){
Btt()
Gtt_T := (Bttstr) ? Bttstr : Add_Script_Path
Gtt(Gtt_T, 框体位置x + 框体位置w + 5, 框体位置y, GttPos["w"], GttPos["h"])
}
}
Mouse_LButton_D1(wParam, lParam, msg, hwnd){
global
PostMessage, 0xA1, 2
KeyWait, LButton
WinGetPos, w_x, w_y, w_w, w_h, ahk_id %MyGuiHwnd%
框体位置x := w_x, 框体位置y := w_y, 框体位置w := w_w
return 0
}
#If (WinExist("ahk_id " MyGuiHwnd) && (Showstr))
#If
#If (WinExist("ahk_id " MyGuiHwnd))
#If
Gtt(Gtt_Text := "", Gtt_x := "", Gtt_y := "", Gtt_w := "", Gtt_h := ""){
global
if !(Gtt_Text)
Gui, Gtt:Destroy
else {
Gui, Gtt:Destroy
Gui, Gtt:Margin, 0, 0
Gui, Gtt:-0x400000 +Border
Gui, Gtt:+AlwaysOnTop -DPIScale +ToolWindow +HwndGttHwnd +LastFound
Gui, Gtt:Font, s14, 微软雅黑
Gui, Gtt:Add, Edit, HwndGttEdit -E0x200 +Multi vGttEdit w%Gtt_w% h%Gtt_h%, % Gtt_Text
ControlColor(GttEdit, GttHwnd, "0x" BackgroundColor, "0x" TextColor)
Gtt_ww := Gtt_w - 20
Gui, Gtt:Show, NA x%Gtt_x% y%Gtt_y% w%Gtt_ww%
}
}