update : 2018/04/16 (Mon)
マクロを使用するに場合には、32bit/64bitの違いを気にする必要はありませんが、 外部DLLを使用する場合は、注意が必要です。
基本的には、64bit アプリケーションで、32bit DLLを使用する事はできませんが、 64bit版秀丸エディタには、32bit 外部DLL使用するためのオプションが存在します。
このオプションをONにすることで、64bit秀丸エディタ上で、32bit 外部DLLを使うことができますが、 32bit 外部DLLで、hmjre.dllを使用する場合は問題があります。
64bit 秀丸エディタに付属するのは、64bit hmjre.dllです。 32bit DLLから、64bit DLLのロードはできない為、32bit 外部DLLで、64bit 秀丸エディタ本体と同じ場所にある、 64bit hmjre.dllをロードしようとしても、必ず失敗します。
hmjre.dllを使用可能な外部DLLには、以下のDLL等があります。
オプションを「ON」にしても、64bit秀丸エディタから、上記 32bit 外部DLLを経由し、hmjre.dllを使用する場合は、 必ず失敗することになります。 (CompleteX、祝鳥では、hmjre.dllを読込に失敗した等のメッセージが表示される。)
解決方法としては、
等があります。
説明追加
ヘルプ(動作環境− 64bit版) にも説明がありますが、64bit秀丸上で32bitDLL使うには、かなり強引な方法をとっています。 その為、オプションを有効にしても、DLLによっては正常に動作しない場合もあります。
C/C++など、プログラミング言語から、64bit hmjre.dllを使う場合の注意点。
祝鳥に含まれている、「macrodll.dll」のx64版です。作者 あべのりゆき氏 の許可を得て公開しています。
上記URLで、公開されているソースを元に、Visual Studio Community 2015 with Update 3 でコンパイルしています。
最新版(祝鳥 1.00):macrodll.dll(x64)Ver.1.00 2016/10/27版
旧 版(祝鳥 0.89r1):macrodll.dll(x64)Ver.0.89r1 2015/11/29版
「田楽DLL」のx64版です。作者 杉浦まさき氏 の許可を得て公開しています。
上記URLで、公開されているソースを元に、VCEE2010SP1+Windows SDKでコンパイルしています。
田楽DLL(x64)Ver.3.22.1 2017/12/02
BREGEXP関数に関しては、K.Takata氏作成 bregonig.dll のx64版が使用できます。 bregonig.dll自体はUnicode(UTF-16LE)対応ですが、本DLLではANSI対応のみで、Unicodeには対応していません。
x64版をコンパイルする場合には、bregonig.dllのソースに含まれる"BREGEXP.H"が必要です。
Susie Plug-inに関しては、一応、"*.sph"に対応しています。 "*.sph"に関しては、以下のURLを参照して下さい。
UNBYPASS.DLLに含まれる、 "ZBYPASSI.SPH"を使用すると、64bit田楽DLLから、32bit Susie Plug-in を使用することが出来ます。
秀丸エディタ/秀丸メールで使用するマクロ拡張用DLLです。 マクロで(簡単には)実現できない(事もない?)各種機能(?)を提供します。
動作環境
詳細な説明はDLLの解説(Version 1.24.00b3)をみて下さい。
ht_tools.dll Version 1.24.00β3(2017/05/08)
32ビット/64ビットdll同梱(64ビットdllは、x64フォルダに格納されています。フォルダ構成を保った状態で解凍して下さい。)
圧縮ファイルの内容 ht_tools.dll :32bit DLL ht_tools.html :説明ファイル HidemaruMacroInstaller.lst:HidemaruMacroInstaller用スクリプト x64 :フォルダ └ht_tools.dll :64bit DLL
正式版
ht_tools.dll Version 1.23.00b(2016/08/01)
32ビット/64ビットdll同梱(64ビットdllは、x64フォルダに格納されています。フォルダ構成を保った状態で解凍して下さい。)
圧縮ファイルの内容 ht_tools.dll :32bit DLL ht_tools.html :説明ファイル HidemaruMacroInstaller.lst:HidemaruMacroInstaller用スクリプト x64 :フォルダ └ht_tools.dll :64bit DLL
hunspell関連に関数の実行には、ライブラリ(libhunspell.dll)と辞書ファイルが必要です。
辞書ファイルの入手先
"en_US"でしか動作確認していません。
EditorConfig に関してはEditorConfigを参照してください。
機能追加
EditorConfig関連の関数を追加。
EditorConfigExecute、
EditorConfigErrorMessage、
EditorConfigGetKey、
EditorConfigGetValue、
EditorConfigClear、
EditorConfigGetVersionStr
hunspell関連の関数を追加。
hunspell_GetVersion、
hunspell_Get_Dic_Encoding
INIファイルのunicode関数の追加
WriteIniNumW、GetIniNumW
InStr系関数で、全角文字を使用時に、検索文字があるのにマッチしない場合があるのを修正(完全ではないが)
例)InStrEx(0,"Hidemaru Editor","MARU", 1) がマッチしない場合があった。
hmonig.dll(命名IKKI氏)は秀丸エディタ/秀丸メールで使用する、hmjre.dll 互換の正規表現検索DLLです。 Ver.0.5.9 より、 正規表現エンジンに鬼雲(Ver.5.10.0以降)を使用しています。
鬼車の基本的な正規表現については、鬼車のドキュメント を参照してください。 hmjre.dll の互換性から、"\<"、"\>"は使用可能です。
鬼雲で拡張された正規表現については、鬼雲のドキュメントを参照してください。
後方参照(タグ参照)は、\nの形式は、1〜9までが指定可能です。 \k<n>、\k'n'も使用可能で、10以上も指定可能ですが、秀丸エディタの置換で、16以上は使用できません。(秀丸エディタ/hmjre.dllの制限)
hmonig.dllは、
の、2種類がありますが、Shift_JIS版は開発終了とし更新しません。今後はUnicode対応版のみになります。
Unicode(秀丸独自コード)対応版です。 DLLの内部で、Unicode(UTF16-LE)に変換し、処理を行っています。 その為、hmjre.dllと比較し、メモリ消費量は多くなり、遅くなると思います。
"\w"の扱いが変更になっていて、ASCIIコード範囲内のみマッチします。 (全角文字にはマッチしません。) その影響で、単語境界の認識も変更になっています。
Ver.0.5.9.0より、正規表現エンジンを鬼車(Ver.5.9.2ベース)から、鬼雲(Ver.5.12.0〜)へ変更。
正式版
hmonig.dll Ver.0.8.0.0c(2018/03/02) Unicode対応版のドキュメント
32ビット/64ビットdll同梱(フォルダ構成を保った状態で解凍して下さい。)
圧縮ファイルの内容
COPYING_Onigmo_Oniguruma :鬼車・鬼雲ライセンス条文 hmonig.dll :32bit DLL(Windows Vista以降用) hmonig.html :説明ファイル x64 :フォルダ └hmonig.dll :64bit DLL(Windows Vista以降用) XP-32 :フォルダ └hmonig.dll :Windowx XP 32bit用 DLL XP-64 :フォルダ └hmonig.dll :Windowx XP 64bit用 DLL
Unicodeで処理を行っていますが、\d、\s、\wは、ASCIIの範囲内のみ対象となります。 (\D、\S、\Wも同様に変更になります。) 全角文字等を対象に含めたい場合は、Character Property を使用してください。 (\p{Digit}で、全角を含む数字にマッチします。) Ver.0.5.9.0 以降から、正規表現の中に、(?a)、(?u) オプションが指定でき、 マッチする内容を切り替えることが可能です。
(?a):\w, \d, \s, POSIXブラケットは、非ASCII文字にマッチしない。 (?u):\w, \d, \s, POSIXブラケットは、非ASCII文字にマッチする。
GetLast〜の関数は、直前に実行した関数により、戻り値の単位が異なるので注意してください。
ワイド文字を扱う場合は、wcs系の関数を使用してください。
開発終了
BRegIf.dll+bregonig.dll(Shift_JIS専用)相当です。
マクロ用関数
FindRegular〜で、-2を返さないといけないのに、0を返していたので修正。 メモリ確保に失敗した場合、戻り値が間違っていた。
Unicode版の関数を追加
char を WCHAR に変更しただけ。 hmjre.dllが対応していないので、Unicodeでの、あいまい検索は出来ません。 ほとんどテストしていない状態です。
通常版API
UTF-8 対応のコードを整理。
ついでに、現状は UTF-8 以外は、全て UTF-16LE へ変換しているが、変換対象を Shift_JIS のみに、
切替可能にした。
Shift_JIS 以外で、異常動作した場合の対処 #define で切り替えるので、コンパイルが必要
正規表現エンジンを更新。
2011/12/01: [bug] /a{2}/i doesn't match 'AA'.
hmonig.dllの場合、通常検索では、ほぼ影響なし。マクロ関数に影響あり。 (通常の検索は、大文字小文字を無視する処理は、秀丸エディタ本体側で行っている為、 関係ないが、正規表現にオプションを埋め込んでいる場合は関係あり)
Jre2Compile/Jre2CompileW で 正規表現文字列が空かどうかのチェックを有効にした。
以前は、検索ダイアログを開いたまま、ウィンドウの切替を行うと、検索文字列がなくても、 JreGetVersion、Jre2Open、Jre2Compile、Jre2Close が呼び出された。 hmonig.dllでは、正規表現文字列が空だとエラーにしていた為、ウィンドウを切り替えるたびに エラーダイアログが表示されてしまうので、チェックを無効化していた。 秀丸エディタVer.8.32では、正規表現文字列が空の場合、JreGetVersion のみ呼び出されるように 変更になっていた為、チェックを有効にした。
マクロ用関数の追加
unicodeの正規化関連関数を追加
Windows XP用DLLでは動作しません。
マクロ用関数の追加
unicodeの正規化関連関数を追加
Windows XP用DLLでは動作しません。
公開されているdllの使い方などの紹介です。
あべのりゆき氏が公開されているDLLです。秀丸エディタのTex用マクロである「祝鳥」に含まれています。 リストボックスの表示や各種ファイル操作が可能です。
DLL単体でも公開もされています。単体で入手する場合は、「macrodll.dll関数一覧」もダウンロードしましょう。
ここのサンプルを動かす場合は、DLLを秀丸エディタ本体と同じ場所に置いてください。
macrodll.dllのVersion.0.81より、COM/OLEを操作する関数が追加されました。 これまでは、DDE通信や起動オプションでしか、他のアプリケーションと連携する方法が ありませんでしたが、(アプリケーションが対応していれば) COM/OLEを使った連携 が可能になります。
例えば、
等が可能です。DDE通信などより細かい制御が、可能になります。
COM/OLEの操作は、"Windows Script Host(WSH)"関連を調べるといいです。 以下のページが参考になります。
個別のアプリケーションを操作する場合は、アプリケーションの解説書や取説を参考にしてください。
COM/OLEの命令を調べるには、「オブジェクトビュアー」等があると便利です。
Word、Excel等を所有している場合、似たような機能を持つ「オブジェクトブラウザ」が使えます。 「Visual Basic Editor」を起動し、「ツール」->「参照」で、使いたいCOMオブジェクトを選択し、 "F2"キーを押すと、「オブジェクトブラウザ」が表示され、プロパティ等を確認できます。
Windows Script HostはWindows98以降に標準で搭載されています。 ヘルプがない場合は、ダウンロードしましょう。また、最新版でなければ、最新版にしましょう。
詳細はヘルプを参照。
InternetExplorerを使った例です。同じ機能を、WSHと秀丸マクロで作成しました。 実際には、エラー処理が必要になります。
注意InternetExplorerの例は、主にIE6を対象にしています。IE7以降だと、正常に動作しない場合があります。
WSHの記述例
'URLを取り込み url = InputBox("URLを入力してください。","IEのテスト","https://hide.maruo.co.jp/") Set WshIE = CreateObject("InternetExplorer.Application") '非表示状態なので、表示状態へ WshIE.Visible = true '指定されたURLを表示 WshIE.Navigate(url) '表示されるまでまつ busy = WshIE.busy state = WshIE.ReadyState do while(busy = true and state <> 4) '1秒タイマー Wscript.Sleep(1000) busy = WshIE.busy state = WshIE.ReadyState loop msgbox "表示完了" Set WshIE = Nothing wscript.quit
秀丸マクロ+macrodll.dllの記述例
loaddll hidemarudir + "\\macrodll.dll"; //URLを取り込み $url = input("URLを入力して下さい。","https://hide.maruo.co.jp/"); #ie = dllfunc("OLE_INITIALIZE","InternetExplorer.Application"); //非表示状態なので、表示状態へ #ret = dllfunc("OLE_SETPROPERTYINT",#ie, "Visible",1); //指定されたURLを表示 #ret = dllfunc("OLE_INVOKE",#ie, "Navigate","s", $url ); //表示されるまでまつ #busy = dllfunc("OLE_GETPROPERTYINT", #ie, "busy"); #state = dllfunc("OLE_GETPROPERTYINT", #ie, "ReadyState"); while(#busy != 0 && #state != 4){ //1秒タイマー #en = tickcount + 1000; while(tickcount < #en){}; #busy = dllfunc("OLE_GETPROPERTYINT", #ie, "busy"); #state = dllfunc("OLE_GETPROPERTYINT", #ie, "ReadyState"); } message "表示完了"; #ret = dllfunc("OLE_CLEAR"); freedll; endmacro;
COM/OLE操作のサンプルです。マクロを実行すると、新規ファイルを開き、経過を出力します。
標準入出力へのアクセスを行います。 実行時すると、コマンドプロンプトが表示されます。 秀丸エディタをアクティブにすると、InputBoxが表示されているので、 適当に入力してください。ソートして出力します。ソートはsort.exeを使用しています。
注意環境により、このマクロは正常に実行されない場合があります。 マクロを実行時、入力を終了しても、コマンドプロンプトが表示されたままになる場合は、 タスクマネージャー等で"sort.exe"を強制終了させてください。
2008/09/15追記 正常に動作しない原因は、Windows標準じゃないsort.exeを使用していたためでした。
ファイル操作のサンプル。 実行時すると、InputBoxが表示されので、適当に入力してください。 入力された内容をファイルに出力し、コピー、移動を行います。 マクロ実行後、マクロと同じ場所に"COM_TEST3_TEST.TXT"が作成されるので、 削除してください。
タブブラウザの"Sleipnir"を制御。(動作確認は Ver.2.49) 指定したURLを開きます。既にタブで開いている場合はリロード、 そうでない場合は、新規タブで開きます。
"Sleipnir"を制御するには、"Sleipnirオプション"を変更する必要があります。 クライアント->全般->「スクリプトによるクライアントの操作を許可する」に チェックを入れること。
17行目を書き換えると、Lunascapeでも動きます。 動作確認は、Lunascape Ver.4.06
変更前
00017|#Browser = dllfunc("OLE_INITIALIZE", "Sleipnir.API"); 00018|if(#Browser == 0){ 00019| $ERR = "Sleipnirオブジェクト作成に失敗"; 00020| goto ERRMSG; 00021|}
変更後 "Sleipnir.API" -> "Lunascape2.LunascapeAPI"
00017|#Browser = dllfunc("OLE_INITIALIZE", "Lunascape2.LunascapeAPI") 00018|if(#Browser == 0){ 00019| $ERR = "Lunascapeオブジェクト作成に失敗"; 00020| goto ERRMSG; 00021|}
2010/03/18 6項を追加。
macrodll.dllにある"文字列回収"機能の説明です。("COLLECTSTR〜"関数の使い方になります。) 文字列回収とは、ほぼGREPと同じ機能です。特徴的なのは、正規表現のグルーピングを使い、 マッチした行全体ではなく、必要な部分を切り出せることです。
使い方
正規表現を使用するので、SETHMJREDLL関数を呼びだす。 SETHMJREDLL関数を呼びさないと、正規表現を使った検索がうまくいかないので注意。
#ret = dllfunc("SETHMJREDLL", hidemarudir + "\\hmjre.dll");
COLLECTSTR_SETOPT関数で、検索オプションを設定。
以上のオプションが設定できるので、必要なら、"true"をセットします。
COLLECTSTR_COLLECT関数で検索実行(出力先がファイルなら結果はファイルへ出力)
切り出す文字列は、正規表現でグルーピングを行い、タグ番号で指定します。
Version.0.81以下
COLLECTSTR_ISMORESTR関数を使い、取り出せる文字の有無をみて、COLLECTSTR_GETSTR関数で 取り出します。
while(dllfunc("COLLECTSTR_ISMORESTR")){ $$s = dllfuncstr("COLLECTSTR_GETSTR"); }
Version.0.82以上
COLLECTSTR_GETDATASIZE関数で、取得した文字列の数を取得し、COLLECTSTR_GETSTR関数で、 何番目の文字を読み出すか指定し取り出します。
##n = dllfunc("COLLECTSTR_GETDATASIZE"); ##i = 0; while(##i < ##n){ $$s = dllfuncstr("COLLECTSTR_GETSTR",##i); ##i = ##i + 1; }
秀丸パイプは、m.fujimoto氏作成の変換モジュールです。 秀まるおのホームページより、 変換モジュールライブラリ からダウンロード出来ます。
本来、秀丸パイプは変換モジュールなんですが、マクロからも呼び出せるように、関数が用意されています。
使い方は通常のdllを使う方法と同じです。("HmPipe.hmf"をloaddllする。)
filter文、filter関数からも使用可能です。
使い方は、以下のようになります。
dllfuncstrで呼び出す場合(秀丸パイプ付属のテキストファイルから抜粋)
■使い方(マクロ編) 1.関数仕様 HmPipeRun(instr, progname, param); instr 入力文字列 progname プログラム名 param プログラムの引数(省略可) 2.使用例 -------------------------------------------- loaddll "HmPipe.hmf"; $outstr = dllfuncstr("HmPipeRun", $instr, "sort"); freedll; --------------------------------------------
filter文で呼び出す場合(秀丸パイプ付属のテキストファイルから抜粋)
○Ver1.02 ・秀丸マクロのfilter関数から呼ばれたときに引数を取れるようにしました。 引数では、秀丸パイプから起動するプログラム名と、その引数を指定するこ とができます。プログラム名と引数は"|"で区切って指定してください。 filter $HmPipe, "HmPipe", "foo.exe|arg1 arg2"; ・ワイドキャラクターを扱えるようになりました。 ワイドキャラクターのプログラムを作成する場合、標準入力、標準出力はす べてUTF-16LE(BOMなしリトルエンディアンUTF16)として扱ってください。標 準出力については、実行プログラムがASCIIやShift_JISでエラーを返すと思 うので、Unicodeかどうかの判定をしています(厳密には判定できませんが)。 秀丸マクロからfilterを使って呼び出すときは、関数名を"HmPipeW"とします。 filter $HmPipe, "HmPipeW", "xxx.exe|arg1 arg2 arg3";
この、"秀丸パイプ"を使うことで何が出来るかというと、秀丸のマクロでは出来ないことを、 他のプログラムを使用して行う事が可能になります。
他のプログラムと連携するには、run文等を使えば出来ますが、 標準出力をマクロで直接受け取れることが最大の利点です。
ただし、1つの文字列型変数は、8000文字(バイト?)程度が限界なので、注意が必要です。 出力が多い場合は、"run 〜 >con" を使い、秀丸エディタ上に出力させ、取り込むしかありません。 (tipsページのファイル一覧の取得を 参照してください。)
Ver.8
例として、OSに標準搭載されている、WSH(cscript.exe)を使用した時間の計算です。 現在時刻から2時間後の時間を返します。
Option Explicit Dim n '標準入力を取り込み、スペースで分割 n = split(trim(WScript.StdIn.ReadLine & " 0 0 0 0"), " ",4) '時間の演算 Wscript.echo TimeSerial(Hour(now) + n(0), Minute(Now) + n(1), Second(Now) + n(2))
loaddll "HmPipe.hmf"; $t = time; $outstr = dllfuncstr("HmPipeRun", "2 0 0", "cscript.exe", "//nologo timeadd.vbs"); message "現在時:" + $t + "\n2時間後:" + $outstr; freedll; endmacro;
現在時:00:50:07 2時間後:2:50:08
2010/03/22 マクロ関数を追加
hmjre.dllは、秀丸エディタVer.4.00から使用されている正規表現検索用のDLLです。 秀丸エディタの検索・置換で使用されています。 このDLLには、マクロから呼び出せる関数があります。
Hmjre.dll側での文字コードインデックス自動変換をON/OFFする関数。
関数にユニコード文字を含む文字変数を渡す場合、ユニコード文字1文字が4バイトのデータとして渡される形となります。
その為、通常の文字操作関数で、Hmjre.dllの戻り値を、そのまま使用すると、通常の文字インデックスの値とずれることになります。
この関数を使用することにより、通常の文字操作関数で使用するのに問題のない値に、自動的に変換することが可能です。
(秀丸エディタ V8.00β45以上、および秀丸メール V5.34β9以上で対応)
実際の使い方は、turukame.3:05320を参照してください。
関数の詳細は、hmjre.dllのヘルプを参照してください。
マクロ作成時に、文字列変数に対して、正規表現を使った検索を行うには、
を使用します。
置換を行うには、
を使用します。
"FindRegular"は見つけた位置(先頭は0)を、"GetLastMatchLength"はマッチした文字列の長さを返す為、 midstr関数を使えば、マッチした文字列を取得できます。
基本的に、行単位で処理を行うことを、前提としている為、 "$"が、\nの前にマッチする事が、特殊と考えた方がいいかもしれません。 (検索等で、複数行の処理が苦手となっている原因)
実験用マクロ
debuginfo 1; // 012345 678901 $target = "a1111\nb2222"; loaddll "hmjre.dll"; if(!result){ message "DLLのロードに失敗しました。"; endmacro; } call hmjre_check "^"; call hmjre_check "$"; freedll; endmacro; hmjre_check: #st = 0; while(1){ #ret = dllfunc("FindRegular",$$1, $target, #st); //正規表現にマッチすると-1より大きい値を返す。 if(#ret > -1){ //マッチした部分の長さを取得 #len = dllfunc("GetLastMatchLength"); debuginfo $$1 + ": #ret=" + str(#ret) + " #len=" + str(#len) + " #st=" + str(#st); }else{ break; } #st = #ret + 1; } return;
実行結果
// 012345 678901 $target = "a1111\nb2222"; ^: #ret=0 #len=0 #st=0 --> 先頭にしかマッチしない。 $: #ret=5 #len=0 #st=0 --> 改行の前にマッチ $: #ret=11 #len=0 #st=6 --> 検索対象の末尾にマッチ
ファイル名をドライブ、各フォルダ、ファイル名に分割します。
$name = "C:\\Program Files\\Hidemaru\\hidemaru.exe"; loaddll "hmjre.dll"; if(!result){ message "DLLのロードに失敗しました。"; endmacro; } //ファイルの各要素を分割 // C:\Program Files\Hidemaru\hidemaru.exe // 01234567890123456789012345678901234567 // 12 1234567890123 12345678 123456789012 // 0 0 1 2 // 0 3 7 6 #st = 0; while(1){ #ret = dllfunc("FindRegular","[^\\\\]+", $name, #st); //正規表現にマッチすると-1より大きい値を返す。 if(#ret > -1){ //マッチした部分の長さを取得 #len = dllfunc("GetLastMatchLength"); $match = midstr($name, #ret, #len); message "match -> " + $match + "\n#ret=" + str(#ret) + " #len=" + str(#len); }else{ break; } #st = #st + #len + 1; } freedll; endmacro;
実行結果
1回目 match -> C: #ret=0 #len=2 2回目 match -> Program Files #ret=3 #len=13 3回目 match -> Hidemaru #ret=17 #len=8 4回目 match -> hidemaru.exe #ret=26 #len=12
今回はファイルのパスを分解しましたが、正規表現を変えれば、splitの替わりになるかな?
変数に格納されたファイルパスから、フォルダ名、ファイル名、拡張子を取得します。
$name = "C:\\Program Files\\Hidemaru\\hidemaru.exe"; loaddll "hmjre.dll"; if(!result){ message "DLLのロードに失敗しました。"; endmacro; } //ファイル名部分を検索 #ret = dllfunc("FindRegular","[^\\\\]+$", $name, 0); //正規表現にマッチすると-1より大きい値を返す。 if(#ret > -1){ //マッチした部分の長さを取得 #len = dllfunc("GetLastMatchLength"); $basename = midstr($name, #ret, #len); $directory = leftstr($name, #ret - 1); } //拡張子を検索 #ret = dllfunc("FindRegular","\\..+$", $name, 0); //正規表現にマッチすると-1より大きい値を返す。 if(#ret > -1){ //マッチした部分の長さを取得 #len = dllfunc("GetLastMatchLength"); $extention = midstr($name, #ret, #len); } message "ファイルパス:" + $name + "\n" + "フォルダ名 :" + $directory + "\n" + "ファイル名 :" + $basename + "\n" + "拡張子 :" + $extention; freedll; endmacro;
実行結果
ファイルパス:C:\Program Files\Hidemaru\hidemaru.exe フォルダ名 :C:\Program Files\Hidemaru ファイル名 :hidemaru.exe 拡張子 :.exe
入力されたファイル名に、使用できない文字があるかどうかをチェックします。
loaddll "hmjre.dll"; if(!result){ message "DLLのロードに失敗しました。"; endmacro; } $input = input("ファイル名を入力してください。"); $regexp = "[\\/:,;*?\"<>|]"; //フルパスの場合は:\をチェックから外す if((midstr($input,1,2) == ":\\") || (midstr($input,0,2) == "\\\\")){ $regexp = "[/,;*?\"<>|]"; } #ret = dllfunc("FindRegular",$regexp ,$input ,0); if(#ret > -1){ #len = dllfunc("GetLastMatchLength"); $check = midstr($input, #ret, #len); message "ファイル名に使えない文字があります。\n「" + $check + "」"; }else{ message "ファイル名に問題はありません。"; } freedll; endmacro;
Visual Basicのtrim関数と同等の機能。空白(0x20)、全角空白(0x8140)、タブ(0x9)を削除します。 hmjre.dllの独自仕様である"ヒットした扱いにするタグ指定"を使っています。
$name = " \t C:\\Program Files\\Hidemaru\\hidemaru.exe \t "; loaddll "hmjre.dll"; if(!result){ message "DLLのロードに失敗しました。"; endmacro; } $regexp = "^([ \\t]+)(.+?)([ \\t]+$)(?\\2)"; #ret = dllfunc("FindRegular",$regexp ,$name ,0); if(#ret > -1){ #len = dllfunc("GetLastMatchLength"); $check = midstr($name, #ret, #len); message "「" + $check + "」"; }else{ message "検索に失敗しました。"; } freedll; endmacro;
田楽DLLは、杉浦方紀氏が作成した、秀丸エディタ/秀丸メールのマクロから呼び出せる機能拡張DLLで、以下の機能があります。
ダウンロード先:M. Sugiura Personal Web Page [Root]
関連項目
どんな、ダイアログが作成可能か知りたい場合は、配布ファイル内にある"dgdll.mac"を実行して下さい。 使用できるコントロールが全て使用されているので、サンプルとしても役に立ちます。
作成例として、「検索ボックス向け検索オプション変更マクロ」を使います。 チェックボックスと、ボタンを並べただけの、簡単なダイアログです。
マクロの構成としては、以下の3つから構成されています。
00016|//田楽DLLを読込 00017|loaddll "DengakuDLL.dll"; 00018|if (!result) loaddll hidemarudir + "\\DengakuDLL.dll"; 00019|if (!result) loaddll macrodir + "\\DengakuDLL.dll"; 00020|if (!result) loaddll currentmacrodirectory + "\\DengakuDLL.dll"; 00021|if (!result){ 00022| message "DengakuDLL.dll がロードできません。\n 実行ファイルと同じフォルダかマクロファイル用のフォルダに置いてください"; 00023| endmacro; 00024|}
単純に、「loaddll "DengakuDLL.dll";」だけでもいいですが、ロードに失敗した場合は、 DLLのロードする場所を、
に順次切り換えて、ロードを試みます。 それでも失敗した場合は、エラーで終了します。
使用する部品の配置や、表示内容などの設定を行います。
00025| //ダイアログ作成 00026| #w1 = 26; 00027| if (dllfunc("NEWDIALOG", $title + str(#TIMEOUTSET), #w1) == 0 || 00028| //大文字/小文字の区別 00029| dllfunc("NEWCONTROL","check", "casesense","大文字/小文字の区別(&C)") == 0 || 00030| dllfunc("SETCTRLSTATE","casesense", str(searchoption & 0x00000002 == 0x00000002)) == 0 || 00031| dllfunc("SETCTRLNOTIFY","casesense", "101") == 0 || 00032| //単語の検索 (省 略) 00063| message "ダイアログ作成エラー!";freedll;endmacro; 00064| }
簡単な各命令の説明です。
次に、部品を"NEWCONTROL"で配置して、各種設定(通知コードの設定と、検索フラグの状態をセット)を行います。
部品の配置を行います。部品の種類と、部品名を設定します。 ここでは、
を、行ってます。
田楽DLLで部品配置は、部品配置列の各行に対し、部品を置いておく事になります。
部品配置列 行┌─────────────────┐ 1│□大文字/小文字の区別(&C) │ ├─────────────────┤ 2│□単語の検索(&W) │ ├─────────────────┤ 3│□正規表現(&R) │ ├─────────────────┤ 4│□あいまい検索(&F) │ ├─────────────────┤ 5│□次の秀丸エディタも続けて検索(&H)│ ├─────────────────┤ 6│□一周する(&O) │ ├─────────────────┤ 7│□検索文字の強調/検索(&I) │ ├─────────────────┤ 8│閉じる │ └─────────────────┘
例では、行に1つの部品しか配置していませんが、複数の部品の配置も可能です。 複数の部品を配置する場合は、"SETCTRLWIDTH"を使用します。 "SETCTRLWIDTH"で幅を指定すると、次のコントロールは、幅を指定したコントロールの右側に、 幅を指定しない場合は、次行に配置する事になります。 また、幅を指定しない場合、"NEWDIALOG"で指定した幅を元に、コントロールの幅が、 自動的に設定されます。(「閉じる」ボタンを参照)
部品を配置し、設定したら、ダイアログを実際に表示します。
00066| if (!dllfunc("SHOWDIALOG",hidemaruhandle(0),1)){ 00067| freedll; 00068| message "ダイアログの表示に失敗しました。"; 00069| endmacro; 00070| }
通知コードの待ち受け処理です。
00071| //メインループ 00072| #st = tickcount; 00073| #timeout = #st + (1000 * #TIMEOUTSET); 00074| #n = 1; 00075| while (1) { 00076| $retcode = ""; 00077| while (strlen($retcode) == 0){ 00078| $retcode = dllfuncstr("WAITCTRLNOTIFY",10); 00079| //タイムアウト処理 00080| if(tickcount > #timeout){ 00081| $retcode = "BREAK"; 00082| break 00083| } 00084| if((#st + (#n * 1000)) < tickcount){ 00085| #ret = dllfunc("SETDLGTITLE", $title + str(#TIMEOUTSET - #n)); 00086| #n = #n + 1; 00087| } 00088| }
77〜88行目が、通知コードの待ち受け部分です。 dllfuncstr("WAITCTRLNOTIFY",10)が、実際に通知コードを受け取る命令になります。 本来なら、1行で済みますが、今回はタイムアウト処理などがあるので、多くなってます。
タイムアウト処理がなければ、こんな感じです。
while (strlen($retcode) == 0) $retcode = dllfuncstr("WAITCTRLNOTIFY",10);
ここでは、何かしら、通知コードが入力されるまで(ダイアログが操作されるまで)、 ひたすら待ち続けます。
実際の処理部。 受け取った通知コードをみて、各種処理をおこないます。
00089| if($retcode == "0" || $retcode == "BREAK"){ 00090| break; 00091| }else if($retcode == "101"){ 00092| setsearch searchbuffer, (searchoption ^ 0x00000002); 00093| }else if($retcode == "102"){ 00094| setsearch searchbuffer, (searchoption ^ 0x00000001); 00095| }else if($retcode == "103"){ 00096| setsearch searchbuffer, (searchoption ^ 0x00000010); 00097| }else if($retcode == "104"){ 00098| setsearch searchbuffer, (searchoption ^ 0x00000020); 00099| }else if($retcode == "105"){ 00100| setsearch searchbuffer, (searchoption ^ 0x00000080); 00101| }else if($retcode == "106"){ 00102| setsearch searchbuffer, (searchoption ^ 0x01000000); 00103| }else if($retcode == "107"){ 00104| setsearch searchbuffer, (searchoption ^ 0x00000800); 00105| }else if($retcode == "108"){ 00106| setsearch searchbuffer, (searchoption ^ 0x00001000); 00107| }
例では、検索オプションの書き換えを行っています。
通知コードが"0"(閉じるボタン)または、"BREAK"(タイムアウト)の場合は、 待ち受けループを抜け、ダイアログを閉じ、終了します。
00111| ##ret = dllfunc("ENDDIALOG");
BRegIf.DLLは、v0,1,3,0 以降、マクロから呼び出せる各種関数が実装されています。 その関数の使い方の例です。 というか、開発時に使っている動作確認用マクロです。新規秀丸を開き、結果を出力します。
出力結果
c:\program files\hidemaru\bregif.dll BRegIf.dll Ver.1.32(bregonig.dll Ver.1.44 with Oniguruma 5.9.1) 1 2 3 4 5 6 7 01234567890123456789012345678901234567890123456789012345678901234567890 Yokohama 045-222-1111 Osaka 06-5555-6666 Tokyo 03-1111-9999 FindRegularのテスト FindRegular("(03|045)-(\d{3,4})-(\d{4})", $target, 0) 見つかった場所:10 マッチした長さ:12 マッチした文字:045-222-1111 見つかった場所1:10 マッチした長さ1:3 マッチした文字1:045 見つかった場所2:14 マッチした長さ2:3 マッチした文字2:222 見つかった場所3:18 マッチした長さ3:3 マッチした文字3:111 GetFunctionResultを使用した場合 見つかった場所0:045-222-1111 見つかった場所1:045 見つかった場所2:222 見つかった場所3:1111 Matchのテスト Match("(03|045)-(\d{3,4})-(\d{4})","",$target, 0) 見つかった場所:10 マッチした長さ:12 マッチした文字:045-222-1111 見つかった場所1:10 マッチした長さ1:3 マッチした文字1:045 見つかった場所2:14 マッチした長さ2:3 マッチした文字2:222 見つかった場所3:18 マッチした長さ3:3 マッチした文字3:111 GetFunctionResultを使用した場合 見つかった場所0:045-222-1111 見つかった場所1:045 見つかった場所2:222 見つかった場所3:1111 FindRegularNoCaseSenseのテスト1 FindRegularNoCaseSense("(YOKOHAMA).+(OSAKA).+(TOKYO)", $target, 0) 見つかった場所:1 マッチした長さ:48 マッチした文字:Yokohama 045-222-1111 Osaka 06-5555-6666 Tokyo GetFunctionResultを使用した場合 見つかった場所0:Yokohama 045-222-1111 Osaka 06-5555-6666 Tokyo 見つかった場所1:Yokohama 見つかった場所2:Osaka 見つかった場所3:Tokyo FindRegularNoCaseSenseのテスト2 FindRegularNoCaseSense("(yoKoHaMa).+(oSAka).+(tOkYo)", $target, 0) 見つかった場所:1 マッチした長さ:48 マッチした文字:Yokohama 045-222-1111 Osaka 06-5555-6666 Tokyo GetFunctionResultを使用した場合 見つかった場所0:Yokohama 045-222-1111 Osaka 06-5555-6666 Tokyo 見つかった場所1:Yokohama 見つかった場所2:Osaka 見つかった場所3:Tokyo Matchのテスト2 Match("(yoKoHaMa).+(oSAka).+(tOkYo)", "i",$target, 0) 見つかった場所:1 マッチした長さ:48 マッチした文字:Yokohama 045-222-1111 Osaka 06-5555-6666 Tokyo GetFunctionResultを使用した場合 見つかった場所0:Yokohama 045-222-1111 Osaka 06-5555-6666 Tokyo 見つかった場所1:Yokohama 見つかった場所2:Osaka 見つかった場所3:Tokyo Transのテスト base :abcdefghijkl tr/bdfj/BDFJ/ :aBcDeFghiJkl tr/bdfj/_/ :a_c_e_ghi_kl tr/bdfj/BD/d :aBcDeghikl tr/abcd/_/s :_efghijkl tr/abcd/_/c :abcd________ tr/abcd/_/cs :abcd_ データ変更 tr/012/零一弐/k: Yokohama 零45-弐弐弐-一一一一 Osaka 零6-5555-6666 Tokyo 零3-一一一一-9999 Translateのテスト tr/012/零一弐/k: Yokohama 零45-弐弐弐-一一一一 Osaka 零6-5555-6666 Tokyo 零3-一一一一-9999 Splitのテスト 分割文字: *\d{2,3}-\d{3,4}-\d{4} * split戻り値:3 エラー: 分割文字(0):[ Yokohama] 分割文字(1):[Osaka] 分割文字(2):[Tokyo] Substのテスト s/[0-9]/x/ :01--> Yokohama x45-222-1111 Osaka 06-5555-6666 Tokyo 03-1111-9999 s/[0-9]/x/g :30--> Yokohama xxx-xxx-xxxx Osaka xx-xxxx-xxxx Tokyo xx-xxxx-xxxx SubstExのテスト s/[0-9]/x/ st = 0 :01--> Yokohama x45-222-1111 Osaka 06-5555-6666 Tokyo 03-1111-9999 s/[0-9]/x/ st = 20 :01-->x1 Osaka 06-5555-6666 Tokyo 03-1111-9999 s/[0-9]/x/g st = 30 :20-->xx-xxxx-xxxx Tokyo xx-xxxx-xxxx SubstEx2のテスト s/[0-9]/x/ st = 0 :01--> Yokohama x45-222-1111 Osaka 06-5555-6666 Tokyo 03-1111-9999 s/[0-9]/x/ st = 20 :01--> Yokohama 045-222-11x1 Osaka 06-5555-6666 Tokyo 03-1111-9999 s/[0-9]/x/g st = 30 :20--> Yokohama 045-222-1111 Osaka xx-xxxx-xxxx Tokyo xx-xxxx-xxxx Replaceのテスト s/[0-9]/x/ --> Yokohama x45-222-1111 Osaka 06-5555-6666 Tokyo 03-1111-9999 s/[0-9]/x/g --> Yokohama xxx-xxx-xxxx Osaka xx-xxxx-xxxx Tokyo xx-xxxx-xxxx Replace2のテスト s/[0-9]/x/ st = 10 --> Yokohama x45-222-1111 Osaka 06-5555-6666 Tokyo 03-1111-9999 s/[0-9]/x/g st = 20 --> Yokohama 045-222-11xx Osaka xx-xxxx-xxxx Tokyo xx-xxxx-xxxx
基本的に、従来のdllfunc/dllfuncstrで、外部DLLに対し、unicode文字列を渡すことはできません。 例外的に、hmjre.dll/Tkinfo.dllのみ、秀丸独自コードを使用し、unicode文字列を渡すことが可能です。
hmjre.dll/Tkinfo.dll以外のDLLでは、"Unicodeを取り除いた形式に変換"しているとのこと。 (秀丸エディタ本体側で処理。turukame.3:05331を参照)
Ver.8より、ワイド文字に対応した、dllfuncw/dllfuncstrwが追加されています。 外部DLLで、unicode文字列を扱う場合は、dllfuncw/dllfuncstrwを使用することになりますが、 DLL側の対応が必要です。
文字変数内に、Unicode文字が含まれるかどうかの、チェック方法はマクロヘルプに 記載されています。 (秀丸エディタ Ver.8 charindex_to_byteindex のページ)
秀丸エディタの変換モジュールライブラリ にある Uniq の改造版です。 uniq(重複行削除)だけでなく、重複行を出力する機能も追加しています。 また、重複チェックを開始するフィールドを指定できます。(スペース区切り、CSV、TSV)
32bit版及び64bit版があります。
圧縮ファイルの内容
uniq.txt 変換モジュールの説明 uniq.hmf 32bit版変換モジュール uniq.hmf64 64bit版変換モジュール uniq_ex_src.zip 変更したソース(vcee 2010)
以下の3個の機能があります
「ユニーク」、「重複行出力」は、そのままの機能を実行します。 「ユニーク/重複行」は設定ダイアログを表示し、指定された機能を実行します。
設定できる内容は、以下になります。
比較開始するフィールドの位置
比較を開始する位置を指定できます。
通常は半角スペース(0x20)が、フィールドの区切り文字になりますが、
CSV用に","、TSV用にタブコード(0x09)も指定できます。
フィールドの位置指定は、先頭が1で、最大255まで、指定できます。
注)フィールドの区切りは、まじめに解析していないので、おまけ程度だと思ってください。
以下のソースをベースに以下の内容を修正。
Windows スクリプト コンポーネント で作成した、秀丸エディタマクロ用COMコンポーネントです。
COMコンポーネントといっても、XML と、VBScript、JScriptで構成されています。
このCOMコンポーネントを使う場合には、レジストリに登録が必要です。 登録時、Windows Vista以降では、管理者権限が必要になります。 登録を行った時のパスをレジストリに登録するので、あらかじめファイルを配置してから、登録を行ってください。 また、内部で .NET Framework の機能を使用しているので、.NET Framework のライブラリが必要です。 (開発環境は、 .NET Framework 4 になります。)
圧縮ファイルの内容
HidemaruMacroWscLib_setup.vbs 登録/登録解除用vbs HidemaruMacroWscLib.html 説明書 HidemaruMacroWscLib.wsc WSCファイル(COMコンポーネント本体)
旧バージョンの登録解除が必用です。
旧バージョンの「登録解除」を行わない場合、レジストリに古い情報が残されます。 (古い情報が残っていても、特に問題はありません。)
文字列操作用と、日付関連のオブジェクトがあり、各種メソッド、プロパティが実装されています。
秀丸エディタ用マクロのインストール補助スクリプトです。
名前は立派ですが、たいしたことは出来ません。ZIP形式の圧縮ファイルを展開し、 ファイルを秀丸エディタのマクロフォルダに移動するだけです。
マクロフォルダの位置は自動で認識ます。以下の順番で秀丸エディタの検索を行います。
レジストリの検索結果と、プロセス実行中のパスが異なる場合は、プロセスから取得した情報を優先します。 その為、持ち出しキットで使用する場合は、無題でもいいので、秀丸エディタを起動しておく必要があります。 (常駐秀丸がいれば問題ないです。)
配布ファイルには、以下のファイルが格納されています。
HidemaruMacroInstaller.vbs :メインモジュール HidemaruMacroInstallerSubModule.vbs :サブモジュール(ファイルの移動処理) HidemaruMacroInstaller.html :説明ファイル HidemaruMacroInstaller_UAC_Dialog_Vista.png :説明ファイル用画像 HidemaruMacroInstaller_UAC_Dialog_7.png :説明ファイル用画像
スクリプトと同じ個所に、以下のファイルを作るので、書き込み権限のあるフォルダに展開してください。
HidemaruMacroInstaller.dat :秀丸エディタの各種情報を保存 HidemaruMacroInstaller.mac :"HidemaruMacroInstaller.dat"作成用マクロ HidemaruMacroInstaller.log :動作ログを記録したファイル HidemaruMacroInstaller.usrcmd :アプリケーション実行用データファイル
"HidemaruMacroInstaller.vbs" に ZIP形式で圧縮されたマクロファイルをドロップするだけです。 ZIPファイルの中身が、自動的にマクロフォルダに展開されます。
マクロファイルがドロップされた場合は、マクロフォルダに移動します。
ZIPファイルの展開以外にも機能があります。 詳細は、説明ファイルを参照の事。
hmonig.dll Ver.0.7.4.0系がサンプルになります。 (実行環境を判定して、対象のDLLをコピーしている。)
"HidemaruMacroInstaller.vbs"を修正
ちなみに、起動中の秀丸エディタを見つけた場合、レジストの検索結果より、プロセス実行中のパスを優先します。
"HidemaruMacroInstallerSubModule.vbs"を修正
"HidemaruMacroInstaller.vbs"を修正
インストール場所の検索に失敗していたのを修正。