1 (изменено: kirtech, 2011-05-05 23:55:42)

Тема: AHK: Улучшение авто-завершения в текстовом редакторе SciTE4AutoHotkey

Здраствуйте форумчане. Хочу поделиться написанным мною скриптом, задача которого - автозамена имён функций после их выбора из списка ключевых слов в редакторе SciTE4AutoHotkey. Происходит это следующим образом:

до

http://s003.radikal.ru/i202/1105/69/2515e5d4b07e.png

Привычным образом мы вводим часть слова и редактор показывает нам список из возможных вариантов авто-завершения,  после чего мы перемещаемся по нему и делаем выбор с помощью клавиши Tab, клика мыши или клавиши Enter, в результате нажатия которой выбранное слово будет вставлено в текущей позиции каретки. До этого момента было бы всё хорошо, но редактор не позволяет нам использовать некоторый набор символов в ключевых словах (например: , . : " ' и т.д.), именно для ухода от этой небольшой проблемы и был написан скрипт. Работа скрипта основывается на том, что он отслеживает нажатия (в моём случае клавиши Tab) и сперва делает копию строки используя буфер обмена, а затем удаляет её включая только что выбранное и добавленное слово, появившееся после закрытия списка. Далее в строке уже скопированной в переменную происходит замена редко встречающихся сочетаний букв, таких как русские ъ,хх,хъ,ххх,хххх на \|")|",|","|",,"| и DllCallпробел на DllCall(", в итоге строка возвращается на прежднее место, но уже приведённая к определённому виду.

после

http://s41.radikal.ru/i093/1105/56/196309363056.png

Возвращаясь назад следует упомянуть, что в редакторе есть всплывающие подсказки, как правило они успевают исчезнуть ещё до того, как ими успеешь воспользоваться. 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
*/
Post's attachments

ahk.zip 148.14 kb, 141 downloads since 2011-05-05 

You don't have the permssions to download the attachments of this post.