hmLJ 秀丸マクロ用 500倍速スクリプト via LuaJIT with FFI概要秀丸マクロに「超高速スクリプトLuaJIT」を組み込むためのdllとなります。 ダウンロード![]() 更新日 2017/12/16
for 秀丸エディタ 32bit版 動作環境
インストール
特徴
秀丸マクロとLuaの連携
一番簡単なソース例「a」に「3」、「b」に「10」を定義し、足しこんで表示。 #L = loaddll( hidemarudir + "\\" + "hmLJ.dll" ); // 以下の文字列を「luajitの環境スコープへと追加書き込みし、追加分だけ実行する」 #_ = dllfunc(#L, "DoString", " \n"+ "a = 3 \n"+ "b = 10 \n" ); #a = dllfunc(#L, "GetNumVar", "a"); // luajit側のグローバル変数「a」を秀丸マクロ側へと得る #b = dllfunc(#L, "GetNumVar", "b"); // …〃…「b」を…〃… message(str(#a)); message(str(#b)); // 以下の文字列を「luajitの環境スコープへと追加書き込みし、追加分だけ実行する」 #_ = dllfunc(#L, "DoString", " \n"+ "c = a + b \n"+ // 上で書き込んだaやbの変数は持続されている。 "hm.debuginfo(c) \n" // DebugMonitorに表示。 ); #c = dllfunc(#L, "GetNumVar", "c"); // …〃…「c」を…〃… message(str(#c)); freedll(#L); ![]() Win32 API を使った簡単なソース例Win32 APIを使って、実行中のモジュール(通常秀丸本体)のフルパスを得る #L = loaddll( hidemarudir + "\\hmLJ.dll"); // ffiを利用することで、typedefで基本型名にwin32の名前に沿ったエイリアスを付ける // win32で良くあるパターンのように受け口のパッファーを確保する必要がある。 // win32の文字列⇒luaの文字列への変換としては、ffi.stringが用いられる。 #_ = dllfunc(#L, "DoString", ""+ "ffi.cdef[[ \n" + "typedef void * HMODULE; \n" + "typedef char * LPTSTR; \n" + "typedef unsigned short DWORD; \n" + "DWORD GetModuleFileNameA(HMODULE hModule, LPTSTR lpFilename, DWORD nSize);\n" + "]] \n" + "kernel32 = ffi.load('kernel32'); \n" + "szPathBuf = ffi.new('char[?]', 256); \n" + "ret = kernel32.GetModuleFileNameA( nil, szPathBuf, 256 );\n" + "szPathBuf = ffi.string(szPathBuf)" ); // luajitのffi経由のwin32api で得た情報を、秀丸マクロへと持ってくる $strBufFileName = dllfuncstr(#L, "GetStrVar", "szPathBuf"); message($strBufFileName); freedll(#L) ![]() 秀丸エディタ 8.66以降
秀丸エディタ8.66以降では、ヒアドキュメントのようなものを利用することが出来ますので、 #L = loaddll( hidemarudir + "\\hmLJ.dll"); // ffiを利用することで、typedefで基本型名にwin32の名前に沿ったエイリアスを付ける // win32で良くあるパターンのように受け口のパッファーを確保する必要がある。 // win32の文字列⇒luaの文字列への変換としては、ffi.stringが用いられる。 #_ = dllfunc(#L, "DoString", R"LUA( ffi.cdef[[ typedef void * HMODULE; typedef char * LPTSTR; typedef unsigned short DWORD; DWORD GetModuleFileNameA(HMODULE hModule, LPTSTR lpFilename, DWORD nSize); ]] kernel32 = ffi.load("kernel32") szPathBuf = ffi.new("char[?]", 256) ret = kernel32.GetModuleFileNameA( nil, szPathBuf, 256 ) szPathBuf = ffi.string(szPathBuf) )LUA" ); // luajitのffi経由のwin32api で得た情報を、秀丸マクロへと持ってくる $strBufFileName = dllfuncstr(#L, "GetStrVar", "szPathBuf"); message($strBufFileName); freedll(#L) その他解説
ライセンス
|