Für LUA gibt es einige praktische Erweiterungen als DLL, die jedoch nicht mit der in SciTE integrierten Version funktionieren.
SciTE verwendet LUA 5.1 und exportiert die nötigen Funktionen auch in der SciTE.exe. Die DLLs erwarten dagegen die Exports durch eine DLL namens lua5.1.dll.
Die hier angebotenen DLLs habe ich so modifiziert, dass sie nun nach SciTE.exe statt lua5.1.dll suchen und daher problemlos in SciTE-LUA funktionieren.
Alien bietet eine Schnittstelle zum Aufruf von Funktionen in DLLs, wodurch die komplette Windows API zur Verwendung offen steht.
VCLua ist eine GUI-Bibliothek für LUA. Für die Verwendung mit SciTE scheint mir aber doch die von SciTE-ru erstellte GUI-Bibliothek besser geeignet sein.
Download und Dokumentation für die SciTE-ru GUI befinden sich hier:
http://scite-ru.googlecode.com/svn/trunk/pack…/LuaLib/gui.dll
http://scite-ru.googlecode.com/svn/trunk/lualib/gui/docs/gui.html
Weiterhin gibt es bei SciTE-ru auch die Shell.dll (Doku) und lpeg (Doku) (dazu re, eine auf lpeg basierende Regex-Bibliothek)
Der Anhang enthält die gepatchten DLLs und die nötigen lua-Dateien.
Ein Beispiel für alien:
Spoiler anzeigen
-- timetype: 1 - created, 2 - accessed, 3 - modified
local function FileGetTime(filepath, timetype)
timetype = timetype or 1
local alien = require "alien"
local GENERIC_READ = 0x80000000
local GENERIC_WRITE = 0x40000000
local OPEN_EXISTING = 3
local FILETIME = alien.defstruct {
{ 'dwLowDateTime' , 'ulong'},
{ 'dwHighDateTime' , 'ulong'}
}
local CreateFile = assert(alien.kernel32.CreateFileA)
CreateFile:types{ret = "pointer", abi = 'stdcall', "string",
"int", "int", "pointer", "int", "int", "pointer"}
local CloseHandle = assert(alien.kernel32.CloseHandle)
CloseHandle:types{ret = 'int', abi = 'stdcall', "pointer"}
local GetFileTime = assert(alien.kernel32.GetFileTime)
GetFileTime:types{ret = 'int', abi = 'stdcall', "pointer", "pointer", "pointer", "pointer"}
local hFile = CreateFile(filepath, GENERIC_READ, 7, nil, OPEN_EXISTING, 0 ,nil)
[/autoit] [autoit][/autoit] [autoit]-- check for success
local tmp = alien.buffer(4)
tmp:set(1, hFile, 'pointer')
local hnum = tmp:get(1, 'int')
if hnum == -1 then return nil end
local fT = FILETIME:new()
local success
if timetype == 1 then success = GetFileTime(hFile, fT(), nil, nil)
elseif timetype == 2 then success = GetFileTime(hFile, nil, fT(), nil)
else then success = GetFileTime(hFile, nil, nil, fT())
CloseHandle(hFile)
[/autoit] [autoit][/autoit] [autoit]if not success then return nil end
[/autoit] [autoit][/autoit] [autoit]local get_unix = alien.Ntdll.RtlTimeToSecondsSince1970
get_unix:types{ret = 'int', abi = 'stdcall', "pointer", "ref uint"}
success, timeval = get_unix(fT(), 0)
if not success then return nil end
return timeval
end
--===================================================--
-------------------|> EXAMPLE <|---------------------
--===================================================--
local unix = FileGetTime("C:\\windows\\explorer.exe", 3)
trace (unix .. "\n")
Installation:
- Archiv in das SciTE-Verzeichnis entpacken
* Folgende Zeile an den Anfang von SciTE/LUA/SciTEStartup.lua setzen: