Thank you for your interest. I don't have an editor script ready and tested, but here is a raw outline of a homemade
Code: Select all
#SingleInstance, Force
#NoEnv
AppName := "AHK Editor"
Filename := A_ScriptFullPath
CaretPos := 1
;-------------------------------------------------------------------------------
; Menu
;-------------------------------------------------------------------------------
Menu, SearchMenu, Add, Find ... `tCtrl+F, SearchMenu_Find
Menu, SearchMenu, Add, Find next `tF3, SearchMenu_FindNext
Menu, SearchMenu, Add, Replace ...`tCtrl+H, SearchMenu_Replace
Menu, SearchMenu, Add ; separator
Menu, SearchMenu, Add, Goto ... `tCtrl+G, SearchMenu_Goto
Menu, SearchMenu, Icon, Find ... `tCtrl+F, shell32.dll, 23
Menu, SearchMenu, Icon, Find next `tF3, shell32.dll, 23
Menu, SearchMenu, Icon, Replace ...`tCtrl+H, shell32.dll, 239
Menu, SearchMenu, Icon, Goto ... `tCtrl+G, shell32.dll, 177
Menu, MainMenu, Add, Search, :SearchMenu
;-------------------------------------------------------------------------------
Gui, Main: New, +Resize +MinSize +LastFound
;-------------------------------------------------------------------------------
Gui, Margin, 0, 0
Gui, Menu, MainMenu
Gui, Font,, Courier New
Gui, Add, Edit, w800 r25 vEDT_File hwndHandle -Wrap 0x100
SendMessage, 0xD3, 0x1, 8,, ahk_id %Handle%
Gui, Font
Gui, Add, StatusBar
SB_SetParts(110, 60)
SB_SetText(AppName, 1)
;-------------------------------------------------------------------------------
Gui, Goto: New, +OwnerMain -MinimizeBox, Goto
;-------------------------------------------------------------------------------
Gui, Add, Text, ym+4 w100, Goto line number:
Gui, Add, Edit, x+m ym vGotoLineNumber Right
Gui, Add, Button, x160 w80 Default, OK
;-------------------------------------------------------------------------------
Gui, Find: New, +OwnerMain -MinimizeBox
;-------------------------------------------------------------------------------
Gui, Add, Tab2, w280 h150 vTabControl gSelectTab Section, Find|Replace
;-----------------------------------
Gui, Tab, Find
;-----------------------------------
Gui, Add, Text, xs+10 ys+34 w100, Find what:
Gui, Add, Edit, x+m yp-4 w150 vNeedle_F
Gui, Add, Checkbox, xs+10 y100 vMatchCase_F, Match &case
Gui, Add, Button, xs+10 y+10 w80 gFindNext_F Default, &Find next
Gui, Add, Button, x+m w80, &Cancel
;-----------------------------------
Gui, Tab, Replace
;-----------------------------------
Gui, Add, Text, xs+10 ys+34 w100, Find what:
Gui, Add, Edit, x+m yp-4 w150 vNeedle_R
Gui, Add, Text, xs+10 y+10 w100, Replace with:
Gui, Add, Edit, x+m yp-4 w150 vReplacement
Gui, Add, Checkbox, xs+10 y100 vMatchCase_R, Match &case
Gui, Add, Button, xs+10 y+10 w80 gFindNext_R, &Find next
Gui, Add, Button, x+m w80, &Cancel
Gui, Add, Button, x+m w80, &Replace
;-------------------------------------------------------------------------------
; show
;-------------------------------------------------------------------------------
Gui, Main: Default
Gui, Show,, %AppName% - %Filename%
FileRead, Text, %Filename%
GuiControl,, EDT_File, %Text%
ControlGetPos,,,, SB_Height, msctls_statusbar321
SetTimer, Monitor_Caret, 50
Return
MainGuiEscape:
MainGuiClose:
ExitApp
MainGuiSize:
GuiControl, Move, EDT_File, % "w" A_GuiWidth " h" A_GuiHeight - SB_Height
Return
;-------------------------------------------------------------------------------
Monitor_Caret:
;-------------------------------------------------------------------------------
If WinActive(AppName " ahk_class AutoHotkeyGUI") {
Gui, Main: Default
ControlGet, current_Line, CurrentLine,,, ahk_id %Handle%
ControlGet, current_Col, CurrentCol,,, ahk_id %Handle%
If (current_Line != old_Line)
SB_SetText("Line: " old_Line := current_Line, 2)
If (current_Col != old_Col)
SB_SetText("Column: " old_Col := current_Col, 3)
}
Return
SearchMenu_Goto:
Gui, Main: +Disabled
Gui, Goto: Show
Return
GotoGuiEscape:
GotoGuiClose:
Gui, Main: -Disabled
Gui, Goto: Hide
Return
GotoButtonOK:
Gui, Main: -Disabled
Gui, Goto: Submit
i := getIndex_FirstChar(GotoLineNumber)
SendMessage, 0xB1, i, i,, ahk_id %Handle%
SendMessage, 0xB7,,,, ahk_id %Handle%
Return
;-------------------------------------------------------------------------------
getIndex_FirstChar(n) { ; return the index of the first character in line n
;-------------------------------------------------------------------------------
global Text
index := 0
Loop, Parse, Text, `n, `r
{
If (A_Index = n)
Return, index
index += StrLen(A_LoopField) + 2
}
}
SelectTab:
GuiControlGet, TabControl
Gui, Show,, %AppName% - %TabControl%
Return
SearchMenu_Find:
Gui, Find: Default
GuiControl, Choose, TabControl, 1
Gui, Show,, %AppName% - Find
Return
FindButtonCancel:
FindGuiEscape:
FindGuiClose:
Gui, Find: Hide
Gui, Main: Show
Return
FindNext_F:
Gui, Submit, NoHide
GuiControlGet, Text, Main:, EDT_File
StringReplace, Text, Text, `n, `r`n, All ; have to deal with EOL
l := StrLen(Needle_F)
SearchMenu_FindNext: ; side entrance
p := 0
p := RegExMatch(Text, (MatchCase_F ? "" : "i)") Needle_F,, CaretPos) - 1
IfEqual, p, -1, Return ; Needle not found
CaretPos := p + l ; remember this between calls
SendMessage, 0xB1, p, CaretPos,, ahk_id %Handle%
SendMessage, 0xB7,,,, ahk_id %Handle%
Return
SearchMenu_Replace:
Gui, Find: Default
GuiControl, Choose, TabControl, 2
Gui, Show,, %AppName% - Replace
Return
FindNext_R:
Gui, Submit, NoHide
GuiControlGet, Text, Main:, EDT_File
StringReplace, Text, Text, `n, `r`n, All ; have to deal with EOL
l := StrLen(Needle_R)
p := 0
p := RegExMatch(Text, (MatchCase_R ? "" : "i)") Needle_R,, CaretPos) - 1
IfEqual, p, -1, Return ; Needle not found
CaretPos := p + l ; remember this between calls
SendMessage, 0xB1, p, CaretPos,, ahk_id %Handle%
SendMessage, 0xB7,,,, ahk_id %Handle%
Return
FindButtonReplace:
GuiControlGet, Replacement
SendMessage, 0xC2, 1, &Replacement,, ahk_id %Handle%
Gosub, FindNext_R
Return