1

Тема: 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 который содержит ключевые слова для быстрого набора и оригинал которого находится в одной из папок: ~\SciTE\api\ahk.api , ~\SciTE3\ahk.api
, если их количество покажется вам излишним вы можете отредактировать файл и просто убрать лишние

В завершение хочу сказать, что хотя скрипт и явлется работоспособным, это всего лишь тестовая версия которую можно улучшить, поэтому вы смело можете оставить ваше мнение как пользователей и пожелания как разработчиков, а так же сами принять участие в доработке, буду рад узнать что скрипт вам пригодился в быту.



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
*/

2

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

Вроде, всё работает!

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

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

kirtech, спасибо и добро пожаловать! Ознакомьтесь с 6. Разделы форума и права посетителей.

Коллеги, теперь совместными усилиями определяйтесь, в какое место Коллекции сие следует добавить (и добавляйте, разумеется).

4

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

Вопрос к форумчанам которые могут мне помочь перенести эту тему и видят в этом необходимость. Если вы прочли эту тему, является ли она самодостаточной и не требует дополнений или изменений для переноса её в другой раздел, достаточно скопировать содержимое и создать тему в другом разделе - Коллекция скриптов и идей\AutoHotkey?

5

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

В каком виде тема будет в Коллекции, зависит от тебя. Прочитай её ещё раз, может, можно более чётко сформулировать, что умеет делать этот скрипт и как с ним работать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6 (изменено: Nikva, 2014-10-17 10:01:17)

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

Не осталось ли у кого-нибудь файла, когда-то прикрепленного к этому посту
в  коллекция скриптов.
http://forum.script-coding.com/viewtopic.php?id=5784

7

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

А прямо в той теме архив не видно или он не скачивается?
Внутри должен быть файл ahk.api.
Размер: 961 КБ (984 370 байт)
Создан: 5 мая 2011 г., 22:44:00

8

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

ypppu пишет:

А прямо в той теме архив не видно или он не скачивается?
Внутри должен быть файл ahk.api.
Размер: 961 КБ (984 370 байт)
Создан: 5 мая 2011 г., 22:44:00

Я немогу открыть сам архив
пробовал 7zip, winrar и онлайн распаковщик
http://i.gyazo.com/3f5eff5cdb65460dd524a8568fa41405.png

9

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

Nikva, я сам использую WinRAR. Прошу Вас скачанный архив выложить на каком-либо стороннем ресурсе и дать ссылку сюда. Я его скачаю и станет понятно, в чём проблема.

10

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

Я скачал и распаковал, ссылка.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

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

Значит, с файлом всё в порядке. Ранее было подозрение, что у Участников прикреплённые файлы скачиваются битыми.
Подождём, в каком виде файл придёт через руки Nikva.

12

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

Когда я пытался скачать браузером (FF), тоже битым получался. Удалось скачать качалкой.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

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

teadrinker пишет:

Я скачал и распаковал, ссылка.

Спасибо.

teadrinker пишет:

Когда я пытался скачать браузером (FF), тоже битым получался. Удалось скачать качалкой.

Пробовал скачать Хромом, FF и Oper'ой с 3ёх разных компьютеров. не получалось

14 (изменено: Alectric, 2014-10-22 10:26:19)

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

Если делать архив zip без зжатия - то все качается, но с какой-то задержкой.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.