Тема: AHK: Улучшение авто-завершения в текстовом редакторе SciTE4AutoHotkey
Здраствуйте форумчане. Хочу поделиться написанным мною скриптом, задача которого - автозамена имён функций после их выбора из списка ключевых слов в редакторе SciTE4AutoHotkey. Происходит это следующим образом:
до
Привычным образом мы вводим часть слова и редактор показывает нам список из возможных вариантов авто-завершения, после чего мы перемещаемся по нему и делаем выбор с помощью клавиши Tab, клика мыши или клавиши Enter, в результате нажатия которой выбранное слово будет вставлено в текущей позиции каретки. До этого момента было бы всё хорошо, но редактор не позволяет нам использовать некоторый набор символов в ключевых словах (например: , . : " ' и т.д.), именно для ухода от этой небольшой проблемы и был написан скрипт. Работа скрипта основывается на том, что он отслеживает нажатия (в моём случае клавиши Tab) и сперва делает копию строки используя буфер обмена, а затем удаляет её включая только что выбранное и добавленное слово, появившееся после закрытия списка. Далее в строке уже скопированной в переменную происходит замена редко встречающихся сочетаний букв, таких как русские ъ,хх,хъ,ххх,хххх на \|")|",|","|",,"| и DllCallпробел на DllCall(", в итоге строка возвращается на прежднее место, но уже приведённая к определённому виду.
после
Возвращаясь назад следует упомянуть, что в редакторе есть всплывающие подсказки, как правило они успевают исчезнуть ещё до того, как ими успеешь воспользоваться. Cкрипт вмешивается в процесс их отображения путём показа своего окна, копирования изображения окна подсказки, срытия оригинальной подсказки, обычно за исчезновение которой отвечают нажатия определённых клавиш. Теперь пользователь может сам решить когда окно подсказки перестанет быть ему нужным и скрыть его с помощью поворота колеса мыши вниз над её окном.
Благодарность за предоставленный список функций в файле WinDlls.ahk товарищу HotKeyIt, они были "перенесены" в файл ahk.api(ссылка на zip архив внизу) который содержит ключевые слова для быстрого набора и оригинал которого находится в одной из папок: ~\SciTE\api\ahk.api , ~\SciTE3\ahk.api
, если их количество покажется вам излишним вы можете отредактировать файл и просто убрать лишние :)
В завершение хочу сказать, что хотя скрипт и явлется работоспособным, это всего лишь тестовая версия которую можно улучшить, поэтому вы смело можете оставить ваше мнение как пользователей и пожелания как разработчиков, а так же сами принять участие в доработке, буду рад узнать что скрипт вам пригодился в быту.
Небольшое замечание: иногда типы в перечне функций могут немного не соответствовать действительности, довольно сложно просмотреть список с более чем 7000 функций, а тем более их проверить, но если это случилось и вы это заметили вы можете оставить эту и другую информацию в этой теме, помните она можеть быть полезна другим.
Утилита для просмотра перечня функций в библиотеках DLL:
DLL Export Viewer
Gui, -Caption +E0x80000 +AlwaysOnTop +ToolWindow +LastFound
httip:=WinExist()
DllCall("SetLayeredWindowAttributes","uint",httip,"uint",0,"uchar",180,"uint",2)
httdc:=DllCall("GetDC","uint",httip)
wndcl:="CallTip"
Process,Exist,SciTE.exe
if !idProcess:=ErrorLevel
{
MsgBox, Процесс SciTE.exe не найден
Goto, Exit
}
hookprocadr:=RegisterCallback("HookProc")
if !hhook:=DllCall("SetWinEventHook","uint",0x8002,"uint",0x8003,"uint",0,"uint",hookprocadr,"uint",idProcess,"uint",0,"uint",0)
{
MsgBox, Хук не установлен
Goto, Exit
}
OnExit, ExitSub
OnMessage(0x201,"WindowProc") ; WM_LBUTTONDOWN
Return
$Tab::
IfWinExist, ahk_class ListBoxX
{
SendInput, {Tab}
WinWaitClose, ahk_class ListBoxX
SendInput, {Space}
Sleep, 20
Clipboard=
Send, {BS}+{Home}^c{BS}
ts:=Clipboard
StringReplace,ts,ts,хххх,"`,`,",All
StringReplace,ts,ts,ххх,"`,",All
StringReplace,ts,ts,хх,`"`,),All
StringReplace,ts,ts,хъ,`"),All
StringReplace,ts,ts,ъ,\,All
StringReplace,ts,ts,DllCall%A_Space%,DllCall(`",All
Clipboard:=ts
SendInput, ^v
}
Else Send {Tab}
Return
~WheelDown::
MouseGetPos, ,,hwndfp,,2
if (hwndfp=httip)
DllCall("SetWindowPos","uint",httip,"uint",0,"int",wx,"int",wy+50,"int",ww,"int",wh,"uint",4|16|128)
Return
ExitSub:
DllCall("UnhookWinEvent","uint",hhook)
Exit:
DllCall("ReleaseDC","uint",httip,"uint",httdc)
ExitApp
WindowProc(wParam,lParam,Msg,hwnd)
{
global
if (Msg=0x201)
PostMessage, 0xA1, 2
}
HookProc(hWinEventHook,event,hwnd,idObject,idChild,dwEventThread,dwmsEventTime)
{
global httip,httdc,hctip,wx,wy,ww,wh,wndcl
if (event=0x8002)
{
DllCall("GetClassName","uint",hwnd,"uint",&wndcl,"int",7)
if (wndcl="CallTi")
{
hctip:=hwnd
WinGetPos, wx,wy,ww,wh, ahk_id %hctip%
DllCall("SetWindowPos","uint",httip,"uint",0,"int",wx,"int",wy+50,"int",ww,"int",wh,"uint",4|16|64)
SetTimer, HideCallTip, -1
}
else if (wndcl="ListBo")
DllCall("SetWindowPos","uint",httip,"uint",0,"int",wx,"int",wy+50,"int",ww,"int",wh,"uint",4|16|128)
}
}
HideCallTip:
hdc:=DllCall("GetDC","uint",0)
DllCall("BitBlt","uint",httdc,"int",0,"int",0,"int",ww,"int",wh,"uint",hdc,"int",wx,"int",wy,"uint",0xCC0020) ; 0x8800C6
DllCall("ReleaseDC","uint",0,"uint",hdc)
DllCall("SetWindowPos","uint",hctip,"uint",0,"int",wx,"int",wy,"int",ww,"int",wh,"uint",4|16|128)
Return
/*
OnMessage(0x204,"WindowProc") ; WM_RBUTTONDOWN
OnMessage(0x20A,"WindowProc") ; WM_MOUSEWHEEL
DllCall("QueryPerformanceCounter","Int64*",ct0)
c:="no hook enter"
DllCall("QueryPerformanceCounter","Int64*",ct1)
c:="jump to hook" . " " . ct1-ct0
WinGetClass, wndcl,ahk_id %hwnd%
WinHide, ahk_id %httip%
HWND_BROADCAST ((HWND)0xffff)
HWND_BOTTOM ((HWND)1)
HWND_NOTOPMOST ((HWND)(-2))
HWND_TOP ((HWND)0)
HWND_TOPMOST ((HWND)(-1))
HWND_DESKTOP (HWND)0
HWND_MESSAGE ((HWND)(-3)) /* w2k */
SWP_NOSIZE 1
SWP_NOMOVE 2
SWP_NOZORDER 4
SWP_NOREDRAW 8
SWP_NOACTIVATE 16
SWP_DRAWFRAME 32
SWP_FRAMECHANGED 32
SWP_SHOWWINDOW 64
SWP_HIDEWINDOW 128
SWP_NOCOPYBITS 256
SWP_NOOWNERZORDER 512
SWP_NOREPOSITION 512
SWP_NOSENDCHANGING 1024
SWP_DEFERERASE 8192
SWP_ASYNCWINDOWPOS 16384
EVENT_MIN 0x00000001
EVENT_SYSTEM_SOUND 0x00000001
EVENT_SYSTEM_ALERT 0x00000002
EVENT_SYSTEM_FOREGROUND 0x00000003
EVENT_SYSTEM_MENUSTART 0x00000004
EVENT_SYSTEM_MENUEND 0x00000005
EVENT_SYSTEM_MENUPOPUPSTART 0x00000006
EVENT_SYSTEM_MENUPOPUPEND 0x00000007
EVENT_SYSTEM_CAPTURESTART 0x00000008
EVENT_SYSTEM_CAPTUREEND 0x00000009
EVENT_SYSTEM_MOVESIZESTART 0x0000000a
EVENT_SYSTEM_MOVESIZEEND 0x0000000b
EVENT_SYSTEM_CONTEXTHELPSTART 0x0000000c
EVENT_SYSTEM_CONTEXTHELPEND 0x0000000d
EVENT_SYSTEM_DRAGDROPSTART 0x0000000e
EVENT_SYSTEM_DRAGDROPEND 0x0000000f
EVENT_SYSTEM_DIALOGSTART 0x00000010
EVENT_SYSTEM_DIALOGEND 0x00000011
EVENT_SYSTEM_SCROLLINGSTART 0x00000012
EVENT_SYSTEM_SCROLLINGEND 0x00000013
EVENT_SYSTEM_SWITCHSTART 0x00000014
EVENT_SYSTEM_SWITCHEND 0x00000015
EVENT_SYSTEM_MINIMIZESTART 0x00000016
EVENT_SYSTEM_MINIMIZEEND 0x00000017
EVENT_OBJECT_CREATE 0x00008000
EVENT_OBJECT_DESTROY 0x00008001
EVENT_OBJECT_SHOW 0x00008002
EVENT_OBJECT_HIDE 0x00008003
EVENT_OBJECT_REORDER 0x00008004
EVENT_OBJECT_FOCUS 0x00008005
EVENT_OBJECT_SELECTION 0x00008006
EVENT_OBJECT_SELECTIONADD 0x00008007
EVENT_OBJECT_SELECTIONREMOVE 0x00008008
EVENT_OBJECT_SELECTIONWITHIN 0x00008009
EVENT_OBJECT_STATECHANGE 0x0000800a
EVENT_OBJECT_LOCATIONCHANGE 0x0000800b
EVENT_OBJECT_NAMECHANGE 0x0000800c
EVENT_OBJECT_DESCRIPTIONCHANGE 0x0000800d
EVENT_OBJECT_VALUECHANGE 0x0000800e
EVENT_OBJECT_PARENTCHANGE 0x0000800f
EVENT_OBJECT_HELPCHANGE 0x00008010
EVENT_OBJECT_DEFACTIONCHANGE 0x00008011
EVENT_OBJECT_ACCELERATORCHANGE 0x00008012
EVENT_CONSOLE_CARET 0x00004001
CONSOLE_CARET_SELECTION 0x00000001
CONSOLE_CARET_VISIBLE 0x00000002
EVENT_CONSOLE_UPDATE_REGION 0x00004002
EVENT_CONSOLE_UPDATE_SIMPLE 0x00004003
EVENT_CONSOLE_UPDATE_SCROLL 0x00004004
EVENT_CONSOLE_LAYOUT 0x00004005
EVENT_CONSOLE_START_APPLICATION 0x00004006
CONSOLE_APPLICATION_16BIT 0x00000001
EVENT_CONSOLE_END_APPLICATION 0x00004007
HSHELL_WINDOWCREATED = 1
HSHELL_WINDOWDESTROYED = 2
HSHELL_ACTIVATESHELLWINDOW = 3
HSHELL_WINDOWACTIVATED = 4
HSHELL_GETMINRECT = 5
HSHELL_REDRAW = 6
HSHELL_TASKMAN = 7
HSHELL_LANGUAGE = 8
HSHELL_ENDTASK = 10
HSHELL_APPCOMMAND = 12
HSHELL_WINDOWREPLACED = 13
HSHELL_WINDOWREPLACING = 14
HSHELL_RUDEAPPACTIVATED = 32772
HSHELL_FLASH = 32774
*/