Тема: AHK: Как записать содержимое функции в файл
Да, я понимаю, что задаю дурацкий вопрос,
но вот, допустим, у меня в моем ahk файле есть функция, можно ли записать весь код из нее в файл?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Да, я понимаю, что задаю дурацкий вопрос,
но вот, допустим, у меня в моем ahk файле есть функция, можно ли записать весь код из нее в файл?
Как-то так:
FuncName = ; указать имя функции
FileName = ; указать путь к файлу для сохранения
FileRead, text, %A_ScriptFullPath%
t := RegExReplace(text, "s).*?(" FuncName "\([^\)]*?\)(\R|[ \t])*\{.*)", "$1")
Func := i := ""
Loop, parse, t
{
if (A_LoopField = "{")
i++
if (A_LoopField = "}")
i--
Func .= A_LoopField
} Until i = 0
FileAppend, % Func, % FileName
Присоединюсь к этому дурацкому вопросу
Пример выше явно читает файл скрипта, соответственно, для скомпилированного скрипта пример не применим. В случае если скрипт скомпилирован можно было бы прочитать соответствующую секцию данных, но только в том случае если файл не сжат, иначе можно было бы использовать некий декопрессор и… бесконечная история.
А существует ли общий метод получения участков кода текущего скрипта?
Или это не реализовано, бессмысленно и не реализуемо?
А какая от этого польза?
Польза от теоретически существующего метода? Гибкая реализация задачи поставленной в первом сообщении темы.
Нет, какая польза от записи содержимого функции в файл?
Тогда вопрос не ко мне
Машинный код функции, если речь о нём, можно вырезать и потом использовать только, если он не адресует никакие данные и не вызывает другие функции, т.е. никак не привязан к месту своего рождения. Но если этого нет в скриптовом коде, это не значит, что этого не будет в машинном. Так что я не вижу в задаче большого смысла.
Спасибо вам всем! Очень приятно, что не оставили без ответа.
Дело в том, что я сделал такую системку: я в одном скриптовом файле пишу код, и потом записываю его части в файлы .ahk и запускаю, получая тем самым многопоточность, а когда мне нужно завершить работу автохоткея, все созданные файлы автоматом закрыаются и удаляются, соотв. мне достаточно носить с собой только один файл и редактировать только его, к чему я давно привык. Я скорее всего неправильно поставил задачу, и нужно было спрашивать, можно ли вообще какнибудь кроме как представляя код как текст записывать его в файл, потому что щас это выглядит так:
Script=
(
...
)
StartThread("MonitorControl",Script,"UTF-8")
где StartThread это моя функция которая записывает текст из переменной Script в файл, запускает его и запоминает его название, чтобы потом можно было выключить и удалить. Может быть есть какие то другие пути это сделать?
А чем именно не устраивает существующий путь?
А чем именно не устраивает существующий путь?
Минусы в том что так приходится к символам % подставлять апостроф, а в SciTE получается монтонная подсветка синтаксиса как для текста.
Если есть такая функция как Include которая вкидывает в файл код извне, то такую функцию можно было бы назвать Exclude
Апостроф можно и не подставлять, есть опция специальная для сохранения %.
Script=
(%
...
)
StartThread("MonitorControl",Script,"UTF-8")
Очень советую не игнорировать справку, там много интересного.
Насчёт подсветки не знаю. Может, там в Scite с правилами пошаманить?
к сожалению у меня это не работает, пишет ошибки связанные с неправильной интерпретацией кода
Что именно не работает? Пример можно неработающий?
Error at line 114
Line Text: Process, Priority, , High
SetBatchLines -1
#NoTrayIcon
#NoEnv
#SingleInstance force
#Persi...
Error: Variable name too long
The script was not reloaded....
<LINE 114>Script=
(%
Process, Priority, , High
SetBatchLines -1
#NoTrayIcon
#NoEnv
#SingleInstance force
#Persistent
#Include scr_Functions.ahk
OnExit, Exit
hHookKeybd := DllCall("SetWindowsHookEx"
, Int, WH_KEYBOARD_LL := 13
, UInt, RegisterCallback("LowLevelKeyboardProc", "Fast")
, UInt, A_PtrSize=8 ? DllCall("GetModuleHandle", UInt, 0, "Fast") : DllCall("GetModuleHandle", UInt, 0) ; A_PtrSize ? 64=8 or 32=4 bit
, UInt, 0)
Return
Exit:
DllCall("UnhookWindowsHookEx", UInt, hHookKeybd)
ExitApp
LowLevelKeyboardProc(nCode, wParam, lParam) {
Critical
SetFormat, Integer, H
;ToolTip, `% "KeyState: " . wParam . "``n"
; . "vkCode: " . KeyCodeGetHex(NumGet(lParam+0,0,"UInt"),"vk") . "``n"
; . "scCode: " . KeyCodeGetHex(NumGet(lParam+0,4,"UInt"),"sc") . "``n"
; . "Extended: " . NumGet(lParam+0,8,"UInt") & 1 . "``n"
; . "HookKeybTime: " . NumGet(lParam+0,12,"UInt")
RegWrite, REG_DWORD, HKEY_CURRENT_USER, Software\scrMainScriptHkeys, HookKeybState, `% wParam
RegWrite, REG_SZ, HKEY_CURRENT_USER, Software\scrMainScriptHkeys, HookKeybvkCode, `% KeyCodeGetHex(NumGet(lParam+0,0,"UInt"),"vk")
RegWrite, REG_SZ, HKEY_CURRENT_USER, Software\scrMainScriptHkeys, HookKeybscCode, `% KeyCodeGetHex(NumGet(lParam+0,4,"UInt"),"sc")
RegWrite, REG_DWORD, HKEY_CURRENT_USER, Software\scrMainScriptHkeys, HookKeybExtended,`% NumGet(lParam+0,8,"UInt")
RegWrite, REG_DWORD, HKEY_CURRENT_USER, Software\scrMainScriptHkeys, HookKeybTime, `% NumGet(lParam+0,12,"UInt")
Return DllCall("CallNextHookEx", UInt, 0, Int, nCode, UInt, wParam, UInt, lParam)
}
)
StartThread("KeybHook",Script,"UTF-8")
Апострофы-то уберите.
Спасибо большое, оказалось я убрал апострофы везде, там где не надо тоже :-[
Вобщем вы мне очень помогли! Я счастлив!
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться