update : 2024/09/24 (Tue)
マクロの作成に関するメモです。
作成:2009/08/30 更新:2011/12/17
秀丸エディタVer.8β8より、loaddll関数により、複数DLLのロードが可能になりました。詳細はマクロヘルプ-DLL呼び出し機能にある、「複数のDLLを扱う場合(V8.00以降)」を参照して下さい。
秀丸エディタではVer.3.02以降、外部DLLを使用できるようになりました。一度に使用できるDLLは一つだけなので、複数のDLLを使用する場合、使用するDLLが変わるたびにDLLの解放・DLLのロードを繰り返す必要があります。複数DLLの処理が完全に別々になる(DLL1を使った処理が全て終了後、DLL2を使う処理を行う)なら順番にロードすれば特に問題はありませんが、別DLLの関数を交互に使いたい場合は、DLLのロードと解放を頻繁に行わなくてはいけません。
複数DLLを使う方法1
以下のDLLを使う方法があります。
これらのDLLを使えば一度に複数のDLLをロードすることが出来ます。 DLL経由で他のDLLをロードするため、秀丸エディタからは一つのDLLをロードすればOKです。
複数DLLを使う方法2
外部のDLLを使わない方法です。秀丸エディタの制限を逆手に取った方法なので、将来的には使えなくなるかもしれません。
マクロ自体は秀丸エディタが切り替わっても問題はありませんが、loaddllで読み込んだDLLは、読み込んだ秀丸エディタでしか有効になりません。そこで、使用したいDLLの数だけ秀丸エディタ(ステルスで)を開き、個々にDLLをロードします。 DLL関数を使う場合は、setactivehidemaru文を使い、使用したいdllをロードした秀丸エディタに切り換えて、DLL関数を使用します。
DLL1をロードした秀丸エディタ
↑
メインの秀丸エディタ──┤ 使用するDLLごとに秀丸エディタを切り換える
↓
DLL2をロードした秀丸エディタ
欠点としては、秀丸エディタの管理が面倒なことと、ウィンドウの切り替えを行うために、ちらつく場合があることです。
作成:2009/09/06 更新:2011/12/17
複数のDLLを使う方法でも書きましたが、loaddll文/関数の有効範囲はコマンドを実行した秀丸エディタだけです。秀丸エディタを切り換えた場合は新たにロードし直す必要があります。
loaddll "test.dll";
#n = dllfunc("function1"); ← OK
・
openfile "hogehoge.txt"; ← 新しい秀丸エディタを開いたので、test.dllはロードされていない。
#n = dllfunc("function1"); ← NG test.dllがロードされていないので、エラーになる。
・
・
マクロヘルプ-DLL呼び出し機能にある、「loaddll(文)」の項目を、参照して下さい。
秀丸担当さんによると、
別の秀丸エディタではプロセスが別になっているので、
原理的にDLLを共通にすることはできないです。
(turukame.3:03567より抜粋) とのことです。
Ver.8から追加された、loaddll関数を使用した場合は、マクロ実行時のみ、ロードした秀丸エディタで有効です。
Ver.8.00で loaddll関数でロード後、ウィンドウを切り替え再びロードしたウィンドウに戻っても、 loaddll関数が無効になっています。 (dllfuncを使うと、「DLLがロードされてないのにdllfunc関数が使われました」とエラーになる。)
これは、Ver.8.01で修正予定です。 Ver8.01β2で修正されています。
作成:2009/08/23 更新:2009/08/31
マクロでmidstrを使って文字を切り出しascii関数に入れると、2バイト文字の先頭バイトの場合は0x8100以上をかえします。(下位バイトは常に00になる) これを利用すれば2バイト文字の判定は可能です。
秀丸エディタ Ver.8β6 より、ascii関数の仕様が変更され、1バイトだけの場合は、マルチバイト文字の上位バイト範囲内でも、そのまま文字コードを返します。2バイト以上で、Shift_JIS範囲内の場合は、Shift_JISコードを返します。
ちなみに、2バイト文字の下位バイトは0x40~0x7E、0x80~0xFCであるため、 ASCIIコードの範囲と重なっています。そのため、0xXX00 か 0xXX の値がかえってくるので、下位バイトのみで判定することは出来ません。必ず上位バイト側からチェックする必要があります。
マクロのascii関数は、0x81~0x9F、0xE0~0xEFの範囲(2バイト文字の先頭バイト割り付け範囲)を引数に与えられると8ビットシフトし0xXX00で返しているだけです。
実験マクロ
debuginfo 1;
$test = "01234567";
##len = strlen($test);
##cnt = 0;
while(##cnt < ##len){
$$check = midstr($test, ##cnt, 1);
debuginfo "check = " + $$check + " hex = " + hex(ascii($$check)) + "\n";
##cnt = ##cnt + 1;
}
endmacro;
実行結果
check = 0 hex = 30
check = 1 hex = 31
check = 2 hex = 32
check = ・hex = 8200
check = R hex = 52
check = ・hex = 8200
check = S hex = 53
check = ・hex = 8200
check = T hex = 54
check = 6 hex = 36
check = ・hex = 8200
check = V hex = 56
実行結果(Ver.8β6以降)
check = 0 hex = 30
check = 1 hex = 31
check = 2 hex = 32
check = ・hex = 82
check = R hex = 52
check = ・hex = 82
check = S hex = 53
check = ・hex = 82
check = T hex = 54
check = 6 hex = 36
check = ・hex = 82
check = V hex = 56
実験マクロ その2
debuginfo 1;
$test = "01234567";
##len = strlen($test);
##cnt = 0;
while(##cnt < ##len){
$$check = midstr($test, ##cnt, 2);
debuginfo "check = " + $$check + " hex = " + hex(ascii($$check)) + "\n";
##cnt = ##cnt + 1;
}
endmacro;
実行結果
check = 01 hex = 30
check = 12 hex = 31
check = 2・hex = 32
check = 3 hex = 8252
check = R・hex = 52
check = 4 hex = 8253
check = S・hex = 53
check = 5 hex = 8254
check = T6 hex = 54
check = 6・hex = 36
check = 7 hex = 8256
check = V hex = 56
秀丸エディタ ver.8より、文字列を、文字単位で扱う関数が追加されています。文字単位で切り出し、コードを確認すれば、2バイト文字の判定は可能です。 (サロゲートペアとか、結合文字の場合の動作は、確認していません。)
実験マクロ その3
debuginfo 1;
$test = "01234567";
##cnt = 0;
##len = wcslen($test);
while(##cnt < ##len){
$$check = wcsmidstr($test, ##cnt, 1);
debuginfo "check = " + $$check + " hex = " + hex(ascii($$check)) + "\n";
##cnt = ##cnt + 1;
}
実行結果(Ver.8β6以降)
check = 0 hex = 30
check = 1 hex = 31
check = 2 hex = 32
check = 3 hex = 8252
check = 4 hex = 8253
check = 5 hex = 8254
check = 6 hex = 36
check = 7 hex = 8256
秀丸エディタ上ではcodeキーワードを使えば判定できます。
作成:2006/12/30
編集中のファイルを関連づけされたプログラムで開く方法です。
run "rundll32.exe url.dll,FileProtocolHandler " + filename;
起動するプログラムによっては、ファイル名を「"」囲ったり、filename3を使った方がいい場合もあります。
編集中のスクリプトの実行とか、編集中のhtmlファイルをブラウザで開くとかに使えます。
秀丸エディタVer.6.50β11より、openbyshell文に引数が指定できるようになり、上記方法を使用しなくても関連づけ起動が可能になりました。
コンソールプログラムの中にはいまだに有用なプログラムが多数あります。
秀丸エディタからもコンソールプログラムが使えますが、実行中はコンソールが表示されてしまい見栄えが悪いです。(">con"の場合は大丈夫ですが。)コンソールを表示しないようにするには">nul"を指定すればいいのですが、リダイレクト出力を使用したい場合には使えない場合もあります。その場合はバッチファイルを経由して実行します。
バッチファイルの中身 test.bat
ruby -Ks test.rb %1 > %2
マクロの例
run "test.bat " + filename + " outfile > nul"
バッチファイルはマクロに添付するか、マクロ実行中に作成し作業終了後に削除する方法もあります。
マクロ作成時に使用しているマクロです。"内部的な値を表現するキーワード"を新規秀丸エディタに出力します。
「ファイルタイプ別の設定」の詳細(config文で指定できる物)
「ファイルの保存」ダイアログで、保存位置を任意のフォルダにする方法です。
//C:\TEMPをカレントにする例 ここから
$base = basename;
$name = filename2;
//保存フォルダ指定 最期に"\\"を付けること
$savefolder = "C:\\TEMP\\";
//更新されているかどうかのフラグ
#update_flg = updated;
//保存先のフォルダをベースに名前を変更
changename $savefolder + $base;
//saveダイアログ表示
SAVEAS;
if(!result){
//キャンセルした場合はファイル名を元に戻す。
changename $name;
//何も編集していない状態でも(更新)になってしまうのでフラグをみて強引に解除。
if(#update_flg == 0) clearupdated;
}
//ここまで
「SAVEAS」は編集中のファイルのあるフォルダを開くので、ファイル名を保存したいフォルダに変更してから「SAVEAS」を実行。
「ファイルを開く」ダイアログで、開く位置を任意のフォルダにする方法です。
制限はありますが、動作環境で指定することも可能です。 ([HMEXXXXA]●ファイルを開く場合、最初に開く場所を指定したいを参照)
openfileは引数にファイルを指定できますが、ここでフォルダとワイルドカードを指定すれば任意のフォルダを開くことが出来ます。
openfile "C:\\TEMP\\*.txt";
欠点としてはワイルドカードを一つしか設定できない点です。
OPEN文はメニューやツールバーの「開く」を押した場合と同じです。通常は編集中の文書のあるフォルダを開いてしまいますが、ステルス秀丸エディタを使い任意のフォルダで開きます。
$folder = hidemarudir;
#main = hidemaruhandle(0);
//ダミーの秀丸エディタを非表示(ステルス)状態で開く。
//openfile "/n /h " + $folder + "\\dummy" + filetype;
//秀丸エディタを非表示(ステルス)状態で、フォルダを指定して開く。
openfile "/n /h /d " + $folder;
#sub = hidemaruhandle(0);
OPEN;
//「キャンセル」の場合はマクロを起動した秀丸エディタに制御を戻す。
//「開く」の場合は開く秀丸エディタに制御が移るので問題ない。
if(!result) setactivehidemaru #main;
//ダミーの秀丸エディタを閉じる。(自分自身は無効)
closehidemaruforced #sub;
//マクロ終了時に表示されるはずだが、念のため。
showwindow 1;
openfile文と違い「動作環境」で設定した拡張子と現在編集中の拡張子をもつファイルが表示されます。
秀丸エディタが「保存」するまでファイルの作成を行わない事を利用し、ステルス秀丸エディタで任意位置のダミーファイルを指定してカレントフォルダを変更しています。
OPEN文はメニューやツールバーの「開く」を押した場合と同じです。通常は編集中の文書のあるフォルダを開いてしまいますが、秀丸エディタ Ver.8から追加された、 COM操作機能をつかい、カレントフォルダを変更します。
//フォルダの設定
$opendir = "C:\\";
//シェルオブジェクトの作成
#n = createobject("WScript.Shell");
if(#n == 0){
message "オブジェクトの作成に失敗しました。";
endmacro;
}
//カレントフォルダの変更
setpropstr #n, "CurrentDirectory", $opendir;
if(!result){
message "カレントディレクトリの変更に失敗しました。";
}
//ファイルを開く
OPEN;
endmacro;
Hidemarnet Explorer関連。
カーソル位置がURLと認識出来る場合
「...を開く」と「...を秀丸エディタで開く」をキーに割り当てれば、キーボードでリンクを開ける。
ちなみに選択状態だと選択されている文字列を対象にするので、URLと認識できる箇所の場合は選択を解除したほうがいい。
URL を指定して開く場合
ブラウザモードのファイルタイプは、webbrowseなので、
if(filetype == "webbrowse")
で判断が可能。
ソースモードのファイルタイプは、".cgi"でも".php"でも.htmlなので、 filetypeで判定は出来ない。現状(秀丸エディタ Ver.4.10β29)ではfilenameとbasenameは同じ内容でURLを返す。ファイル名には":"と"/"は使えないので、"http://"かどうかを判定すればいい。
if(strstr(basename,"http://") == 0)
httpsもサポートしているようなので、
if(strstr(basename,"http://") == 0 && strstr(basename,"https://") == 0)
でも、何となく長いので、
if(basename == filename)
にしたが、"grep"、"new" の場合に誤判定してしまう。
ということで、
if(basename == filename && strstr(basename,"http") == 0))
にした。
もしかしたら、
if(basename == filename && strstr(basename,"://") != -1))
でもいいかも。
ブラウザモードだと先頭行がtitleタグの内容になるので、
$title = gettext(0, 0, 255, 0);
if($title == ""){
$title = "No Title";
}
で取得できます。まぁ、正確に取得するなら以下の方法かな?
//カーソルを移動し、必要な長さだけ取得する方法
//マクロ起動時のカーソル位置保存
#x = x;
#y = y;
//先頭に移動
moveto 0,0;
$title = gettext(0, 0, linelen2, 0);
if($title == ""){
$title = "No Title";
}
moveto #x, #y;
URLはbasenameで取得できるし、タイトルも取得可能なのでショートカット(*.URL)も簡単に作成できる。
レジストリの設定内容関連です。
openfile を使えば任意のモードで表示出来ますが、新しいウィンドウが開いてしまいます。新しいウィンドウを開かずに現在のモードを切り換える方法を、セイジ氏が秀ネットのフォーラムに投稿しています。
秀ネットの投稿 turukame.3:05920を参照して下さい。
リンク部の表示はタグに囲まれた文字になり(通常のwebブラウザと同じ)、実際にリンクされているアドレスは、自動的に番号が振られ、最期に出力されます。
秀丸エディタには
<a href="https://hide.maruo.co.jp/">『 秀まるおのホームページへ 』</a>
というhtmlは、
[xx:『 秀まるおのホームページへ 』.]
と表示され、ページの最期に、
xx:https://hide.maruo.co.jp/
と、他のリンク一緒に、まとめて表示されます。
"["、"xx:"、".]"は自動的に追加されます。 "xx"が自動的に振られる番号で、この番号を元にリンク先を探します。
カーソルの位置がリンク部分かどうかは、colorcodeで判断します。"0x0C15"ならばリンクされている部分です。リンク部の先頭は、必ず"[xx:"となっているため、これを検索し、"xx:"の部分を取得します。
searchup "(?<=\\[)[0-9]+?:", regular;
"xx:"を使って検索すれば、リンク部分のアドレスが取得できます。
絶対パス(http://~)でない場合は、相対パスなので、fienameと組み合わせて絶対パスにします。
リンク部の表示は<a>タグで指定された文字になり、実際にリンクされます。
秀丸エディタには
<a href="https://hide.maruo.co.jp/">『 秀まるおのホームページへ 』</a>
というhtmlは、
[a:https://hide.maruo.co.jp/]『 秀まるおのホームページへ 』
と表示されます。
カーソルの位置がリンク部分かどうかは、colorcodeで判断します。"0x0C15"ならばリンクされている部分です。リンク部の先頭は、必ず"[a:"となっているため、これを利用し、正規表現(前方一致指定)を使って、 URL部分のみ取得します。
searchup "(?<=\\[a:)[^\\]]+",regular;
絶対パス(http://~)でない場合は、相対パスなので、filenameと組み合わせて絶対パスにします。
Visual Basic 6.0向け
2024/09/24 PowerShellから「UI Automation」を使う方法を修正
webブラウザのメモ。識別に必要なウィンドウクラス名とDDEサービス名などいろいろ。
ブラウザによっては、ウィンドウクラス名だと識別はできない。どうしても識別したい場合は、ウィンドウハンドルから実行ファイル名を調べるか、ウィンドウのキャプションから判断する。(自分でDLLを作らないと無理。)
ブラウザの資料?(DDE通信)
ブラウザ名 | ウィンドウクラス名 |
DDEサービス名 (アプリケーション名) |
その他 |
Internet Explorer(4~10) | IEFrame | IEXPLORE | IE8はWindowsXP SP3/Windows Vista SP1/Windows7で確認。 IE9はWindows Vista SP2で確認 IE10はWindows 7 SP1で確認 IE8以降、WWW_GetWindowInfo使用時、日本語タイトルが途中で切れる場合がある。 |
Netscape(6.x~7.x) | MozillaWindowClass | Netscape6 | Netscape7.xxでも”Netscape6” |
Netscape(8.x) | NS_AE_WindowClass | Netscape Browser | |
Mozilla | MozillaWindowClass | Mozilla | release or branch? |
Mozilla | MozillaUIWindowClass | Mozilla | trunk? |
Firefox | MozillaWindowClass |
DDE未対応 (Firefox) |
Ver.4.0pre~ e10sが有効だと、DDE通信(WWW_GetWindowInfo)に失敗する。(2016/09/19) Ver.57から、デフォルトでマルチプロセス機能(e10s)が有効になっている為、一部のDDE通信は正常に動作しない。 Ver.70.0.1 では、DDE通信未対応へ |
Firefox | MozillaUIWindowClass | Firefox | ~Ver.3.6.10 |
SeaMonkey | MozillaUIWindowClass | SeaMonkey | |
Sleipnir(1.66) |
Afx:******* 起動するたびに変わる |
SLEIPNIR | DDEサービス名は変更可能 |
Sleipnir(2.xx) | SleipnirMainWindow | Sleipnir | どのコマンドまで実装されているかは不明。 |
Sleipnir(3.xx/4.xx) | MainWindow | Sleipnir | DDEの動作を確認したのは、Ver.3.0.5(それより前ではたぶん動かない。) |
Sleipnir5 | MainWindow | Sleipnir5 | DDEの動作を確認したのは、Ver.5.0.0.4 |
Sleipnir6 | MainWindow | Sleipnir6 | DDEの動作を確認したのは、Ver.6.0.0.4 |
Opera(Ver.10) | Opera Main Window/OpWindow/OperaWindowClass | Opera | |
Lunascape3 | Lunascape3MainWnd | DDE未対応 | |
Lunascape4 | Lunascape4MainWnd | Lunascape | Version 4.5.0 beta2より対応(まともに動いたのはbeta3以降) |
Lunascape5 | Lunascape5MainWnd | Lunascape | |
Lunascape6 | Lunascape6MainWnd | Lunascape | DDEが動作するのは、IEエンジン使用時のみ。webkit使用時は動作しない。 |
Google Chrome(Ver.1) | Chrome_VistaFrame/Chrome_XPFrame | DDE未対応 | Windows Vista/XPで調査 ウィンドウクラス名はOSにより異なる。クラス名は”Chrome_ContainerWin_0”で検索した方が、いいかもしれない。 |
Google Chrome(Ver.2,Ver.3) | Chrome_WidgetWin_0 | DDE未対応 | Windows Vista/XPで調査。OSによるクラス名の違いはない。Ver.3はVistaのみで確認。 |
Google Chrome(Ver.4) | Chrome_WindowImpl_0 | DDE未対応 | Windows Vista/XPで確認。 |
Google Chrome(Ver.5~16) | Chrome_WidgetWin_0 | DDE未対応 | Windows Vistaのみで確認。 |
Google Chrome(Ver.27~) | Chrome_WidgetWin_1 | DDE未対応 | Windows Vistaのみで確認。トップレベルウィンドウのクラス名は「Chrome_WidgetWin_1」その下の子ウィンドウのクラス名は「Chrome_WidgetWin_0」どのバージョンで変わったかは不明 |
Opera(Opera Next 15.0~) | Chrome_WidgetWin_1 | DDE未対応 | ウィンドウクラス名だけで、Google Chrome との識別はできない。ウィンドウのキャプションを取得すれば可能? |
Microsoft Edge | ApplicationFrameWindow/TabWindowClass | DDE未対応 |
Windows10のバージョンにより色々異なる場合がある。 ストアアプリのウィンドウクラス名は、全部”ApplicationFrameWindow”になるので、ウィンドウクラス名だけで判別は無理。ウィンドウのキャプションを取得し、“- Microsoft Edge”が含まれていることを確認すること。または、子ウィンドウである”TabWindowClass”をチェックする。ただし、アクティブなタブは、“ApplicationFrameWindow”のキャプションから判断することになる。 |
Microsoft Edge(Chromium版 Ver.80.0.334.2) | Chrome_WidgetWin_1 | DDE未対応 | ウィンドウクラス名はGoogle Chromeと同じなので、ウィンドウクラス名だけで判別は無理。ウィンドウのキャプションを取得し、“- Microsoft Edge”が含まれていることを確認すること。 |
ブラウザの資料?(COM/OLE)
ブラウザ名 |
COM/OLE オブジェクト名 |
その他 |
Internet Explorer(4~8) | InternetExplorer.Application | 起動済みのIEを調べるには”Shell.Application”を使う。 IE8はWindowsXP SP3/Windows Vista SP1/Windows7βで確認 |
Sleipnir(1.66) | Sleipnir.API | |
Sleipnir(2.xx) | Sleipnir.API | |
Lunascape3,4,5,6 | Lunascape2.LunascapeAPI | Lunascape6では、IEエンジン使用時のみ。webkit使用時は動作しない。 |
サポートしているコマンドは各自で調べること。
Sleipnir はウィンドウクラス名では検索できない。(Ver 1.66の場合)
そのまま起動してしまえばだいたいタブに追加される。(Sleipnir側の設定による)
Mozilla、Netscape7、Firefox で新しいタブで開く方法
コマンドはないので(デフォルトでは) "Ctrl+T" を送り、新しいタブを開かせてからDDE通信を行えばいい。キーの送信は秀丸エディタでは出来ないので、外部ツールかDLLを使うしかない。各種拡張でDDE通信からでもタブで開けるようにすることも可能。
Firefoxはどのバージョンから有効なのかわからないが、コマンドラインオプションが追加されている。
Mozilla、Netscape7、Firefox の WWW_GetWindowInfoコマンド
英数字はいいけど、2バイト文字は化けます。キャラクタコードを見るとUnicodeの下位バイト?
ブラウザと連携するのは関連づけ起動を使うのが簡単ですが、htmlファイルをwebブラウザで表示しようとすると、常に新しいwebブラウザが起動してしまう場合があります。これはDDEの設定が行われていないか、DDEを使わないようにしている場合だと思います。
ブラウザとDDE通信をするためのサンプル。クラス名、ファイルパス、サービス名、URLを入れれば動くと思う。
//ブラウザを確認するためのウィンドウクラス名
$ClassName = "";
//起動するためのファイルパス
$Program = "";
//DDE通信で使うサービス名
$DDEName = "";
//Profileを使い分けている場合は使用するプロファイル名を指定
// Mozilla,Firefox,Netscapeのみ
$Profile = " -P \"prifilename\"";
//アドレスの指定
$URL = "開きたいアドレス";
#ret = findwindowclass($ClassName);
if( #ret == 0 ) {
//ブラウザが見つからないので起動する。
run "\""+ $Program + "\"" + $Profile;
}
//ブラウザが見つかったのでDDE通信でURLを渡す。
ddeinitiate $DDEName, "WWW_OpenURL";
if( !result ){
message "DDEの初期化に失敗しました。";
ddeterminate;
endmacro;
}
$ret = dderequest($URL + ",,0xFFFFFFFF,0x1,,,");
if( !result ){
message "DDEコマンドが失敗しました。";
}
ddeterminate;
endmacro;
"WWW_OpenURL"について
以下の内容は、Netscape(おそらくはVer.4.xxのころ)の仕様を元に書いています。その為、IE、Opera、Mozilla、Firefoxでは動作が違う場合があります。
webブラウザに対してURLを送り、指定したURL開かせる命令です。引数はいくつかありますが、
が、主な引数になります。
第三引数は開くウィンドウを示し、本来ならWindowIDを指定しますが、 0xFFFFFFFFを指定することにより、最期にアクティブだったウィンドウで開きます。 (ちなみにFirefoxの場合、""を指定すると(設定や拡張にもよりますが)新しいウィンドウで開きます。)
第四引数はキャッシュ等のフラグです。
ORで指定できるので、0x3でドキュメント、イメージのキャッシュを使用しないという意味になります。
ブラウザのコントロール
タブ・ブラウサを使用している場合、新しいタブで開きたいとか、表示しているタブで開きたいなど、要望があるかも知れませんが、これはかなり難しいです。
Firefoxメモ
Firefoxのウィンドウクラス名
ウィンドウクラス名は、ブラウザウィンドウだけではなく、以下のウィンドウも同じクラス名を使用している。その為、ウィンドウクラス名だけでは、ブラウザが起動しているか確実な判断はできません。
起動オプションの"-new-tab"を使う場合の注意
"-new-tab"を指定し、タブを追加するには、ブラウザウィンドウが起動している必要がある。起動していないと、"-new-window"を指定したように、新しいウィンドウが開き表示される。
マルチプロセス機能(e10s) を有効にしていると、DDE通信が失敗する。(確認したのは Nightly 51.01a 2016/09/19) Firefox 57.0 から、マルチプロセス機能(e10s)がデフォルトで有効化されています。
その為、DDE通信が正常に動作しないものもあります。
Firefox 70.0.1 だと DDE通信自体が使用できない。(Firefox 67から?)
Microsoft Edge メモ
ウィンドウクラス名は、"ApplicationFrameWindow" になるが、ストアアプリは全部"ApplicationFrameWindow" なので、ウィンドウクラス名だけでは判断できない。「Edge」の実体は、"TabWindowClass"になるので、こちらで判断する方がいい。
Microsoft Edge(Chromium版)は、「Google Chrome」と同じ「Chrome_WidgetWin_1」なので、ウィンドウクラス名でブラウザを識別できない。
関連づけが「Edge」の場合は、関連づけ起動を行えばいいが、違う場合はストアアプリである「Edge」を起動するのは、非常に面倒です。
URLの場合は、URI スキーム名 "microsoft-edge:" を使うのが簡単です。
microsoft-edge:https://hide.maruo.co.jp/
URLの先頭に"microsoft-edge:"を追加し、関連づけ起動を行います。
ローカルファイルの場合は、"microsoft-edge:"を指定しても、開くことは出来ない。 (file:///~ と言う形式で指定してもローカルファイルは開かない)
ストアアプリは以下の方法から起動可能なので、引数にローカルファイルを指定すればいい。
shell:AppsFolder\<PackageFamilyName>!<ApplicationId>
「PackageFamilyName」と「ApplicationId」はショートカットから読み取れるし、VBS、PowerShellのスクリプトで調査可能。
コマンドプロンプトからは以下のコマンドでローカルファイルを開くことが出来る。
start shell:AppsFolder\Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge ローカルファイルパス
"start" がないと開かないので関連づけ起動している。
WSHのWshShellオブジェクトを使うと、関連づけ起動が可能なので、WSH(VBS)の場合は、以下のスクリプトでURLやローカルファイルをEdgeで開くことが出来る。
Option Explicit
Dim WshShell
Dim WshArgs
Set WshArgs = WScript.Arguments
if WshArgs.Count > 0 then
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "shell:AppsFolder\Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge " & WshArgs.Item(0)
Set WshShell = Nothing
End if
Set WshArgs = Nothing
WScript.Quit 0
上記スクリプトをベースにすれば、秀丸マクロからEdgeを呼び出す事が可能。
秀丸エディタからは、「openbyshell文」で関連づけ起動が可能ですが、 Ver.8.77までは、"microsoft-edge:~"や、"shell:AppsFolder~"を指定しても、関連づけ起動できません。これは 秀丸エディタ Ver.8.79 で修正されます。
Microsoft Edge(Chromium版)は、デスクトップアプリなので、実行ファイルの場所さえわかれば、起動可能です。
Microsoft Edge(Chromium版) でも「URI スキーム名」は有効(Ver.83.0.478.56で確認)。「UI Automation」から見た構成は、「Google Chrome」とかなり異なり、取得できる情報も違いがある。各コントロールにクラス名が付いているので、検索はしやすいかもしれない。
「UI Automation」を使ってwebブラウザから情報を取得する方法
Windows10で動作する主要なWebブラウザ(Google Chrome、Firefox、Edge)は、DDE通信は使えない。
起動中のブラウザから情報を取得するには、「UI Automation」を使う方法があるが、ブラウザ毎に取得方法が異なるし同じブラウザでも、バージョンによって異なる場合もある。
秀丸マクロで直接「UI Automation」を扱うことは無理なので、別の言語を使う必要がある。
「UI Automation」を使って情報を取得するには各アプリケーションの構造を調べる必要がある。構造を調べるには「Inspect (Inspect.exe)」を使う。
AutoIt3 + UIASPY を使って、Google Chrome(Ver.101.0.4951.54)、Firefox(Nightly 102.0a1)、Edge(Ver.101.0.1210.39) を対象に以下の動作をさせてみた。
「表示しているページのタイトルとURLを取得」は、URL入力用エディットボックスから「URL」を取得できるが、アドレスと検索入力欄が同じコントロールなので、場合によってはURLを取得できない。また、URLの先頭にプロトコル("http://" or "https://")が付かない場合もある。タイトルも、ウィンドウのタイトルバーから取得できるが、最後にブラウザ名が付いてくる。確実に表示しているページの「URL」と「タイトル」を取得するには、各情報をもつコントロールを見つけて、プロパティを取得する必要がある。
「指定されたURLを開く」場合は、「URL」の入力欄を書き換える必要がある。
Firefoxの場合、「UI Automation」 から書き換えが出来ないので、文字列を送信するしかないが、IMEの状態も確認が必要。
Firefox、Chrome 、Edge は「UI Automation」から書き換え・設定可能だが、最終的には「リターンキー」を送信する必要がある。
(「リターンキー」以外の方法があるかまでは未調査)
その為、タブは増えてしまうが、「URL」を引数にwebブラウザを呼び出すのが一番簡単。
「開いている全てのタブ」の情報を取得するのは、Firefoxがやりやすい。タブを切り替えなくても「URL」、「タイトル」を取得できる。 Chrome と Edge は「タイトル」は取得可能だが、「URL」を取得するには、タブを切り替える必要がある。
「更新」させるのは、「UI Automation」で更新を行うボタンを取得できれば簡単にできる。
PowerShell
PowerShell から「UI Automation」を使っても、ブラウザによっては「Inspect (Inspect.exe)」で確認した内容と違う結果になります。
原因はよくわかりませんが、Microsoft Edge(Chromium版) だと問題ないので、アプリケーション側の問題かもしれない。
Google Chrome や Firefox の場合はPowerShellスクリプトから C# で「UI Automation」部分を直接記述するようにしてください。 C#からも「Inspect (Inspect.exe)」と同じ内容が取得できないので、「FlaUI」等のライブラリを使った方がいいでしょう。 (拡張機能無しの、C#・PowerShell からだとどうしてもうまくいかない)
マクロ作成時、秀丸エディタの機能でどのコマンドを使っていいのかわからない場合は「キー操作の記録」を使います。キー操作の記録を開始し、使いたい機能を実行して記録を停止。「キー操作の保存」でファイルに保存できるので、適当な名前をつけて保存し秀丸エディタで開けばコマンドがわかります。
[注意]
update:2014/03/29 確認用マクロを変更し説明用画像を追加
ここでの カーソル移動コマンド とは、moveto、movetolineno goline~ のコマンドの事です。
選択モードを終了しても範囲選択状態でカーソル移動コマンドを使うと、移動した場所まで範囲選択状態になります。 (範囲選択が広がってしまう。)
確認用マクロ
//範囲選択開始
beginsel;
moveto x + 3, y;
//範囲選択モード解除
endsel;
message "範囲選択終了";
//範囲選択モードを解除したはずなのに移動したカーソル位置まで選択される。
moveto x + 3, y + 3;
message "カーソル移動";
endmacro;
動作的にはおかしいけど、現状(2004/05/22)においては仕様ということです。
範囲選択した後の操作(コマンド?)で範囲選択が解除されれば問題はないが、解除されない場合にカーソル移動を行うと思わぬ結果になるので注意。
この動作を回避するには、範囲選択終了後に、一度カーソルを動かせばいい。(left、right等)
田楽シリーズのVer.2.70 から、SLEEP関数が追加されています。
秀丸エディタVer.8.00 から、sleep文が追加されています。
マクロでループ処理を行うとCPUを使い切ってしまいます。 NT系OSだとまだいいのですが、Windows9x系だと固まったように見えたりします。そこでWSHを使ったCPU負荷の低減の方法です。(WSHを使うので Windows 98 以降が必要。)
以下の内容を"sleep.vbs"として保存します。
'100mS停止するvbs
Wscript.Sleep 100
"sleep.vbs" をrunsync2 で呼び出せばOKです。
call WaitMillisecond1 10000;
call WaitMillisecond2 10000;
endmacro;
//サブルーチン本体
WaitMillisecond1:
##goaltime = tickcount + ##1;
while(##goaltime > tickcount);
return;
//サブルーチン本体
WaitMillisecond2:
##goaltime = tickcount + ##1;
while(##goaltime > tickcount){
runsync2 "Wscript.exe " + currentmacrodirectory + "\\sleep.vbs";
}
return;
秀丸担当氏によると、
裏技的に ddewaitadvice "",1000; などとすればCPUを食わずに待つこともできてしまいますが
(秀丸エディタβ版&秀丸メール常連さんフォーラム秀丸エディタβ版会議室 07627より引用)
という方法もあるとのことです。しかし、DDE通信は秀丸エディタを切り換えると自動的に終了するので、秀丸エディタを切り換えるようなマクロでは、たぶん使用できません。
秀丸エディタ Ver5.00β27より"settabmode"コマンドが追加された為、レジストリ操作は必要なし。
reg.exeを使う方法を追加
マクロでレジストリの読み込みは出来ますが場所がわかっていないと駄目です。つまり、任意部分の値を列挙することは出来ません。
そこで OS に付属されている regedit.exe を使ったレジストリ値の列挙方法を紹介します。方法はいたって単純で、レジストリデータのエクスポート機能を使うだけです。
注意 Windows Vista以降、UAC(ユーザー・アカウント制御)が有効な場合、権限の昇格が必要な為、マクロからレジストリエディタを起動しようとしても、失敗します。
レジストリエディタのエクスポート方法
regedit /e /a 出力ファイル名 レジストリの場所
/e エクスポート処理
/a ASCIIコードで出力(NT系は デフォルトでユニコード)
これで指定したファイルにレジストリデータがテキスト形式で出力されるので、これを解析します。 (grepを使うのがいいでしょう。)
注意事項としては指定されたレジストリデータ全てを出力するので、指定した場所によっては、ファイルが巨大になる可能性があります。
Windows Vista以降、UAC(ユーザー・アカウント制御)が有効な場合、権限の昇格が必要な為、マクロからレジストリエディタを起動しようとしても、失敗します。そのため、WMI(Windows Management Instrumentation)を使用し、レジストリデータを取得します。
参考にしたwebサイト
MicrosoftのWMIスクリプト入門 - WMI スクリプト入門
秀丸エディタ Ver.8から、COMを使えますが、結果を格納するのに文字列型の配列が必要になるため、残念ながら、秀丸マクロから直接データを取得できません。
WMIを利用したマクロの例(マクロに付属している、VBSがWMIを操作している。)
上記マクロは、秀丸マクロ → WSH(VBS)→ WMI とVBS経由し、レジストリにアクセスしています。マクロから実行した VBSで、列挙したレジストリデータを、iniファイル形式のファイルへ保存。秀丸エディタマクロ側からは、iniファイル経由で、レジストリ情報を取得しています。
Wimdows Vista以降に付属されている reg.exe のエクスポート機能を使ったレジストリ値の列挙方法です。 (reg.exe なら、レジストリエディタと異なり、権限の昇格が不要なので、マクロから実行しても、失敗しない。)
reg.exe のエクスポート方法
reg.exe export レジストリの場所 出力ファイル名 /y
/y 確認なしで、出力フィルを上書きする。
詳細は、コマンドプロンプトから「reg.exe export /?」と入力し表示されるヘルプを参照してください。
出力されるファイルの形式は、レジストリエディタ と同じ(Unicodeで出力される)なので、同じ方法で解析可能です。
マクロから呼び出すと、役に立つかもしれないScript各種? WSHは全部VBScriptです。
Ver.8 sleep文が追加されています。
指定された秒数待機します。引数に秒数を指定して下さい。マクロからrunsync/runsync2で呼び出すこと。
//10秒待機する
runsync2 "wscript.exe " + currentmacrodirectory + "\\sleep_sec.vbs 10";
Ver.8 deletefile文が追加されています。ゴミ箱に送ることも可能。フォルダも削除可能。
指定されたフォルダ、ファイルを削除します。(ゴミ箱には入らずに直接削除)
指定されたフォルダ、ファイルのショートカットを作成します。
Wscript.exe Tk_MakeShortCut.vbs "対象ファイル/フォルダ" "ショートカットのフルパス"
田楽シリーズのVer.2.80 から、同等の機能をもつMSGBOX関数が追加されています。
指定された時間に自動的に閉じるダイアログ。サンプルマクロ付き。
WSHとマクロのインタフェース
コマンドラインオプション
Wscript.exe popup.vbs "表示する内容" 待機時間 "タイトル" アイコンとボタン設定
iniファイル。popup.vbsと同じ場所にpopup.iniを作成しそこに出力する。
[result]
value=押されたボタンを示す数字
err_num=エラー番号
err_msg=エラーメッセージ
移動、コピー、削除、リネームを行うWSH(VBS)です。コマンドプロンプトを使えばできますが、WSHを使えば、コマンドプロンプトを表示させることなく、実行できます。
Wscript.exe fileutil.vbs cmd file1 file2
cmdには以下の文字を指定できます
空白を含むパスを指定する場合は"(ダブルコーテーション)で囲ってください。
Internet Explorer 7 または 8 を呼び出すWSH(VBS)です。複数のURLを指定した場合、タブで開きます。引数には、インターネットショートカットも指定可能です。 (CallIE.vbsにドロップすれば、そのURLを開きます。複数でも問題ないハズ。)
Wscript.exe CallIE.vbs URL1 URL2 …
関連項目
秀丸エディタ Ver.9.16 以降「browsefile関数」が使用できます。関数には初期フォルダとワイルドカードを指定します。複数ファイルの選択はできません。
マクロでファイル選択ダイアログを使ってファイル名を取得する方法です。田楽DLLを使えばコマンドは用意されていますが、これだけのためにDLLを使うのも面倒です。(この方法も十分面倒かもしれませんが・・・)
やっていることは単純で、非表示で開いてfilenameキーワードから取得しているだけ。
複数ファイルを選択した場合は、うまく動きません。レジストリを操作して、複数選択を出来ないようする方法もあります。 (レジストリを操作する場所は「開く」のダイアログボックスを参照。)
//起動した秀丸エディタのハンドルを取得
#main = hidemaruhandle(0);
//最初に開くフォルダの指定
$dir = macrodir;
//最初に表示する拡張子の指定
$ext = "*.mac";
//非表示状態で秀丸エディタを開く(ステルス秀丸)
//ワイルドカード($ext = "*.mac")を指定しているので、
//"ファイを開くダイアログ"が表示される。
openfile "/h " + $dir + "\\" + $ext;
//選択した秀丸エディタのハンドルを取得
#sub = hidemaruhandle(0);
//ファイル名を取得
//ファイルを選択した場合は、ファイルを(非表示のまま)開いているので、
//ファイル名を取得できる。
//キャンセルした場合は、新規ファイル(無題・新規ファイル)になるので、
//ファイル名は""となる。
$target = filename;
//マクロを起動した秀丸エディタに戻り、開いたファイルを(強制的に)閉じる
setactivehidemaru #main;
closehidemaruforced #sub;
//判定
if($target != ""){
message $target + "を選択しました。";
}else{
message "キャンセルされました。";
}
endmacro;
"HKEY_CURRENT_USER\Software\Hidemaruo\Hidemaru\Env"の設定です。個人で調査した結果なので、間違っている可能性もあるので、注意して下さい。
"DeleteAtNull"の値
A:保存するファイルが空だったときは確認する
B:無題で更新されていて、内容が空のとき、保存するかどうか確認する
C:"DeleteAtNull"の値
B│ A│ C
─┼─┼─
0│ 1│ 3
0│ 0│ 2
1│ 1│ 1
1│ 0│ 0
1:チェックあり
0:チェックなし
"DupOpen"の値
0:問い合わせる
1:上書き禁止
2:じファイルを2つ開くことを禁止する。
3:ファイルを読み直しする
秀丸エディタVer.6.0より追加された"setcompatiblemode文"を使用すれば、レジストリの書き換えを行わずに、一時的に変更が可能です。
"OpenDlg"の値
0x0a:旧タイプ
0x0b:旧タイプ(複数選択タイプ)
0x0c:Windows3.1タイプ
0x0d:Windows95タイプ
0x0e:Windows95タイプ(複数選択タイプ)
0x0f:Windows2000タイプ
0x10:Windows2000タイプ(複数選択タイプ)
0x11:WindowsVistaタイプ
0x12:WindowsVistaタイプ(複数選択タイプ)
0x0d:秀丸ファイラーclassic
0x10:秀丸ファイラーclassic(複数選択タイプ)
秀丸ファイラーclassicを使用するかしないかの設定 "ExplorerClassic"の値
0x01:秀丸ファイラーclassic チェックなし
0x03:秀丸ファイラーclassic チェックあり
"StatusBar"の値 0で表示しない、1で表示する。
"DockingStatusBar"の値 0で合体しない、1で合体する。
"StatusBarInfo"の値 誰か解析してください・・・。
"ShowF"の値 0で表示しない、8、10、12 でキー数設定
"FnFlat"の値 0で自動、1でフラット、2で非フラット
"TabEdit"の値 以下の値をORした値。
0x00000001:タブモード有効
0x00000002:[デザイン]「ボタン型」がON
0x00000004:[デザイン]「ウィンドウ右上の閉じる(×)ボタンでタブを全て閉じる」がOFF
0x00000008:[デザイン]「2つ以上開いているとき、・・・・」がOFF
0x00000010:[デザイン]「タブバーの右端に小さな閉じる(×)ボタンを表示」がOFF
0x00000020:[配 置]「閉じた後にアクティブにするタブ」が「左のタブ」
0x00000040:[配 置]「閉じた後にアクティブにするタブ」が「右のタブ」
0x00000100:[配 置]「新しいタブの位置」が「左端に追加」
0x00000200:[配 置]「新しいタブの位置」が「右に挿入」
0x00000300:[配 置]「新しいタブの位置」が「左に挿入」
0x00000800:[デザイン]「ウィンドウ幅からはみ出すとき」が「スクロール」
0x00008800:[デザイン]「ウィンドウ幅からはみ出すとき」が「複数段」
0x00001000:[デザイン]「アイコン表示」がOFF
0x00002000:[配 置]「外部から起動するとき」が「前面の秀丸エディタにタブを追加」
0x00004000:[配 置]「外部から起動するとき」が「常に新しいウィンドウ」
0x00XX0000:[デザイン]「幅を固定」のサイズ(0~255 0x00~0xFF)
0x01000000:[デザイン]「確認する」がON
0x02000000:[デザイン]「タブごとの閉じるボタン」が「右側に閉じるボタン(自動)」
0x04000000:[デザイン]「タブごとの閉じるボタン」が「アイコンを閉じるに(常に)」
0x10000000:[デザイン]「タブバーの位置」が下
0x20000000:[デザイン]「タブバーの位置」が非表示
全部解析してません・・・。
秀丸エディタVer.6.0より追加された"setcompatiblemode文"を使用すれば、レジストリの書き換えを行わずに、一時的に変更が可能です。
それぞれ、0でチェックなし、1でチェック有り
0でチェックなし、1でチェック有り
0でチェックなし、1でチェック有り
GrepDlgの値
0:普通タイプ
1:新タイプその2(フォルダ選択は旧式のまま)
2:新タイプ(フォルダ選択がエクスプローラ風)
"MacroPath"の値
"SettingPath"の値
"EventMacroFlag"の値 以下の値をORした値となる。
0x0004だけ意味が反転しているので注意。
Ver.7
0x0001 自動起動マクロを使用
0x0002 キャッシュ使用
0x0004 開いた直後を使用しない
0x0008 新規作成直後を使用
0x0010 保存直前と直後を使用
0x0020 印刷直前と直後を使用
0x0040 編集後タイマーを使用
0x0080 カーソル移動後タイマーを使用
0x0100 ファイルを閉じる直前
Ver.8で追加
0x0200 アクティ切り替え後
"HKEY_CURRENT_USER\Software\Hidemaruo\Hidemaru\Outline"にあるアウトライン解析の枠に関する設定
「アウトライン解析の枠」の表示設定をレジストリ操作で変更する場合、
という操作を行わないと、「その他」->「ファイルタイプ別の設定」で「アウトライン解析の枠」を開いた場合に、画面表示がおかしくなる場合があります。
Rightの値
0x0:左
0x1:右
0x2:上
0x3:下
0x1:浮かせる(Detailの値が0x1になる)
Detailの値 以下の値のOR
0x1:浮かせる(Rightの値が0x1になる)
0x2:枠の表示でウィンドウサイズを広げる
0x4:一覧の選択時にカーソルを上のほうに移動する
0x8:ドラッグ&ドロップ編集を可能にする
秀丸エディタのレジストリ内には記録されていません。 Windowsのアンインストール情報から取得するのがいいとのこと。 (hidesoft.2:15202より)
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Hidemaru"にある、以下の値から取得する。
64bit OSを使用していて、32bit秀丸エディタをインストールした場合には、レジストリのアクセスがリダイレクトされるので、場所が異なります。
64bit OSを使用している場合には、
の順番に調べるのがいいでしょう。
64bit OS使用時の レジストリリダイレクトに関する情報
秀丸エディタの設定をレジストリからアクセスするには、
と、3つの行程が必要です。ですが、iniファイルのアクセス関数を使うと1文ですみます。 iniファイル名を"hidemaru.ini"にすると、自動的にレジストリへのアクセスになります。これは16bit版時代のマクロにも対応するための処置ですので、非推奨の方法になります。
64bitでは、「JreDll」ではなく、「JreDll64」に記録される。
X64の値
DLL:32bit DLLをマクロのloaddllで動作可能にする
HMF:32bit 変換モジュール(*.hmf)を動作可能にする
X64:X64の値
HMF │DLL │X64
──┼──┼──
0│ 0│ 0x00
0│ 1│ 0x01
1│ 0│ 0x02
1│ 1│ 0x03
1:チェックあり
0:チェックなし
標準添付の変換モジュール内にある"Sort"の設定は以下に保存されている。
"HKEY_CURRENT_USER\SOFTWARE\Hidemaruo\Hidemaru\Hidemaruo_Sort_Org" の"Parameter"
filter関数のオプション指定に使える。
2009/09/26 ワイルドカードについて追記
openfileコマンドだけでなく秀丸エディタ本体の起動オプションにも関係があります。
openfileコマンドでファイルを指定する場合、空白を含むパスでも""で囲む必要はありません。しかし、複数ファイルを指定する場合は注意が必要です。
カレントフォルダにあるファイルを開く場合はフルパスを指定しなくても開きます。
ex)openfile "a.txt"; //a.txtを開く
カレントフォルダにある複数のファイルを指定すると、1つのファイルと見なされます。 (空白を含むパスでも開けるようにした為の副作用)
ex)openfile "a.txt b.txt"; //a.txtとb.txtを開く
実際は "a.txt b.txt" という新規ファイル扱いとなる。
この問題を回避するにはフルパスで指定するか、ファイル名を""で囲みます。(ファイルの区切りを明確にする。)
秀丸エディタ本体の起動オプション指定時も同じなので、バッチファイルで使う場合は注意が必要です。
hidemaru.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
というバッチファイルの場合、ファイル指定時に""で囲まないと指定した名前をすべて結合した新規ファイルと認識されます。(ファイル名をフルパスで指定すれば問題ない)
ちなみに、バッチファイルの内容を、
hidemaru.exe "%1" "%2" "%3" "%4" "%5" "%6" "%7" "%8" "%9"
とすると、ファイル指定がなくても9個の秀丸エディタが開いてしまいます。
NT系OSの場合は
hidemaru.exe %~f1 %~f2 %~f3 %~f4 %~f5 %~f6 %~f7 %~f8 %~f9
とすると、引数がフルパスに変換されて渡されるので問題ありません。
opnefileには、ワイルドカードも指定可能です。ワイルドカードを指定すると、指定されたフォルダを「ファイルを開くダイアログ」で開き、指定された拡張子のファイルを表示します。
例) openfile macrodir + "\\*mac";
ワイルドカードを指定する場合は、ダブルクォート「"」で、囲まないこと。 ( turukame.3:03948, turukame.3:05864 を参照)
秀丸エディタから、webの検索サービスを使用し、検索する場合には注意が必要です。
検索サービスで日本語を扱う場合、検索文字列をURLエンコードしブラウサに渡す必要があります。検索文字を渡す方法がDDE通信なら問題ありませんが、run文で起動オプションとして渡す場合、 %b、%d、%f が含まれていないか確認する必要があります。
%b、%d、%f はプログラム実行の詳細の所に説明がありますが、
%b:フォルダを除いたファイル名(basenameキーワードと同じ)
%d:フォルダ名(directoryキーワードと同じ)
%f:フルパスのファイル名(filenameキーワードと同じ)
という意味を持ってます。その為、URLエンコードした文字列の中に%f1、%b2、%b3 などがある場合、それぞれフォルダ名等に変換されてしまい、正しい検索ができません。ちなみに大文字、小文字は無視されるので、%B、%D、%F でも同じです。
例)引数を表示するvbsを実行した結果
//テストマクロ
$base = "原因究明";
#len = strlen($base);
#cnt = 0;
$out = "";
while(#cnt<#len){
$ret = hex(ascii(midstr($base, #cnt, 1)));
//2バイト文字の範囲は0xXX00と変換されるので補正
if(strlen($ret) > 2) $ret = leftstr($ret, 2);
$out = $out + "%" + $ret;
#cnt = #cnt + 1;
}
run "Wscript.exe " + macrodir + "\\argv.vbs " + $out;
endmacro;
検索文字 :原因究明
エンコード:%8C%B4%88%F6%8B%86%96%BE
ファイル名:C:\temp\test.mac
vbsに渡された文字列:%8Ctest.mac4%88C:\TEMP\test.mac6%8B%86%96test.macE
%8C%B 4%88%F 6%8B%86%96%B E
== == ==
これを防ぐには、%f --> %%f のように%%とするか、ブラウザを起動してからDDE通信でわたします。
秀丸エディタVer.6.50β11より、openbyshell文に、引数が渡せるようになったので、こちらを使った方がいいかもしれません。
秀丸エディタの「動作環境」->「検索」->「検索での表示」には「点滅表示」と「範囲選択」の2つがあります。マクロでは「範囲選択」に設定されているほうがいろいろと便利なので、「範囲選択」に設定されていることを期待している場合が多いです。マクロ起動時に秀丸エディタ本体の設定を書き換え、終了後に戻すマクロもあります。
秀丸エディタ Ver.4.10から追加された「foundtopx, foundtopy, foundendx, foundendy」のキーワードを使うと、秀丸エディタ本体の設定を書き換えずに「点滅表示」でも「範囲選択」と同様に選択された状態にすることが出来ます。
searchdown2 "検索文字";
if(result){
//「検索での表示」が「点滅」になっている場合の処理
//「範囲選択」なら選択状態になっている --> selectline キーワード
//「検索での表示」の状態 --> searchmode キーワード
// searchmode だけでいいかもしれない・・・。
if(!selecting && !searchmode){
//マッチした範囲を選択状態にする。
moveto foundendx, foundendy;
beginsel;
moveto foundtopx, foundtopy;
endsel;
}
}
秀丸エディタ Ver.6.00から追加された「setcompatiblemode文」を使えば、レジストリ操作なしで、マクロ実行時のみ設定を変更することが可能です。
秀丸エディタ Ver.5.00で検索文字列の強調表示ができるようになりました。その為、マクロで検索を使っていると検索した文字列が強調表示されてしまいます。
検索時に強調表示を行うかどうかは、searchoptionのビット11(検索、grep)、ビット12(置換)で設定できます。強調表示したくない場合は、このビットをマスクしてから検索・置換を実行します。ただし、検索・置換時の設定まで影響を受けるのでマクロ終了時に元の値に戻す必要があります。既存(秀丸エディタ Ver.5未対応)のマクロを使うと強調表示されないように設定される場合が多いです。
秀丸エディタ Ver.5.00β10 から変更があり、setsearchでビット11、12を変更する場合はビット13を"1"に指定しないと機能しないようになりました。この変更はVer.5に対応していないマクロを使用した場合に強調表示の設定が変更できないようにするための処置です。
searchoption は常にビット13がセットされているとのことなので、searchoptionの値をマスクして使う場合は気にする必要がありません。値を直にセットする場合は注意する必要があります。
秀丸エディタ Ver.5.00β12 から変更があり、searchdown等のオプションに"hilight"、"nohilight" が追加されました。 searchoption と違い、秀丸エディタ本体側の設定とは切り離されているとのこと。
$BAK_SEARCHBUFFER = searchbuffer;
#BAK_SEARCHOPTION = searchoption;
//検索時の強調表示の取り消し
setsearch $BAK_SEARCHBUFFER, (#BAK_SEARCHOPTION & 0xF7FF);
searchdown2 "・・・・", regular;
<処理をいろいろ>
//元の設定に戻す。
setsearch $BAK_SEARCHBUFFER, #BAK_SEARCHOPTION;
秀丸エディタ Ver.8.54β4 からマクロを使用する事で、分割位置を指定して分割できるようになりました。
split #splitmode, 1, 分割位置
(詳細は、マクロヘルプのsplit文 を参照のこと。)
また、秀丸エディタ Ver.8.54β6から、splitposキーワードが追加になり、分割位置を取得可能になりました。
マクロを使用する必要はありますが、分割位置を指定して分割する事も、分割位置をキーボードで変更する事も可能になっています。分割位置を変更するには、分割を解除する必要は無く、そのまま split文 で分割位置を指定して分割すれば可能です。
「ウィンドウの分割」時の以下キーワードは、対象がアクティブな(カーソルのある)枠になります。
windowheight、windowwidth は、全体のサイズではないので注意が必要です。また、「全体のサイズ = 分割した各枠の合計サイズ」 にはなりません。正確な全体のサイズを知るためには、分割を解除する必要があります。
分割を解除すると、カーソルのある枠内容を表示します。上限分割で各枠の内容が離れていた場合、一時的に分割を解除し、再度分割すると表示内容が変わってしまうので、分割解除前に、各枠のscreentopyや、座標等を保存しておく必要があります。
ウィンドウ分割とenabledraw は相性が悪いです。enabledrawは、
内部的にはウィンドウサイズをゼロとして高速に処理しています
との事なので、仕様の範疇になると思いますが、注意が必要です。
基本的に「ウィンドウの分割」はウィンドウを半分の位置でしか分割できませんが、任意位置、比率で分割する方法です。(例として1:2の比率で分割。)
半分でしか分割できないので、あらかじめウィンドウの高さを変えてから分割するということです。
//現在の高さ保存
#baseHight = windowheight;
setwindowsize windowwidth,(windowheight/(1 + 2)) * (1 + 1);
split;
setwindowsize windowwidth,#baseHight;
また、上記マクロを画面上部で実行した場合では「上段2:下段1」、画面下部で実行した場合では「上段1:下段2」となり、比率は同じものの、実行時のカーソル位置により異なる結果になります。これは画面高さを元に戻す際、アクティブ(カーソルがある)側の大きさを変更しているためです。
つまり、
ということを利用するとキーボードで分割位置を変更する事も可能になります。しかし、実際にやるとウィンドウのリサイズが多発するので、かなり画面がちらつくと思いますが・・・。
「ウィンドウの分割」時の「windowheight」キーワードはカーソルのあるウィンドウの高さを返します。全体の高さではありませんので注意が必要です。
割り当て可能なキーの一覧です。秀丸エディタ Ver.5からキーカスタマイズが大幅に強化され、いままで割り当てができなかったキーが使用できるようになりました。
「キー割り当て拡張」関連のマクロ開発で必要になったので作ってみました。
hmjre.dllのバージョン情報を秀丸エディタと同じ形式で取得する方法です。
Ver.5 --> 500
Ver.4.16 --> 416
message str(val(hex(dllfunc("JreGetVersion") & 0xFFFF))); #hmjre_ver = val(hex(dllfunc("JreGetVersion") & 0xFFFF));
10進数の範囲内でバージョン表記されている限りは大丈夫・・・。 16進数になった場合はヘルプの方法を使いましょう。
"ウィンドウのタブモード"関連のメモ
<注意> 秀丸エディタ Ver.5.00β31から各種タブ関連のマクロが追加されたため、各種キーワードを取得すればできるものもあります。
tabgrouptotalキーワードで取得可能 以下の方法を使わなくてもいい。
基本的にはhidemarucountを使ってループをまわし、各秀丸エディタからtabgroupを取得するしかない。
タブグループは連続しているとは限らないので、存在するグループ番号を取得するには、総当たりするしかない。
外部DLLを使う場合、表示されているトップレベルウィンドウで、"Hidemaru32Class"というクラス名を持つウィンドウの数がタブグループ数となる。(タブになっている場合、アクティブウィンドウ以外は非表示となる)タブグループの数はわかるが、グループ番号は取得できないので、ウィンドウハンドルから取得する必要がある。
ちなみに、表示されているウィンドウ=タブグループにおけるアクティブなタブ になります。
つまり、秀丸エディタのウィンドウ番号を使ってループをまわせば以下の情報がわかる。
まぁ、DLL使わなくても色々できるか?
settabgroup文で、グループ番号に"-1"を指定すると、自動的にグループ番号が割り当てられて分離します。 settabgroup文を使うには、秀丸エディタのウィンドウ番号またはウィンドウハンドルが必要です。ウィンドウ番号、ウィンドウハンドルがわかっているので、分離後、"tabgroup[ハンドル or 番号]"で新しいグループ番号が取得可能です。(ウィンドウハンドルを使うのがいいでしょう。)
//".log"のみ分離する
#max = hidemarucount;
#cnt = 0;
#gr = -1;
while(#cnt < #max){
if(filetype[#cnt] == ".log"){
#handle = hidemaruhandle(#cnt);
settabgroup #cnt, #gr;
if(#gr == -1) #gr = tabgroup[#handle];
}
#cnt = #cnt + 1;
}
tabgrouptotalでIDの総数はわかるが、実際にどのIDが使われているか不明です。 (0から順に割り当てられるが、連続している保証はない。) 使用されているIDを調べる方法です。
方法 その1
//使用されているグループIDの取得 その1
#max = tabgrouptotal;
#cnt = 0;
while(#cnt < #max){
#id_list[#cnt] = tabgroup[getcurrenttab(true, #cnt)];
#cnt = #cnt + 1;
}
方法 その2
//使用されているグループIDの取得 その2
#max = hidemarucount;
#cnt = 0;
#id_cnt = 0;
while(#cnt < #max){
if(windowstate[#cnt] != 0){
#id_list[#id_cnt] = tabgroup[#cnt];
#id_cnt = #id_cnt + 1;
}
#cnt = #cnt + 1;
}
"tabtotal"で同じグループのタブの総数がわかる。他のタブグループの総数を知りたい場合は、角カッコで添え字を付ける事で取得可能。
例)tabtotal[#cnt]
tabtotalの添え字に指定できるのは、ウィンドウハンドルか"tabgrouporder"(グループの順番)。グループIDは使えないので注意すること。
タブモード時、"このタブを最小化"・非表示しているファイルは、グループIDとタブオーダーが共に"-1"となる。ウィンドウ毎最小化している場合は通常に取得可能。
tabgrouptotalでグループ数、tabtotalでグループ内のタブ数が取得できますが、表示されている秀丸エディタのみ対象としていると考えた方がいいです。非表示および"このタブを最小化"している秀丸は数に含まれません。ファイルが1つしかないグループで、非表示や、"このタブを最小化"した場合、tabgrouptotalではカウントされません。
タブグループが2つで、1つのグループがA、B、Cと3つのファイルを開いている場合 A、B、Cと3つのファイルを開いている状態 : tabgrouptotalは"2"、A、B、Cと3つのファイルがあるタブのtabtotalは"3"
つまり、非表示、"このタブを最小化"した秀丸エディタがある場合、tabgrouptotal、tabtotalでは正確な値が取得でません。確実に取得するには、非表示、"このタブを最小化"を解除する必要があります。
ちなみに、最小化、非表示化したウィンドウの所属しているグループを取得する方法はなく、表示状態を元に戻す必要があります。
タブモード時は、タブに表示されているファイル以外は、非表示状態(windowstate = 0)となっている。本当に非表示状態なのか、タブで選択されていないかを判別するには、グループIDとタブオーダーの値を確認する。
非表示及び、"このタブを最小化"している場合は、グループIDとタブオーダーは"-1"を返し、選択されていない場合、グループIDとタブオーダーは"0以上"を返す為、判別が可能。
グループIDとタブオーダーが"-1"を返すと、タブが分離しているように見えるが、実際は分離しているわけではない。
showwindow 2;
settabgroup hidemaruhandle(0), -1;
endmacro;
最小化した状態から分離したタブは、ウィンドウサイズが、通常サイズではなく、小さくなった状態で分離される。分離する場合には、通常ウィンドウに戻してから、分離すること。
日本語を含むフルパスから、ファイル名とフォルダ名に分割する場合の注意点。
各フォルダの区切りは "\" です。その為、ファイル名とフォルダを分割する場合、最期の"\"を探す必要があります。
//フォルダ名を切り出す為、ファイル名の最期から1文字ずつ調べる。
$$target = "C:\\TEMP\\Dir1\\file1.txt";
##len = strlen($$target);
while(##len > 1){
##len = ##len - 1;
if(midstr($$target, ##len, 1) == "\\"){
//ファイル名分割処理
}
}
これでも問題はありませんが、日本語を含む場合は注意が必要です。日本語(SJISコード)は2バイトで表現されますが、秀丸のmidstr関数は1バイト単位で処理します。その為、日本語の2バイト目が "\" と同じ0x5Cの場合でも、
if(midstr($$target, ##len, 1) == "\\"){
の条件に一致してしまい、誤動作してしまいます。
ファイル名が、"C:\TEMP\Dir1\file1表.txt"の場合
ファイル名:".txt"
フォルダ名:"C:\TEMP\Dir1\file1表"
となってしまう。
表の文字コードは"0x955C"なので2バイト目の"0x5C"で誤検出する。
その為、日本語の第2バイトであるかどうかの判定が必要になります。
$$target = "C:\\TEMP\\Dir1\\file1.txt";
##len = strlen($$target);
while(##len > 1){
##len = ##len - 1;
if(ascii(midstr($$target, ##len - 1, 1)) < 256 && midstr($$target, ##len, 1) == "\\"){
//ファイル名分割処理
}
}
「ascii(midstr($$target, ##len - 1, 1)) < 256」が判定コードになります。判定する文字の、1バイト前のASCIIコードが256(0xff)未満であるかどうかを確認しています。秀丸では漢字の上位バイトは"0x9500"のように最低でも"0x8100"以上をかえすので、それを利用して判定を行います。
Ver.8より、ascii関数の仕様が変更されています。その為、上記方法では、判定できなくなりますが、文字単位で処理する、wcsmidstr関数が追加されているので、そちらを使用します。 (2バイト文字の判定を参照)
hmjre.dllを使用した、フォルダ名、ファイル名の取得方法もあります。 DLLのページにある「hmjre.dllの使い方」を参照してください。
Ver.8.89β4 より、split関数が追加されています。split関数を使えば、マクロ関数のみでパスの分割が可能です。
$$target = @"C:\TEMP\Dir1\file1.txt";
//split関数は、配列のサイズを返す。
##len_max = split($path, $$target, "\\");
//ファイル名は最後になるので サイズから -1 の位置(ゼロスタートなので)
$$filename = $path[##len_max - 1];
// $$target から、$$filenameの長さ と、"\"の1文字文の長さをカット
$$dir = leftstr($$target, strlen($$target) - strlen($$filename) - 1);
message "$$target = " + $$target + "\n" +
"$$filename = " + $$filename + "\n" +
"$$dir = " + $$dir;
endmacro;
秀丸エディタ Ver6.00β11より、grepdialog、grepdialog2で表示されるダイアログからキャンセルした場合、result が -2 になります。その為、以下の方法による「キャンセル」の判定は不要です。
grepdialog文は、grep文と違い、ダイアログを表示する命令です。実行後の"result"には、grep実行を中断した場合は"-1"、マッチした場合は検索結果(個数)が、ダイアログで「キャンセル」した場合は、"0"が返ります。「キャンセル」した場合も"0"である為、"result"だけでは検索結果が"0"なのか、「キャンセル」したのかが区別できません。区別するには、"result"の値と"filetype"キーワードを使用します。
grepdialog文は新規ファイル(filetypeは"new")を自動的に開きます。 grepを実行した場合、結果が"0"であっても、新規ファイルからgrepの結果(filetypeは"grep")に変わります。これを利用し、「キャンセル」と「検索結果が"0"」を判定します。
if(result == 0 && filetype == "new"){
//「キャンセル」した場合の処理
}else if(result == 0 && filetype == "grep"){
//結果が"0"の場合の処理
}
ちなみに中断時に、それまでの検索結果を知りたい場合は、linecount2 - 1 で検索数がわかります。(-1するのは最終行は改行のみなので。同じ行に検索対象が複数ある場合は無理です。)
検索結果が"0"のgrepから実行した場合、新規秀丸が開かない為、キャンセルと検索結果が"0"が区別できません。
秀丸エディタ Ver.6 からgrepダイアログを開く、"grepdialog2"が追加されました。各種パラメータを設定してgrepダイアログを開く命令です。
"grepdialog"との違いは
です。
実行後の"result"には、"grep"と同じ値が入ります。その為、grepdialogと同様に、resultだけでは、ダイアログの「キャンセル」と「検索結果が"0"」の区別ができません。さらに、判断する方法は、新規秀丸を開かない為、"grepdialog"と同じ方法は使えません。
基本的な判断方法としては、
です。
しかし、filetype が"new(新規)" で未編集の場合、grep実行時はウィンドウは切り替わらずに、 filetype が "grep" に変化するだけです。
ということで、
の場合、キャンセルしたと判断できます。
$checktype = filetype;
#update = updated;
#handle = hidemaruhandle(0);
grepdialog2 "", "*.mac", macrodir, regular;
#ret = result;
if(#ret == 0 && (($checktype == "new" && #update == 0 && #handle == hidemaruhandle(0)) ||
#handle == hidemaruhandle(0))){
//「キャンセル」した場合の処理
}else if(#ret == 0 && filetype == "grep" && #handle != hidemaruhandle(0)){
//結果が"0"の場合の処理
}
マクロを異なるバージョンの秀丸を動くようにするには、以下のようにversionキーワードを使います。
if(version >= 5.00){
//Ver.5.00の処理
}else{
//Ver.5.00未満の処理
}
しかし、"Ver.5.00の処理"内に、Ver.5.00で追加された命令、キーワードを使用した場合、 Ver.5.00未満ではエラーになり、実行できません。
これは、マクロの実行が、1行づつ変換・実行しているインタープリタ形式ではなく、コンパイル形式で実行されているからです。その為、実行する秀丸バージョンにない命令・キーワードが見つかると、コンパイル時にエラーとなります。
これを回避するには、完全に別のファイルにするしかありません。
if(version >= 5.00){
//Ver.5.00の処理
execmacro "ver5.mac";
}else{
//Ver.5.00未満の処理
execmacro "ver4.mac";
}
大本はIKKIさんが作成した「閉じるダイログ」です。「ファイルヒストリダイアログ」は、このベースから作成。
実行には田楽DLLが必要です。(要Ver.2.83) 拡張ソート機能を使うには、変換モジュールライブラリのソートが必要です。 Version 1.4.0 以降は秀丸エディタVer.8に対応したため、追加の変換モジュールは不要です。
秀丸エディタVer.8用に各部を修正
変換モジュールを使ったソートで、チェック状態を保持できる様にした。
$ld_ListCheck が機能していなかったので修正。
#ld_ListMax、 #ld_SelectCount、 #ld_DialogWidth、 #ld_CheckList[] を追加
#ld_ListMax :入力用変数。表示リストの最大値を設定。
未設定(0)の場合は、$ld_ViewList[]が""まで読み込む。
#ld_SelectCount:出力用変数。チェックした項目数を返す。
#ld_DialogWidth:入力用変数。ダイアログ幅の設定。デフォルトで80。
#ld_CheckList[]:入出力変数。
チェックの初期状態の設定入力および、チェック結果を格納する。
0でチェックなし、1でチェックあり。
変換モジュールのソートで、ステルス秀丸を使わない様にした。
#ld_CheckList[]にも、結果を戻す様にした。
このマクロを使用し、
を追加すればダイアログを表示するマクロができます。
// リスト表示ダイアログメインルーチン実行に必要なグローバル変数
// $ld_ViewList[] :表示する項目を格納した配列
// $ld_SelectList[] :選択した項目を格納した配列
// #ld_CheckList[] :チェックの初期状態/結果を格納する配列(0:チェックなし 1:チェックあり 結果のみ -1:削除)
// $ld_ListCheck :チェックしたい項目をカンマ区切りで指定(チェックリストのSETCTRLSTATEを参照)
// 配列の添え字より +1 された数字を指定する必要あり。
// #ld_CheckList[]より優先される。
// #ld_ListMax :表示する項目数
// #ld_SelectCount :選択された項目数
// #ld_DialogWidth :表示するダイアログのサイズ(省略時は80)
//
// 注意 1)配列は必ず0から始めること。
// 2)#ld_ListMaxを設定しない場合、$ld_ViewListに""を含むことは出来ません。(""でリストの終了と見なします。)
// #ld_ListMaxを設定した場合は、#ld_ListMaxに従います。
// 3)同じ項目内容がある場合、意図した結果にならない場合があります。
// 項目内容でリストの検索を行っている個所があるので、$ld_ViewList[]の先頭からマッチすることになります。
// ---- メインルーチン ListDialog の引数
// $$1:ダイアログに表示するタイトル
// $$2:ダイアログの先頭に表示するメッセージ
// ##3:リストをソートするかしないか。
// 0 ソートしない
// 1 ソート(田楽の機能)
// 2 変換モジュールを使ったソート
// ##4:項目削除機能を有効にするかどうかのフラグ
// 0 無効
// 1 有効
// ##5:リストのダブルクリックイベントを有効にするかどうかのフラグ
// 0 無効
// 1 有効
// ---- 戻り値
//-1:キャンセル
// 0:選択なし
// 1:選択あり(結果は$ld_SelectList[]、#ld_CheckList[]の配列に格納)
2022/01/19 ソートのパラメータを修正
マクロから変換モジュールを呼びだす方法です。各種変換機能を呼びだすには、filter文を使います。文字変数に対して処理を行う場合は、filter関数を使います。
//変換モジュールを呼びだすマクロの例
filter "Sort.hmf" , "Sort" , "0111";
Sort.hmf:呼び出す変換モジュールの名称(標準の場合は""とする。)
Sort :使用する機能名
0111 :変換モジュールに渡すパラメータ
変換モジュールに解説がある場合は、解説に従います。解説がない場合は、"マクロの記録"を使って記録するのが、手っ取り早いです。詳細は、秀丸エディタのヘルプ「目次- 動作環境- 編集-変換」にある、「参考:変換モジュールをキー割り当てする方法」を参照してください。
秀丸エディタ本体で、変換モジュールを使う方法は、 "変換モジュールを使うには" を参照してください。
関連項目
ソートのパラメータ一覧です。
filter "" , "Sort" ," | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 2 | 0 | 0 | 1 | \" | 1 | 0 | 0 | 0 | 0 | " |
オプション指定 | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u |
オプション指定 | 0 | 1 | |
全体の設定 | |||
a | ソート方向 | 昇順 | 降順 |
b | 連続した空白/タブの扱い | そのまま | 一つの空白として扱う |
c | 大文字/小文字の扱い | 区別する | 区別しない |
d | 「数値の部分」の扱い | 文字扱い | 数値として扱う |
e | 使用する文字コード | そのまま | UNICODEで比較 |
TSV/CSVモードの設定 | |||
f | 1行目の扱い | そのまま | 無視する |
g | カラム指定 | なし | あり |
h | TSV/CSV | TSV | CSV |
i | カラム指定 | カラム指定値(4桁) | |
j | |||
k | |||
l | |||
全体の設定 | |||
m | ダイアログの表示 | 表示しない | 表示する |
n | 設定の記録 | 記録しない | 記録する |
TSV/CSVモードの設定 | |||
o | クォート判定 | あり | なし |
p | クォート文字 | クォート文字 | |
q | TSV/CSV設定 | 無効 | 有効 |
「数値の部分」の設定 | |||
r | マイナス(“-”)と小数点(“.”)も計算(M) | 無効 | 有効 |
TSV/CSVモードの設定 | |||
s | セル内改行あり | 無効 | 有効 |
全体の設定 | |||
t | 同一視(ひらがな/カタカナ/全角/半角) | 無効 | 有効 |
「数値の部分」の設定 | |||
u | 3桁区切のカンマも含める | 無効 | 有効 |
filter関数を使うと、文字列変数に対し、各種変換を実行できます。ソートを行いたい場合は、内容を"\n"で結合し、filter関数を使えばソートが可能です。
$a = "4\n3\n2\n1";
$n = filter("Sort.hmf" , "Sort" , "00010",$a);
message "-ソート前-\n" + $a + "\n-ソート後-\n" + $n;
表示結果です。
-------------
秀丸エディタ
-------------
-ソート前-
4
3
2
1
-ソート後-
1
2
3
4
-------------
OK
-------------
結合した内容を分割するには、hmjre.dllの関数を使えば、簡単にできるかもしれません。
タブに任意の名前をつける方法です。
「ファイル名変更」を使えば、任意の名前をタブに表示できます。(タイトルバーはフルパスになりますが)「ファイル名変更」を実行した時点で、更新扱いになるので、閉じるときは、保存するかどうか問い合わせがでます。
ちなみに名前を変えているだけなので、保存するまでファイルは作成されません。
秀丸エディタVer.6β38より、title文が拡張され、タブにも任意の文字列を設定できます。
タブに名前をつけるマクロ
//タブに任意の文字列をセットするマクロ
$tab_title = input("タブにセットする文字を入力してください。", filename);
if($tab_title != ""){
title $tab_title,3;
title -1,3;
}
endmacro;
タブの名前をリセットするマクロ
//タブに設定された文字列をリセットするマクロ
title 0,3;
endmacro;
単なるメモ。
2020/09/27 explorerの起動オプションのリンク先変更
裏技的内容:setgrepfileで"\x01"を指定。(turukame.3:09093より)
rangeedittopとrangeeditendは、部分編集を行っていない場合は"-1"となる。
現状、マクロ実行終了時に、ステルスモードが強制解除されます。これは、マクロを実行した秀丸エディタだけでなく、他の秀丸エディタにも影響を及ぼします。
ステルス秀丸がいる場合に、他の秀丸でマクロを実行すると、ステルスが強制解除されます。
マクロが、秀丸エディタ上で実行しているか、秀丸メール上で実行しているかを、判定する方法について。
秀丸メール Ver.5.60以降から、platformキーワードによる識別が可能になりました。以下、秀丸エディタVer.8.03β6のマクロヘルプより、抜粋。
0x00800000 秀丸メール上で動作しているかどうか(秀丸メールV5.60以降)
秀丸エディタの場合、"tkinfo.dll"のロード成功・失敗で、判断可能(成功:秀丸メール 失敗:秀丸エディタ) ですが、カレントフォルダが"tkinfo.dll"と同じ場所だった場合、 ロードに成功してしまう為、 "IsHidemaruMail"関数を使わないと誤判定してしまいます。
つまり、
という方法が確実です。
findwindowclassで上記クラス名からウィンドウハンドルを取得し、実行中のウィンドウハンドルと比較すればいい。(ハンドルからウィンドウクラス名を取得するのが確実だが、秀丸マクロ単体では無理)ただし、秀丸メールの検索結果ウィンドウ上での実行は判定が出来ない。
マクロが、秀丸エディタの日本語版で実行しているか、英語版で実行しているかを、判定する方法について。
秀丸エディタVer.8βより、platformキーワードが追加され、OSなど、実行環境の情報取得が、可能になりました。 β7より、英語版、浮動小数点数版かどうかを示すビットも、追加されています。
秀丸エディタには、英語版も存在しますが、日本語版とはレジストリの位置が違います。その為、マクロ内でレジストリを操作する場合、問題となります。
日本語版と英語版を区別するには、タイトルバーの文字列を使用します。タイトルバーの内容が、"- 秀丸"で終わっていれば日本語版と判断できます。タイトルバーの取得には gettitle関数を使います。注意点としては、title文で内容を変更している場合もあるので、変更を解除してから、タイトルバーの内容を取得することです。
秀丸エディタ Ver 6.00から追加された命令。「折りたたみ」や「部分編集」がある場合に、マクロの互換性を保つために追加されたが、「秀丸エディタで同じファイルを開く場合」や「検索での表示」の設定を、マクロ実行時にレジストリを書き換えないで、一時的に変更することが可能。
setactivehidemaruで秀丸エディタを切り換えても、setcompatiblemodeで設定した内容は有効。 execmacroで他のマクロを起動した場合、setcompatiblemodeで設定した内容は無効。
setwindowpos #posx, #posy, #width, #height;
新規ファイルで、編集していない場合、openfile文を使うと、新しい秀丸を起動しないで、新規ファイル上に読み込む。(loadfileと同じになる。)ただし、起動オプション付きで、openfileした場合は、新しいウィンドウが開く。
起動オプションで"/(posx,posy,width,height)"を指定できるが、引数に不正な値がある場合、指定自体無効になります。(不正な値のみ、無視するのではなく、指定自体が無効になる。)
enabledrawには、引数が指定できます。引数は、enabledrawで再描画を許可し、表示する際の画面の先頭行を指定します。ただし、カーソル位置が、エディタ画面表示範囲内にある必要があります。
例)画面サイズが80桁×40行の場合で、カーソル位置が50行にある場合。
NG:enabledraw 80; 表示範囲が80行~120行なので、カーソル位置が画面表示範囲外
OK:enabledraw 40; 表示範囲が40行~80行なので、カーソル位置が画面表示範囲内
NG:enabledraw 0; 表示範囲が先頭~40行なので、カーソル位置が画面表示範囲外
位置指定が有効な条件は以下になります。
カーソル位置から、先頭に向かって表示画面の行数までの値が、引数で指定されている事。ただし、「動作環境」-「表示/操作」-「カーソル操作」-「カーソルでスクロールする開始位置」の設定により、範囲は狭くなる。
設定が「画面の端」の場合、画面サイズが40行、カーソルが50だと、11~50までの引数が有効で、それ以外は自動調整になります。
MIN:50 + 0 - 39 = 11 (39は画面サイズから、カーソル行を除いた行数)
MAX:50 - 0 = 50
設定が「行数指定」で「3」の場合、画面サイズが40行、カーソルが50だと、14~47までの引数が有効で、それ以外は自動調整になります。
MIN:50 + 3 - 39 = 14 (39は画面サイズから、カーソル行を除いた行数)
MAX:50 - 3 = 47
設定が「画面の端」の場合、あらかじめ先頭に設定したい箇所にカーソルを移動しておけば問題ない。
disabledraw;
~
moveto 0,#a;
enabledraw #a;
それ以外の設定の場合は、レジストリ情報を読み、引数が有効になる位置までカーソル移動させる必要がある。 (まぁ、画面サイズの半分まで、加算した行に移動させてから、enabledraw を使えば大丈夫かもしれません。)
結局の所、enabledraw を使わずに、screentopy キーワードを見て、自分で合わせ込む方が確実です。
画面のカーソル位置を固定し、画面をスクロールアップする命令ですが、画面の半分より上にはスクロールしない。
対象のウィンドウハンドルを取得し、システムメニューを操作する。
WM_SYSCOMMAND の SC_MINIMIZE を送る
//WM_SYSCOMMAND:0x0112 SC_MINIMIZE:0xF020
#ret = sendmessage( #handle, 0x0112, 0xF020, 0 );
WM_SYSCOMMAND の SC_RESTORE を送る
//WM_SYSCOMMAND:0x0112 SC_RESTORE:0xF120
#ret = sendmessage( #handle, 0x0112, 0xF120, 0 );
サンプルテキスト
// 1 2
aaa12345678901234567890
マクロコード
debuginfo 1;
$BAK_SEARCHBUFFER = searchbuffer;
#BAK_SEARCHOPTION = searchoption;
#BAK_HILIGHTING = foundhilighting;
$BAK_REPLACEBUFFER = replacebuffer;
if(#BAK_HILIGHTING) hilightfound 0;
//範囲選択
setcompatiblemode 0x0200;
gofiletop;
searchdown "^a+",regular;
debuginfo "範囲選択 Start:x=" + str(x) + " " + hex(code) + ":" + char(code);
right 5;
debuginfo "範囲選択 End :x=" + str(x) + " " + hex(code) + ":" + char(code);
//点滅表示
setcompatiblemode 0x0100;
gofiletop;
searchdown "^a+",regular;
debuginfo "点滅表示 Start:x=" + str(x) + " " + hex(code) + ":" + char(code);
right 5;
debuginfo "点滅表示 End :x=" + str(x) + " " + hex(code) + ":" + char(code);
setsearch $BAK_SEARCHBUFFER, #BAK_SEARCHOPTION;
setreplace $BAK_REPLACEBUFFER;
if(#BAK_HILIGHTING) hilightfound 1;
endmacro;
結果
範囲選択 Start:x=0 61:a
範囲選択 End :x=7 35:5
点滅表示 Start:x=0 61:a
点滅表示 End :x=5 33:3
両方とも、検索してから、右に5文字文カーソルを移動させているが、範囲選択の場合と、点滅表示の場合では、カーソルの移動結果が異なる。
範囲選択の場合、最初の右移動で、範囲選択の最後へカーソルが移動している。
//サンプルマクロ
//No.1
call check getconfig("Font");
//No.2
message getconfig("Font");
//No.3
$get = getconfig("Font");
call check $get;
//No.4
call check "" + getconfig("Font");
endmacro;
check:
message $$1;
return;
//ここまで
No.2~4は設定されたフォント名が表示されますが、No.1では""となって表示されません。
getconfigの説明には
返す値は基本的に文字列型ですが、文字列としても数値としても扱う
ことができます。
となっているので、この影響。現時点では仕様。
回避するには、文字列であることを明確にすればいい。
//No.1
//空文字と結合させることで、文字列と認識される。
call check "" + getconfig("Font");
Ver.8から、settingdir キーワードが追加されています。
キー割り当てや、強調表示など設定保存するフォルダを取得するには、レジストリを参照します。設定されていない場合は、秀丸エディタと同じフォルダになります。
#ATTRIBUTE_DIRECTORY = 0x00000010;
$SettingPath = hidemarudir;
openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
if(result){
$$Pathcheck = getregstr("SettingPath");
if((existfile($$Pathcheck,1) & #ATTRIBUTE_DIRECTORY) == #ATTRIBUTE_DIRECTORY){
$SettingPath = $$Pathcheck;
}
}
closereg;
2020/09/27 リンク先のマイクロソフトのページがなくなっていたので、別の所に変更
explorer.exeの起動オプションに関する資料
W95:エクスプローラ起動時に使用できるオプション スイッチ(URL:https://support.microsoft.com/ja-jp/help/130510/command-line-switches-for-windows-explorer)
Windows XP の Explorer.exe コマンドライン オプション(URL:https://support.microsoft.com/ja-jp/help/314853/explorer-exe-command-line-options-for-windows-xp)
各起動オプション間は","(カンマ)で区切ること。" "(スペース)で区切ると、うまくいかない場合がある。
Ver.8から、getclipboardinfo 関数が追加され、箱形選択かどうかが、判定できます。
現在、クリップボード内のデータが、箱形選択時にコピーされたかどうかの判定方法は、以下の内容を参照
DLLを使用できるなら、GetClipboardData( CF_DSPTEXT )の中身が"BOX"という文字列であるかどうかで、判断する事が可能。
input関数で、キャンセルしたかどうかを判断するには、resultの値を確認します。キャンセル時は、関数の戻り値が""になるので、そこでも判断が可能ですが、resultを確認するほうが、確実です。
$in = input("実験","");
#ret = result;
if(#ret == 0){
message "キャンセルされました。";
endmacro;
}
if($in == ""){
message "キャンセルされましたが、\"\"を入力したかもしれません。";
}
setactivehidemaruでアクティブにした場合、最小化している場合は、最小化が解除される。しかし、タブモードの場合、解除されない場合があるので注意。(Ver.8では修正される予定?)
非タブモードの場合です。(かなり特殊な状況)
最小化(showwindow 2)や最大化(showwindow 3)したまま、非表示(showwindow 0)にした場合、 windowstateは、0となる。その為、非表示のウィンドウが、実際はどんな状態になっているかは不明です。
マクロで判定するには、非表示状態から、
という方法で可能です。
どうしても判定する必要がある場合は、"macrodll.dll" の "WINDOW_ISICONIC" か "WINDOW_ISZOOMED" を使うのがいいでしょう。
秀丸エディタVer.8より、マクロが終了しても値を保持する、静的な変数が導入されています。
静的変数は、他の秀丸エディタ上からも参照可能な「共有」に設定できます。
「共有」しない場合は、実行した秀丸エディタ上のみ参照可能で、実行した秀丸エディタが終了すると、破棄されます。(メモリ上に残らない) (turukame.3:04193を参照)
loadfile(ファイルを閉じて開く)文を実行した場合は、静的変数は破棄されます。
setstaticvariable "loadfil_test", "保存ずみ?",0;
message getstaticvariable("loadfil_test",0);
loadfile filename;
message getstaticvariable("loadfil_test",0);
endmacro;
見た目上、ウィンドウは閉じていませんが、「ファイルを閉じて開く」なので、閉じた扱いになり、静的変数は破棄されているようです。
「共有」する場合は、実行中の全秀丸エディタから参照可能で、秀丸エディタのプロセスが全部いなくなるまで、保持される。
setfocus文で、編集エリア以外にフォーカスを移しても、message文を実行すると、編集エリアにフォーカスが移動します。 (turukame.3:04282)
通常はあまりないかもしれませんが、マクロデバッグ時などには注意すること。
無効なハンドルを指定すると、-1が返る。
変数等に保存しておいたハンドルが、有効かどうかの確認に使える? filename[#n]でも、確認できそうだが、無題ファイルの場合は無理。 (filetype[#n]ならOK?)
既存のファイル(保存済み)を編集している場合は、取得可能だが、新規ファイルの場合は、取得不可。全ての状況で、編集の有無を確認出来る訳ではないので、注意する。
//確認用マクロ
openfile currentmacrofilename;
gofiletop;
insert " ";
message "lineupdated(1):" + str(lineupdated);
#main = hidemaruhandle(0);
newfile
gofiletop;
insert " ";
message "lineupdated(2):" + str(lineupdated);
#sub = hidemaruhandle(0);
setactivehidemaru #main;
closehidemaruforced #sub;
quit;
endmacro;
既存ファイルを開いて編集した場合は、
lineupdated(1):1
となるが、新規ファイルの場合は、
lineupdated(2):0
となる。
新規ファイルでの挙動は、「編集した行の表示方法」と同じなので仕様と思われる。 "lineupdated"の使い方にもよるが、新規ファイルかどうか確認が必要になる場合もある。
マクロ引数を使う場合の注意点。(ヘルプにも注意点がありますが、実際にどうなるか実験的な内容です。)
例は、test.mac を 引数なしで実行した場合で、
test.mac は、test1.mac を引数付きで起動。
test1.mac は、test2.mac を引数付きで起動。
test2.mac は、test.mac を引数付きで開く。
という動作を行います。
問題になるのは、execmacro/openfile文 より後で、以下のような状態になります。
この動作から、
ということがわかります。
つまり、マクロ内で、起動時に受け取った引数の内容と、execmacro/openfile文を、マクロ引数付き実行し、この命令より後ろで取得した内容は、一致しません。
マクロで引数を使う場合、マクロ先頭で別の変数にコピーしておくのが、安全という事になります。
test.mac
message currentmacrobasename + " - execmacro文実行前\n" +
"引数の数:" + str(argcount) + "\n" +
"引数 0:" + getarg(0) + "\n"+
"引数 1:" + getarg(1) + "\n"+
"引数 2:" + getarg(2) + "\n"+
"引数 3:" + getarg(3);
execmacro "test1.mac", "1st", "2nd", "3rd";
message currentmacrobasename + " - execmacro文実後\n" +
"引数の数:" + str(argcount) + "\n" +
"引数 0:" + getarg(0) + "\n"+
"引数 1:" + getarg(1) + "\n"+
"引数 2:" + getarg(2) + "\n"+
"引数 3:" + getarg(3);
endmacro;
test1.mac
message currentmacrobasename + " - execmacro文実行前\n" +
"引数の数:" + str(argcount) + "\n" +
"引数 0:" + getarg(0) + "\n"+
"引数 1:" + getarg(1) + "\n"+
"引数 2:" + getarg(2);
execmacro "test2.mac", "11th", "12th", "13th", "14th";
message currentmacrobasename + " - execmacro文実後\n" +
"引数の数:" + str(argcount) + "\n" +
"引数 0:" + getarg(0) + "\n"+
"引数 1:" + getarg(1) + "\n"+
"引数 2:" + getarg(2) + "\n"+
"引数 3:" + getarg(3);
endmacro; endmacro;
test2.mac
message currentmacrobasename + " - openfile 文実行前\n" +
"引数の数:" + str(argcount) + "\n" +
"引数 0:" + getarg(0) + "\n"+
"引数 1:" + getarg(1) + "\n"+
"引数 2:" + getarg(2) + "\n"+
"引数 3:" + getarg(3);
openfile "/a 21th /a 22th /a 23th /a 24th test.mac";
message currentmacrobasename + " - openfile文実行後\n" +
"引数の数:" + str(argcount) + "\n" +
"引数 0:" + getarg(0) + "\n"+
"引数 1:" + getarg(1) + "\n"+
"引数 2:" + getarg(2) + "\n"+
"引数 3:" + getarg(3);
endmacro;
test.macの1回目
test.mac - execmacro文 実行前
引数の数:0
引数 0:
引数 1:
引数 2:
引数 3:
test1.macの1回目
test1.mac - execmacro文 実行前
引数の数:3
引数 0:1st
引数 1:2nd
引数 2:3rd
test2.macの1回目
test2.mac - openfile 文実行前
引数の数:4
引数 0:11th
引数 1:12th
引数 2:13th
引数 3:14th
test2.macの2回目
test2.mac - openfile文実行後
引数の数:4
引数 0:21th
引数 1:22th
引数 2:23th
引数 3:24th
test1.macの2回目
test1.mac - execmacro文 実行後
引数の数:4
引数 0:21th
引数 1:22th
引数 2:23th
引数 3:24th
test.macの2回目
test.mac - execmacro文 実後
引数の数:4
引数 0:21th
引数 1:22th
引数 2:23th
引数 3:24th
マクロで、文字変数に対して、正規表現を使うには、各種DLLを使用します。
文字変数内にunicodeを含む場合は、dllfunc/dllfuncstr使用時に制限があります。「外部DLL呼び出しとunicode」、「マクロと文字コード」を参照してください。
hmjre.dllには、マクロ用関数があるので、各関数を呼びだします。詳細は、hmjre.dllの使い方を参照のこと
田楽DLLには、hmjre.dll、 BREGEXP.DLLへのインタフェースがあります。詳細は、ヘルプを参照してください。 bregonig.dllも使用可能です。("BRE_LOAD"でbregonig.dllをロードする。)
以下のマクロ用の関数を、呼び出すことが可能です。
Perl5互換の正規表現を使いたい場合は、BREGEXP.DLLを使います。以下の関数が使用が可能です。
BRegIf.dllでも、hmjre.dll互換のマクロ用関数が、実装されています。
秀丸エディタVersion.6.50β14より、浮動小数点バージョンから浮動小数点版(統合版)へ、変更になりました。今までの"浮動小数点バージョン"と何処が違うかというと、コマンドにより浮動小数点に切り替わる事です。("setfloatmode"があると浮動小数点に切り替わります。)通常版よりも多少マクロの動作が遅くなるとのこと。
浮動小数点バージョンで、問題になるのが、数値-文字列変換です。マクロヘルプのsetfloatmode文には以下の説明があります。
- str関数を使って数値変数を文字列変数に変換すると、小数点以下も付いて表
示される。場合によっては指数部付きの形式(+1.234E10のような形式)にな
ることがある。
ヘルプには書いてないですが、古いバージョンには以下の続きがあります
(C言語のsprintf関数で、"%lG"フォーマット使ってます)
"%lG"というフォーマットなので、有効数字は6桁で、これを越えると指数形式に変換されます。
例1) 123000 → 123000
例2) 1230000 → 1.23E+006
秀丸エディタ本体で、これを回避する方法はありません。回避するには、"HideMath.dll"のFormat関数を使用します。 Format関数は、C言語のsprintfと同じで、変換したい形式のフォーマット文字列を指定し、変換を行います。指定できるフォーマット指定方法は、sprintfと同じなので、検索すれば見つかるでしょう。
run文が正常に動作しない原因として多いのは、
のどちらかです。
プログラム及び、ファイルに空白を含む場合は、ファイル名を「"」(ダブルクォート)で囲む必要があります。
C:\Program Files\Internet Explorer\IEXPLORE.EXE を実行する場合
NGの例 run "C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE";
OKの例 run "\"C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE\"";
C:\Program Files\Internet Explorer\IEXPLORE.EXE で C:\TEMP\test folder\test.htmlを開く場合。
NGの例1 run "C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE C:\\TEMP\\test folder\\test.html";
NGの例2 run "\"C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE\" C:\\TEMP\\test folder\\test.html";
OKの例 run "\"C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE\" \"C:\\TEMP\test folder\\test.html\"";
マクロから任意のフォルダから、ファイルの一覧を取得する方法です。
田楽DLLを使う方法は、田楽DLLのヘルプを参照してください。("ENUMDIR"、"ENUMFILE")
まず、dirってなに?という人は、コマンドプロンプトを起動して下さい。起動したら">"(プロンプト)が表示されているはずなので、その後に"dir"と入力し、リターンキーを押します。
C:\Documents and Settings\xxxx>dir
すると、ファイルの一覧が表示されます。
dirには様々なオプションがあります。使えるオプションを表示するには"/?"と入力します。
C:\Documents and Settings\xxxx>dir /?
このオプションでよく使うのは、
場合によっては以下オプションも使います。
とりあえず "/B"と"/ON"を指定します。
C:\Documents and Settings\xxxx>dir /B /ON
最初の表示と違い、ファイル名だけになります。
この出力を秀丸で使用します。
秀丸エディタと同じフォルダにあるヘルプファイル(*.chm)の一覧を取得します。秀丸エディタへ dir コマンドの出力を取り込みます。
run getenv("COMSPEC") + " /k dir /b /on \"" + hidemarudir + "\\*.chm\"" + " > con";
出力結果
be_hidemac.chm
hidemac_html.chm
hidemaru_html.chm
HIDEQA.CHM
hmjre.chm
hmnetex.chm
hmpv.chm
C:\xxxx\Hidemaru\macro>
出力結果から、ファイル名を切り出します。カーソルをファイルの先頭、行頭へ移動し、行末まで取り込み。
$file = gettext2(0,lineno,linelen2,lineno);
カーソル位置をずらし、取得結果が""になるまで、繰り返せば、全てのファイル名を取得できます。
実際のマクロに組み込むには、実行結果を非表示にしたほうがいいでしょう。ヘルプファイルを取得し、メニュー表示する例です。
//マクロを実行する秀丸エディタのウィンドウハンドルを保存
#main = hidemaruhandle(0);
//dir結果を取り込む秀丸エディタを非表示で開き、ウィンドウハンドルを保存
//この時点で、新しく開いた秀丸エディタ上でマクロが実行される。
openfile "/n /h ";
#sub = hidemaruhandle(0);
//dirコマンド実行 実際には内部コマンドなので、cmd.exe/command.com 経由で実行
run getenv("COMSPEC") + " /k dir /b /on \"" + hidemarudir + "\\*.chm\"" + " > con";
//ファイルの先頭に移動
gofiletop;
#cnt = 0;
//ファイル名が取得できなくなるまで1行づつ移動
while(1){
golinetop;
$text = gettext2(0,lineno,linelen2,lineno);
if($text != ""){
$help[#cnt] = $text;
#cnt = #cnt + 1;
}else{
break;
}
//dowmでも問題ないかも知れないが、念のためmovetolinenoを使う。
movetolineno 0, lineno + 1;
}
//マクロを起動した秀丸エディタに移動
setactivehidemaru #main;
//dirを実行した秀丸エディタを強制的に閉じる
closehidemaruforced #sub;
//取り込んだファイル名をメニューで表示
menuarray $help, #cnt;
#sel = result;
if(#sel == 0){
endmacro;
}else{
//ヘルプを起動
run "rundll32.exe url.dll,FileProtocolHandler " + "\"" + hidemarudir + "\\" + $help[#sel - 1] + "\"";
}
">con"を使って、リダイレクトが可能ですが、設定によって、標準出力だけでなく、標準エラー出力も取り込めます。その為、通常のコマンドプロンプトでリダイレクトした結果と、違ってくる場合もあるので、注意すること。
ちなみに、コマンドプロンプトで、標準エラー出力も取り込むには、
command >output_file 2>&1
とすること。
dirからの取得方法では、直接、秀丸エディタにリダイレクトさせたが、""も取り込みたいとか、終了の条件判断が難しい場合は、ファイルにリダイレクトさせ、ファイルを読み込めるDLLを使って、取り込んだ方が、楽かも。
FAQ辺りに載っていたと思っていたが、なかったので追加。
秀丸エディタのgrepには、オプションとして、"ファイル名一覧だけ作成"という項目があります。このオプションを有効にすると、通常と違い、
という、動作になります。
これを利用し、各ファイルに確実にマッチする正規表現を指定して、grepを実行すれば、最後に行番号が付くけど、ファイルの一覧が取得できます。
grepなので、
ということも、可能です。
行番号が不要な場合は、置換で削除すればいいです。
秀丸エディタで開いているファイル全てに対して、処理を行う場合の注意点です。 (単純な事なんですが、各ウィンドウの状態を見ておかないと、失敗する可能性が大きい。)
開いているファイル全てに対して、処理を行う場合は以下のマクロを使います。
#i = 0;
while( #i < hidemarucount) {
//処理したい内容を記述
nexthidemaru;
#i = #i + 1;
}
しかし、問題がないわけではありません。 hidemarucountは、常駐秀丸エディタを除く、起動している秀丸エディタの数を返しますが、 nexthidemaruは、最小化している秀丸エディタには移動しません。その為、最小化した秀丸エディタがいる状態で、上記マクロを使用すると、移動回数と実際に移動できるウィンドウの数が一致しないため、同じファイルに対して、複数回処理を行う事になります。
例)開いている秀丸の数 :3
最小化している秀丸の数:1
移動する回数:3(hidemarucount = 3)
1回目:1→2
2回目:2→1(最小化しているので、3へ行かない)
3回目:1→2
確実に全てのファイルに処理を行うには、nexthidemaruではなく、nexthidemaruiconを、使う必要があります。
#i = 0;
while( #i < hidemarucount) {
//処理したい内容を記述
nexthidemaruicon;
#i = #i + 1;
}
ちなみに、通常操作ではありえませんが、非表示状態の秀丸エディタがいる場合、 nexthidemaruiconを使用しても、移動できません。移動するには、hidemaruhandleを取得して、setactivehidemaruを使用する必要があります。
秀丸エディタで、ウィンドウを切り換えて処理を行う場合、nexthidemaruiconを使用せずに、 hidemaruhandleとsetactivehidemaruを、使用した方がいいかもいれません。
おまけに、アクティブなタブグループに対して処理する方法。
#i = 0;
while( #i < tabtotal) {
//処理したい内容を記述
nexttab;
#i = #i + 1;
}
tabtotal自体、"このタブを最小化"と非表示を認識しないので、上記のような問題はない。
マクロで設定を保存する場合、INIファイルを使う場合がある。セクション名、キー名がわかっている場合はいいが、わからない場合は、直接秀丸エディタで開き、検索を使って、セクション名、キー名を列挙する。
//セクション名の列挙
$BAK_SEARCHBUFFER = searchbuffer;
#BAK_SEARCHOPTION = searchoption;
gofiletop
while(1){
searchdown2 "^\\[([^\\]]+)\\](?\\1)",regular;
if(!result) break;
message gettext(foundtopx, foundtopy, foundendx, foundendy,1);
moveto foundendx, foundendy;
}
setsearch $BAK_SEARCHBUFFER, #BAK_SEARCHOPTION;
setreplace $BAK_REPLACEBUFFER;
endmacro;
キー名も基本的に同じだが、セクション名と違い、セクションの範囲内のみ検索する必要がある。
//セクション名、キー名の列挙
$BAK_SEARCHBUFFER = searchbuffer;
#BAK_SEARCHOPTION = searchoption;
gofiletop
while(1){
//セクションの検索
searchdown2 "^\\[([^\\]]+)\\](?\\1)",regular;
if(!result){
message "セクションが見つかりません。";
break;
endmacro;
}
$section = gettext(foundtopx, foundtopy, foundendx, foundendy);
#st_y = y + 1;
//セクションの終端を検索
searchdown2 "^\\[([^\\]]+)\\](?\\1)",regular;
if(!result){
gofileend;
}else{
golinetop2;
}
#en_y = y;
moveto 0,#st_y;
while(y < #en_y){
golinetop2;
if(code == '[') break;
if(code == eof) break;
if(code != ';'){
selectline;
searchdown2 "^([^=]+)",regular,inselect;
if(result){
$key = gettext(foundtopx, foundtopy, foundendx, foundendy);
}
message "section=" + $section + "\n" + "key=" + $key;
}
movetolineno 0, lineno + 1;
}
}
setsearch $BAK_SEARCHBUFFER, #BAK_SEARCHOPTION;
setreplace $BAK_REPLACEBUFFER;
endmacro;
iniファイルは、
から構成されて、以下のようなフォーマットになります。 (最小構成です。"section"も"key"も複数可能)
[section]
key=value
"section"は重複はNG。(重複してもいいが、最初に見つかる"sectiopn"が使用され、後は無視される) "key"は"section"が異なれば、重複も可能。 "key"も"section"も、英語のみ使用できる。日本語を使用した場合は、正常に動作しない可能性有り。英語でも大文字小文字を区別しないため、日本語の"key"を正常に認識しない場合がある。
例えば、"key"で、片仮名の"ク"(0x834E)と"ハ"(0x836E)を区別できない。
test.ini の内容
[test]
ク=これは「ク」です。
ハ=これは「ハ」です。
テストマクロ
message getinistr(currentmacrodirectory + "\\test.ini", "test", "ハ");
実行結果
---------------------------
秀丸エディタ
---------------------------
これは「ク」です。
---------------------------
OK
---------------------------
"ク"(0x834E)と"ハ"(0x836E)は、の2バイト目は、0x4Eと0x6E でアスキーコードでは、"N"(0x4E)と"n"(0x6E) になります。 INIファイルのキー名は、大文字小文字を区別しない為、"ク"(0x834E)と"ハ"(0x836E)の"key"を同じと認識します。 (テストマクロで、誤動作するのは、"ク"が最初にあるからです。"ハ"が先にあれば、意図通りになるが、今度は"ク"が誤動作する。) つまり、INIファイルのキー名はマルチバイト文字を正しく認識できていません。
頻繁に起こるケースではありませんが、注意は必要になります。 (アルファベット以外のキー名使用し、文字数が少ないと、問題になるかもしれない。)
秀丸エディタ Ver.8.56β10より、
がマクロ命令に追加されました。
これで、iniファイルでUnicode(UTF-16LE)を扱う事が可能なりましたが、注意が必要です。
Shift_JISで作成された既存ファイルに対し、writeini~w 系の命令使用して書き込んだ場合は、Unicode(UTF-16LE)で記録されません。元のエンコードである、Shift_JISで保存される為、Shift_JIS範囲外の文字は"?"等に変換されます。確実にUnicode(UTF-16LE)で保存したい場合には、書き込むファイルがあらかじめUnicode(UTF-16LE)である事を確認する必要があります。現状では、マクロ関数等でファイルのエンコードを調べる方法はないので、秀丸エディタ本体でiniファイルを開き、エンコードを確認する必要があります。 (存在しないファイルに対し、writeini~w 系の命令で書き込む場合は、自動的にUnicode(UTF-16LE)のファイルが作成されます。)
以下は、Ver.8.54までの動作になります。
現状では、マクロの関数を使って、iniファイルにUnicode文字を、そのまま記録することはできない。
エラー等にはならないが、Shift_JISに含まれない漢字の場合は"?" に、"è" 等アルファベットを基本文字とした文字の場合、基本文字の "e" だけに変換されて記録される。
Unicodeが扱えないわけではなくて、iniファイルをUnicode(UTF-16LE)で保存しても、秀丸マクロのwriteinistr/getinistrでアクセスは可能。 (ただし、自動的に変換(UTF-16LE → Shift_JIS)されるので、正確に扱えるのは、Shift_JIS範囲内の文字のみ)
Unicodeで読み書きするには、事前にUnicode(BOM)付きのファイルを、作成しておく必要がある。 iniファイルがない場合は、自動的にファイルが作成されるが、システムロケール(CP932)で作成される。
対処方法としては、以下の内容が考えられる。
秀丸エディタ本体で、iniファイルを操作し、Unicodeで保存する。
Unicode文字をデコードして保存する。(UTF-8にする等)
外部DLLを作成し、Unicode用APIを呼び出す。(ファイルは事前にUnicodeで作成)
ht_tools.dll に Unicode用INIファイルアクセス関数を追加。
以下の内容は、秀丸エディタVer.7.00β15以降では発生しません。 (Ver.7.00β15で、ショートファイルネームでfindhidemaruが可能になりました。)
秀丸エディタで開いているファイルの中に、指定したファイルがあるかどうかを、調べる方法として、 findhidemaru文がありますが、秀丸エディタでファイルを開いているのに、findhidemaru文で、見つけられない場合があります。
サンプルマクロ
//ウィンドウハンドルを取得
#main = hidemaruhandle(0);
//ファイル名を作成
$newname = hidemarudir + "\\test0123456789.txt";
//ファイルを開く
openfile $newname;
insert "test!!";
save;
//普通の(?)ファイル名
$searchname1 = filename;
//ショートファイル名
$searchname2 = filename3;
//ウィンドウハンドルを取得
#sub = hidemaruhandle(0);
//findhidemaruは自分自身を対象にしない為、秀丸エディタを切り換える。
//$newnameを開いている秀丸エディタを検索
setactivehidemaru #main;
#n = findhidemaru($searchname1);
if(#n == -1){
message $searchname1 + "が見つかりません!!";
}else{
message $searchname1 + "が見つかりました。";
}
//ショートファイルネームで検索
#n = findhidemaru($searchname2);
if(#n == -1){
message $searchname2 + "が見つかりません!!";
}else{
message $searchname2 + "が見つかりました。";
}
//開いたファイルを閉じて削除
closehidemaruforced #sub;
run getenv("COMSPEC") + " /C del \"" + $searchname1 + "\" >nul";
endmacro;
このマクロを実行すると、最初に「~が見つかりました。」と表示され、次は「~が見つかりません!!」と表示されます。(表示されるはずです。)
一回目と、二回目の違いは、検索で指定するファイル名の違いで、見つからない二回目は、ショートファイルネームを使って検索しています。
findhidemaru文には、ショートファイルネームではなく、ロングファイルネームを指定しないと、検索に失敗するようです。
2013/01/12「ファイルを開いた状況の判定」を修正。「通常操作以外の自動起動マクロ」を追加
自動起動マクロに関する情報やメモ
自動起動で起動された場合、起動されたイベントの種類およびパラメータの値は、自動起動されたマクロからexecmacroで実行されたマクロでも、取得可能。
test.mac(自動起動)
↓
test1.mac(test.macからexecmacroで起動)
↓
test2.mac(test1.macからexecmacroで起動)
上記の様な構成でも、test2.macからeventおよび、geteventparamは正常に(自動起動したと判断できる値が)取得可能。
また、test2.macで"seteventnotify"を使用した場合でも、問題ない。(キャンセルなどが正常に行われる。)
ファイルを保存していない状態で、ファイルを閉じると、以下の順番で実行される。
「ファイルを閉じる直前」は確実に実行されるが、保存は"seteventnotify"により行われない場合がある。
「ファイルを閉じる直前」で、ウィンドウを切り替えるような操作を行うと、切り替わった時点で、マクロを呼び出した秀丸エディタは、閉じてしまいます。
test1.txtを閉じる時に「close.mac」を実行。
↓
「close.mac」で、test2.txtを開く
↓
マクロ実行中でも、test2.txtを開いた時点で、test1.txtが閉じる。
「ファイルを閉じる直前」は、ファイルを保存しないで破棄する場合でも実行される。
という場合は、マクロが実行されたファイル内容と実ファイルの内容が、異なる事になります。設定を保存するようなマクロは、「保存直後」で実行する方がいいかもしれない。 (ケースバイケースですが。)
マクロの実行中は自動起動マクロは実行されません。(自動起動マクロが起動すると、困る場合もある。) Ver8.30β12より、setcompatiblemodeの設定で、タイマー系(カーソル移動後、編集後)のみ自動起動マクロが実行可能になりました。
マクロ実行時に自動起動マクロを実行するには、レジストリから、マクロが有効か無効かを調べ、有効な場合はマクロのファイル名を取り出し、各イベント毎にexecmacro文を使って実行します。しかし、自動起動マクロで動作させることを前提としたマクロには、event、geteventparamをみて、動作する場合もあり、単純にexecmacroでは動作しない場合もあります。
このような場合は、マクロ側の対処が必要です。Ver.8から、マクロに引数が指定できるため、引数を指定した場合は、event、geteventparam の値にかかわらず、処理を実行する様、マクロを構成します。
無題ファイルを保存時の動作。
無題ファイル保存時に設定される、デフォルトの命名規則に、マクロで割り込もうかと思ったが、無理みたい。
geteventparam(0)の値を確認する。
外部からファイルを開いた場合。
常駐秀丸エディタから開いた。
タグジャンプ/ダイレクトタグジャンプした場合
タグジャンプ/ダイレクトタグジャンプした場合は、getresultex(7) で、ジャンプ先の行番号を取得可能。
(普通に開いた場合は、getresultex(7)の値は0(zero)になっているが、タグジャンプで開いた後の場合は、閉じるまで、getresultex(7)の値はクリアされない。その為、getresultex(7)単独では、誤判定する場合がある。)
(秀丸エディタ初回起動時は getresultex(7) の値は0(zero)になっているが、タグジャンプで開いた場合は、その値が保持され続け、更新されるが、秀丸エディタ終了まで getresultex(7) の値はクリアされない。その為、getresultex(7)単独では、誤判定する場合がある。)
turukame.3:05534
いちおう、
(event == 1) && (geteventparam(0) == 0) && (getresultex(7) == lineno)
で、タグジャンプ/ダイレクトタグジャンプした事がわかる。 (ただし、カーソル位置の自動復帰が有効になっていた場合は、誤判定する可能性がある。)
grep結果からジャンプしたかどうかを判定するには、自分より一つ下のウィンドウのファイルタイプを確認する。
filetype[1] == "grep"
ファイルタイプが、"grep"なら、grep結果からジャンプしたことがわかる。
通常操作以外(?)で、自動起動マクロの実行される種類と順番等のメモ。 (編集後タイマー、カーソル移動後タイマーは、未確認。)
通常は、ブラウザを指定しますが、スクリプトも指定可能です。(確認したのはWSH)
C:\Windows\system32\wscript.exe scriptfullpath.vbs
と指定しておくと、URLを引数にして、スクリプトが起動します。
URLのカスタマイズと、スクリプトを併用すれば、用途が増えそう。
サポートフォーラムでの例
関連項目
キーワードはないので、「ファイルタイプ別の設定」の設定値を直接見る。
#n = getconfig("Outline");
if(#n == 0){
message "枠が表示されていません。";
}else{
message "枠が表示されています。";
}
Ver.8
秀丸エディタVer.8β22より、outlinehandle キーワードが追加されました。 outlinehandleは、アウトライン枠が表示されていれば、ウィンドウハンドルを、表示されていない場合は、0(zero)をかえすので、これで判定が可能です。
非表示:outlinehandle = 0
表示 :outlinehandle = 0以外
現状(Ver.7.03)では、秀丸エディタの機能として、保存する方法はありません。「ツリー表示」の場合にかぎり、レベルをTAB文字×レベルに変換した状態で、クリップボードにコピーが可能です。ツリー状にするにはTAB文字-罫線の変換が必要。
ツリー以外では、他のツールを使う方法がある。
Ver.8
秀丸エディタVer.8では、「一覧のコピー」というコマンドが追加され、ツリー表示以外(関数一覧、強調一覧)でも、アウトライン枠の内容を、クリップボードにコピー可能になっています。ツリーになっている箇所は、レベルをTAB文字×レベルに変換されます。
「アウトライン解析の枠」ウィンドウのクラス名は"HM32OUTLINE"。エディタと一体化している場合は、"findwindowclass"、"findwindow"では見つけられない。分離している場合は、"findwindowclass"、"findwindow"で見つけることができ、ウィンドウのキャプションが"アウトライン"になる。 (一体化している場合、キャプションはなし。)
ツリー表示で「ツリーそのものをコピー」を実行するには、ツリー表示ィンドウに対し
#a=sendmessage( #hwnd, 0x0111,7171,0);
を実行すればいい。(turukame.3:01535を参照) ツリー表示ィンドウのクラス名は"HM32TREEINFO"だが、"findwindowclass"では、見つけられない。その為、秀丸マクロ単体では実行は不可能で、外部DLLを使う必要がある。
ツリー表示ィンドウは、「アウトライン解析の枠」の子ウィンドウになる為、先に"HM32OUTLINE"を検索してから、その子ウィンドウである"HM32TREEINFO"を検索し、ウィンドウハンドルを取得する。
Ver.8
秀丸エディタVer.8より、outlinehandle キーワードが追加されています。 outlinehandleで取得したハンドルに、コマンドを送信することにより、「ツリーそのものをコピー」を実行する事が可能になっています。実行可能なコマンドは、以下のページを参照。
マクロで確認する方法としては、「見出し」の有無で確認する。「見出し」は、「アウトライン解析の枠」に表示される内容なので、その有無を調べればいい。
手順としては、
という感じです。
「次の見出し」は、見出しがない場合、ファイルの最後に移動し、実行結果(result)は、常に"true"を返す。その為、「次の見出し」の結果では判断できないので、移動先の「foldable」キーワードを確認する必要がある。
あとは、DLLを作って、Windows APIを駆使し、"一覧に何もありません"と、表示されているか調べる。
"一覧に何もありません"と表示されているか調べるのは、マクロでも可能です。「アウトライン解析の枠」を表示した状態で、
message gettitle(4);
を実行すると、アウトライン解析の枠の見出しを取得できます。何もない場合は、"一覧に何もありません"と表示されます。
getconfig("Outline")が"1"であり、findwindow("アウトライン","HM32OUTLINE")が"-1"以外なら、浮いていると判断できる(と思う)。確実に判定するなら、レジストリを読むこと。
レジストリデータに関しては、秀丸エディタのレジストリデータのアウトライン解析の枠 を参照
config("xOutline:?")を使えば、「一時的な設定」となり、表示状態が保存されることはありません。「一時的な設定」にしたくない場合は、sendmessageを使います。
#ret = sendmessage(hidemaruhandle(0),0x0111, 338,0);
現状、sendmessageを使うと、「一時的な設定」にならず、表示状態が保存されることはありません。ただ、保証されている動作でないかもしれません。
Ver.8.75 以降、outlinesize キーワードで大きさを取得可能です。
を取得できます。枠の表示位置はレジストリデータを参照の事。 (秀丸エディタのレジストリデータのアウトライン解析の枠)
setoutlinesize 文で設定も可能です。
現在開いているファイルで使用している、「ファイルタイプ別の設定」の設定は、 "currentconfigset"で取得可能。 "currentconfigset"は、config文で設定を変更しても(一時的な変更でも)保持される。現在の設定が"一時的な設定"かどうかは、"configstate"で確認可能。 "一時的な設定"を解除するには、configset文を使用し"再設定"するか、ファイルを一度閉じ、再度開く。(再読み込みでは不可)
任意の拡張子に関連付けられた、「ファイルタイプ別の設定」を取得するには、レジストリを見る。 "CURRENTUSER"にある"Software\Hidemaruo\Hidemaru"の下に、拡張子毎のノードが作成され、設定名が保存されている。レジストリを触りたくない場合は、調べたい拡張子をつけたダミーファイルを開き、 "currentconfigset"を調べればいい。
"無題"の新規ファイルの場合、filetypeは"new"になります。しかし、起動時に、存在しないファイル"test.txt"を指定すると、新規ファイルですが、filetypeは".txt"になります。
hidemaru.exe test.txt
つまり、新規ファイルだけど、filetypeで判定ができない場合があります。
この様な場合に、新規ファイルの判定を行うには、タイトルバーの内容を使います。秀丸エディタ Ver.7.00で、gettitle関数が追加され、表示中のタイトルバーの内容が、取得可能になりました。上記の方法で、存在しないファイル"test.txt"を指定し、タイトルバーの内容を取得すると、以下のようになります。
test.txt (新規) - 秀丸
gettitle関数で取得した内容に、"(新規) - 秀丸"が含まれている場合、起動時に存在しないファイルを指定されたと、判断ができます。ほとんどないと思いますが、ファイル名に"(新規) - 秀丸"という文字列が含まれる場合を考慮し、厳密にチェックした方がいいのかもしれません。
自動起動マクロの「新規作成直後」は、存在しないファイルを指定した場合でも、正常に起動します。
起動時に、ファイルのエンコード指定があり、タイトルバーにエンコードの種類や、改行を表示する設定になっている場合、取得文字列が変わります。
起動時の指定 :hidemaru.exe /fs test.txt
取得できる文字列:test.txt (新規) [Shift-JIS] [CR+LF] - 秀丸
2009/08/13追加
単純に、existfile で調べるという方法もあります。秀丸エディタは、保存するまでは、ファイルの生成を行わないので、ファイルの有無を調べる事で判定が可能です。
2010/04/25追加
参考までに、各状態で取得できるファイル名関連のキーワード
新規ファイルの場合
タイトルバーの内容: (無題) [Shift-JIS] [CR+LF] - 秀丸
********** ファイル名関連キーワード
filename:
basename:
directory: d:\temp
filetype: new
filename2:
basename2:
directory2: D:\temp
filename3:
basename3:
directory3: d:\temp
存在しないファイルを指定して開いた場合
タイトルバーの内容: D:\temp\test.txt (新規) [Shift-JIS] [CR+LF] - 秀丸
********** ファイル名関連キーワード
filename: d:\temp\test.txt
basename: test.txt
directory: d:\temp
filetype: .txt
filename2: D:\temp\test.txt
basename2: test.txt
directory2: D:\temp
filename3: d:\temp\test.txt
basename3: test.txt
directory3: d:\temp
カーソル行が折りたたみ可能かどうかを表す、foldableキーワードには、使い方として、引数なしと引数ありの、二通りがあります。
引数なしの場合は、秀丸エディタが認識している(?)、折りたたみの条件を返します。引数を指定した場合は、指定した引数(折りたたみ条件)に対し、可能かどうかを返します。 (not falseで判定する)
秀丸エディタ本体には、この機能はありません。その為、実現するにはマクロを使う必要があります。折りたたんでいる箇所の探すのが、手間がかかります。「アウトライン解析との対応」のみを対象とするなら、「次の見出し」を使えばいいのですが、その他の箇所も対象とすると、先頭から順番にスキャンする必要があります。
2018/03/11 COM作成関連、サンプルその9 のリンクを修正
秀丸エディタVer.8.00より、COM関連のマクロが追加され、秀丸マクロ上から、各種COMの操作が可能になります。
参考になるMicrosoftのwebサイト
参考になる各種webサイト
現状での問題点等
サンプルその1~6は、macrodll.dllの使い方のサンプルを、秀丸マクロで書き直しただけです。 Ver.8以外では動作しません。 ##### サンプルその1 com_macro_test.mac
InternetExplorerの操作を行います。指定されたURLを開き、URLショートカットを作成します。
標準入出力へのアクセスを行います。実行時すると、コマンドプロンプトが表示されます。秀丸エディタをアクティブにすると、InputBoxが表示されているので、適当に入力してください。ソートして出力します。ソートはsort.exeを使用しています。
ファイル操作のサンプル。実行時すると、InputBoxが表示されので、適当に入力してください。入力された内容をファイルに出力し、コピー、移動を行います。マクロ実行後、マクロと同じ場所に"COM_TEST3_TEST.TXT"が作成されるので、削除してください。
起動済みのInternetExplorerから情報を取得。マクロと同じ場所に、URLショートカットを作成します。
起動済みのInternetExplorerから情報を取得。選択している文字列を取得します。
タブブラウザの"Sleipnir"を制御。(動作確認は Ver.2.8.5) 指定したURLを開きます。既にタブで開いている場合はリロード、そうでない場合は、新規タブで開きます。
"Sleipnir"を制御するには、"Sleipnirオプション"を変更する必要があります。クライアント->全般->「スクリプトによるクライアントの操作を許可する」にチェックを入れること。
13行目を書き換えると、Lunascapeでも動きます。動作確認は、Lunascape Ver.5.1.3
変更前
00013|#Browser = createobject("Sleipnir.API");
00014|if(#Browser == 0){
00015| $ERR = "Sleipnirオブジェクト作成に失敗";
00016| goto ERRMSG;
00017|}
変更後 "Sleipnir.API" -> "Lunascape2.LunascapeAPI"
00013|#Browser = createobject("Lunascape2.LunascapeAPI");
00014|if(#Browser == 0){
00015| $ERR = "Sleipnirオブジェクト作成に失敗";
00016| goto ERRMSG;
00017|}
ファイル一覧の取得を行います。フォルダを選択し、表示したい拡張子を入力してください。指定しない場合は、全ファイルを表示します。表示する順番の指定はできません。(WSHの規定の順番です。)
WshShellオブジェクトのRunメソッドについて。
Runメソッドでは、通常、非表示、最小化、最大化、最小化(非アクティブ)、などの状態で、実行が可能です。(アプリケーションによっては、効かない場合もあります。)
//表示状態の設定
#SW_HIDE = 0; //非表示にする。他のウィンドウがアクティブになる。
#SW_SHOWNORMAL = 1; //アクティブにして表示する。
#SW_SHOWMINIMIZED = 2; //アクティブにして最小化する。
#SW_SHOWMAXIMIZED = 3; //アクティブにして最大化する。
#SW_SHOWNOACTIVATE = 4; //直前の状態(位置・大きさ)に戻す。SW_NORMALとほぼ同じだが、アクティブ化はしない。
#SW_SHOW = 5; //表示する。アクティブ化も行う。
#SW_MINIMIZE = 6; //最小化する。他のウィンドウがアクティブになる。
#SW_SHOWMINNOACTIVE = 7; //最小化する。アクティブ化は行わない。
#SW_SHOWNA = 8; //表示する。SW_SHOWと同じだが、アクティブ化はしない。
#SW_RESTORE = 9; //直前の状態(位置・大きさ)に戻す。
#SW_SHOWDEFAULT = 10; //アプリケーション起動時のデフォルト状態に戻す。
#WshShell = createobject("WScript.Shell");
if(#WshShell == 0){
message "WshShellオブジェクトの作成に失敗しました。";
endmacro;
}
//アクティブウィンドウを切り替えないで、最小化状態でメモ帳開く。
//#SW_SHOWMINIMIZEDの場合は、メモ帳側にアクティブなウィンドウが切り替わってしまう。
callmethod #WshShell, "Run", "notepad.exe", #SW_SHOWMINNOACTIVE, false;
releaseobject #WshShell;
実行ファイルからの戻り値も取得可能です。取得する場合は、"callmethod_returnnum"を使います。さらに、Runメソッドの第3引数を、trueにする必要があります。
実行するvbscript(test.vbs)
Wscript.echo "戻り値のテスト"
Wscript.quit(100)
上のサンプルマクロを、一部変更。
#ret = callmethod_returnnum(#WshShell, "Run", "wscript test.vbs", #SW_SHOWNORMAL, true);
message str(#ret);
"100"と表示されます。
戻り値を取得するのは、COMを使用しなくても可能で、run/runsync/runsync2実行後、 getresultexで取得できます。
http通信を行う"Msxml2.XMLHTTP"についてのメモ。
実際のマクロの例は、サポートフォーラムの投稿 hidesoft.4:07045 を参照して下さい。
httpレスポンスヘッダの"Content-Type"で、"charset"が指定されている場合は、
"ResponseText"プロパティの内容は、文字化けしないで取得可能。
"charset"が指定されていない場合は、文字コードをUTF-8として処理するため、
UTF-8以外の文字コードでは、文字化けを起こす。
(metaタグで指定された、"charset"ではないので注意)
同じURLに連続でアクセスした場合、2回目はキャッシュを参照する。確実にwebサイトからデータを取得するには、リクエストヘッダを設定する必要あり。 ("If-Modified-Since"、"Cache-Control"等)
参考にしたwebサイト
MS Office の Wordと連携(?)を行う例 です。 Wordを起動し、何か文字列を入力後、範囲選択を行ってから、マクロを実行してください。
Word文書で選択している範囲を秀丸エディタに取り込みます。
Wordオブジェクトに関しては、Word のヘルプを参照してください。
XML と 各種スクリプト(vbscript、jscript、Active Perl等)を使用し、COM コンポーネントを作成できます。 vbsscript、jscriptからは無理ですが、Active Perl等を使えば、Windows API等も使用可能と思われる。
詳細は、ヘルプや"スクリプト コンポーネント チュートリアル"を参照してください。
"Windows Script Component Wizard" を使えば、classid も自動的に生成し、雛形も作成可能。
COMコンポーネントなので、使用するには、レジストリに登録が必要です。(regsvr32 で登録/登録解除)
実行するホストが異なるので、WSHとは、オブジェクトの生成方法が異なる。 CreateObject関数ではなく、objectタグを指定する。タイプライブラリを指定すれば、その中の定数も使用可能。
wsfと同じく、scriptタグを使用し、異なるスクリプト言語を、同じファイルに記述可能。 componentタグを使えば、同じファイルに、別の機能を持ったスクリプトコンポーネントを作成可能。 createComponent関数で、参照可能なので、アクセス用関数/プロパティを作成すればいい。
WSHのVbscriptでは、コレクションの作成はできない。そのため配列を返すためには、別途オブジェクトが必要になる。
秀丸マクロ用に、Jscript/Vbscriptで、Windowsスクリプトコンポーネント を作ってみました。 HidemaruMacroWscLib
Express Editon では、COMコンポーネントのテンプレートはないが、作成は可能。 VB、C#を使用し、クラスを作成すればいい。Publicに指定したプロパティ、メソッドが外部に公開される。
「チュートリアル : Visual Basic での COM オブジェクトの作成」にある「COM クラス テンプレートを使用しない COM オブジェクトの作成」を参照。「COM相互運用機能の登録」は、Express Edtion にはないでプロジェクトのプロパティにある、「アプリケーション」→「アセンブリ情報」で開くダイアログにある「アセンブリをCOM参照可能にする」にチェックを入れること。
regasm.exe 実行時に /codebase オプション 指定する必要があるので、DLLに署名を行う必要があります。プロジェクトのプロパティにある、「署名」→「アセンブリの署名」にチェックをいれ、「新規作成」からキーファイルを作成し、指定してください。
COMとして使用するには、登録が必要。regasm.exe を使用すること。 x64で登録する場合には、x64用のregasm.exeを使用すること。 anycpuでコンパイルしておけば、x86/x64のどちらでも使えるDLLが作成できる。
作成:2009/09/20 更新:2010/04/08 CSV、TSVモードの判定方法を追加
CSV、TSVモードのメモ
CSVモードの場合、区切り文字である","のcolorcodeには、"0x00000020(タブ)"がセットされる。
現在のモードは、"TabMode"で取得可能
#TabMode = getconfig("TabMode")
モード判定の例
if((0x000f & #TabMode) == 0x0000){
//通常モード
}else if((0x0f0f & #TabMode) == 0x0001){
//TSVモード
}else if((0x0f0f & #TabMode) == 0x0101){
//CSVモード
}
作成:2013/06/29 更新:2013/06/29 アウトプット枠に、リンク追加
ファイルマネージャ枠とアウトプット枠のメモ
関連項目 : - ファイルマネージャ枠切替マクロ - 未ロード/非表示状態でも、SetModeを実行すると枠は表示される。 - SetModeを実行すると、枠にフォーカスが移動する。 SetModeを実行しても、枠にフォーカスは移動しない。フォーカスを切り替えるには、setfocusコマンドを実行する必要がある。(Ver.8β26より) - 枠のクラス名は「HM32ExpPane」。実際にコマンドを送るのはその下にいる「HM32ExpPaneServer」。 GetWindowHandleで取得できるのは、「HM32ExpPaneServer」のウィンドウハンドルになる。 - 未ロード/非表示状態で、GetModeを実行すると、-1が返る。その為、単純に表示/非表示を切り替えることが、マクロではできない。 (命令として用意されていないだけで、マクロで切り替える方法はある。) 表示状態を、共有しないグローバル変数に保存するのが簡単かもしれない。
作成:2010/03/30 更新:2015/03/21 マクロファイル自体の文字コードについて を修正
主にShift_JISとUnicodeに関してです。他の文字コードに関しては、使ってないのでよくわかりません。
マクロヘルプに記載があるように、以下のようになります。
Shift_JIS以外の場合は、必ずBOMをつける必要があります。
マクロを公開する場合は、Shift_JISにしておいた方が無難です。(どのバージョンで使われるか不明なので。)
基本的には、Shift_JISでデータを保持しています。 Unicodeで記述されたファイルの内容を、gettextで取り込んでも、マクロ内部では Shift_JISになります。 Unicodeにはあるが、Shift_JIS にない文字は、秀丸エディタ独自の形式(1文字を4バイトのデータで表す)で保持されますが、マクロ上では、互換性からShift_JIS相当の2バイトデータとして表現されます。
例1)Shift_JISにない文字
$a = "森鷗外";// "鷗" は Shift_JISにはない文字
message $a + "\nstrlen:" + str(strlen($a)) + "\nwcslen:" + str(wcslen($a)); //--> 6 と 3 が表示される。
例1)実行結果
---------------------------
表示される内容
---------------------------
森鷗外
strlen:6
wcslen:3
---------------------------
strlenでは、3文字×2バイト = 6 となる。 wcslenでは、漢字も1文字とカウントするので、3 となる。
例2)Shift_JISになく、サロゲートペアで表現される文字。
$a = "森鷗外𠘨";// "鷗" は Shift_JISではない文字、"𠘨"は UTF-16LEでサロゲートペア(2文字)で表現される文字
message $a + "\nstrlen:" + str(strlen($a)) + "\nwcslen:" + str(wcslen($a)); //--> 8 と 5 が表示される。
例2)実行結果
---------------------------
表示される内容
---------------------------
森鷗外𠘨
strlen:8
wcslen:5
---------------------------
strlenでは、サロゲートペアが含まれているが、4文字×2バイト = 8 となる。
wcslenでは、サロゲートペアを 2文字とカウントするので、3 + 2 = 5 となる。
引数で指定された文字列を、UTF-16LEとしてあつかう wcslen は サロゲートペアは2文字とカウントします。 (上位サロゲート、下位サロゲートで2文字)
判定用関数は現状ではない。「charindex_to_byteindex」を使用することにより、確認可能です。
サロゲートペアに関しては、Unicode - Wikipedia も参考にしてください。
Unicode(UTF-16)は、全角・半角に関係なく1文字あたり2バイトを使用しますが、1文字を表現するのに、4バイト(2文字分)必要な場合があります。
コードポイント値が、0x10000以上の文字の場合は、2バイトでは足りないので、4バイトで1文字を表現します。
(サロゲートペア(代用対)、上位サロゲートと下位サロゲート各2バイトで、合計4バイト)
上位サロゲート範囲 0xD800~0xDBFF
下位サロゲート範囲 0xDC00~0xDFFF
サロゲートペアの範囲でも、wc系の関数は、1文字を2バイトとして動作します。その為、文字単位で扱っているつもりが、文字を分断してしまう場合もあります。
Unicodeで、文字を切り出す場合は、文字コード(コードポイント値)を確認する必要があります。文字コード(コードポイント値)は、unicode関数で確認できますが、確認方法によっては、サロゲート値が表示されます。
//𡵢のサロゲートペア値
$b = "\uD847\uDD62";
message $b + "\n" + hex(unicode($b)) + "\n" + hex(unicode(wcsmidstr($b, 0, 1)));
上記マクロを実行すると、
𡵢
21D62
D847
となり、unicode関数を呼び出す際に、使用する文字列によって、取得できる値が異なることがわかります。 unicode関数は、サロゲートペアの上位、下位が、単独で対象になる場合は、その値(サロゲートの上位、または下位)をそのまま返します。 (サロゲートの片側だけでは、コードポイントがわからない為)
Unicodeを含む文字変数内の文字列を、文字単位で操作する場合には、unicode関数でコードポイントをチェックしながら行います。
サロゲートペアに気をつけること。
漢字(サロゲートペアも含む)はマクロ上では2バイトで表現されますが、midstr関数で、先頭1バイトだけ切り出した場合、 Shift_JISに存在する文字は、Shift_JISの上位バイトの文字が返され、Shift_JIS範囲外の場合は、"?"という文字が返されます。
//英字、漢字、Unicodeのみ存在する文字、サロゲートペアで表現している文字を一文字ずつ分解する例
$a = "abc森def鷗gh外ij𠘨k";
$out = "";
#cnt = 0;
#pos = 0;
#len = wcslen($a);
while(#len > #pos){
$b = wcsmidstr($a, #pos, 1);
if($b == "") break;
#d = unicode($b);
//サロゲートペアの上位側かチェックする
if((0xD800 & #d) == 0xD800){
//上位側なら、下位バイトを含め取得し直す
$b = wcsmidstr($a, #pos, 2);
#d = unicode($b);
#pos = #pos + 1;
}
#pos = #pos + 1;
#cnt = #cnt + 1;
$out = $out + rightstr("00" + str(#cnt), 2) + ":" + $b + "\n";
}
message $out;
endmacro;
基本的には、dllfunc/dllfuncstrの引数に Shift_JIS範囲外の文字は指定できません。 dllfuncw/dllfuncstrwを使用することになります。例外的に、hmjre.dll等、サイトー企画が作成しているDLLは、Shift_JIS + 独自形式データ の引数を渡すことが可能になっています。
外部DLLの呼び出しに関しては、「外部DLL呼び出しとunicode」も参照のこと。
hmjre.dllは、例外的にdllfunc/dllfuncstrで、Unicodeを含む文字列を、秀丸エディタ独自の形式で受け取ることが可能です。
独自形式はUnicode1文字を4バイトで表現するため、hmjre.dllは、Unicode1文字を4バイトとカウントします。マクロ関数は、Unicodeでも2バイトとカウントするため、DLL関数の引数や戻り値と、マクロ関数の引数や戻り値には、ずれが発生します。
このずれを、補正するための方法としては、2つあります。
前者は、hmjre.dll内で補正を行います。後者は、hmjre.dllの戻り値を補正します。個人的には、hmjre.dll内で補正をかける、"SetUnicodeIndexAutoConvert"を使う事をお勧めします。
戻り値がずれる例
$a = "森鷗外1𠘨2";
loaddll hidemarudir + "\\hmjre.dll";
if(!result){
message "DLLのロードに失敗";
endmacro;
}
//"2"を検索する。
#a = dllfunc("FindRegular", "2", $a, 0);
#c = strstr($a, "2");
message str(#a) + "-> FindRegularの結果\n" + str(#c) + " -> strstrの結果\n";
endmacro;
マクロの実行結果(FindRegularの結果と一致しない)
---------------------------
表示される内容
---------------------------
17-> FindRegularの結果
9 -> strstrの結果
---------------------------
// 1
// 012345678901234567 hmjre.dllが認識している状態
//$a = "森鷗..外1𠘨......2";
// 0123456789 マクロ関数が認識している状態
//$a = "森鷗外1𠘨2";
hmjre.dllは、"鷗"を4バイト、"𠘨"をサロゲートペアなので8バイトとしてカウントしているため、"2"の位置は17になる。マクロ関数は、"鷗"、"𠘨"を各2バイトとしてカウントしているため、"2"の位置は9になる。
引数がずれる例
$a = "森鷗外1𠘨2";
loaddll hidemarudir + "\\hmjre.dll";
if(!result){
message "DLLのロードに失敗";
endmacro;
}
//7バイト目から検索するので、"2"にマッチするのを期待している。
#a = dllfunc("FindRegular", "\\d", $a, 7);
#len = dllfunc( "GetLastMatchLength");
$a1 = midstr( $a, byteindex_to_charindex($a,#a), #len);
message str(#a) + "バイト目\n\"" + $a1 + "\" -> FindRegularの結果";
endmacro;
マクロの実行結果(検索開始位置がずれる)
---------------------------
表示される内容
---------------------------
8バイト目
"1" -> FindRegularの結果
---------------------------
// 1
// 012345678901234567 hmjre.dllが認識している状態
//$a = "森鷗..外1𠘨......2";
// 0123456789 マクロ関数が認識している状態
//$a = "森鷗外1𠘨2";
hmjre.dllは、"鷗"を4バイトとしてカウントしているため、7バイト目は、"1"の前になる。その為、"2"をマッチするのを期待したが、"1"にマッチすることになる。
戻り値がずれる例(SetUnicodeIndexAutoConvert で補正有効)
$a = "森鷗外1𠘨2";
loaddll hidemarudir + "\\hmjre.dll";
if(!result){
message "DLLのロードに失敗";
endmacro;
}
//"2"を検索する
#a = dllfunc("FindRegular", "2", $a, 0);
#n = dllfunc("SetUnicodeIndexAutoConvert", 1);
#b = dllfunc("FindRegular", "2", $a, 0);
#c = strstr($a, "2");
message str(#a) + "-> FindRegularの結果\n" + str(#b) + " -> FindRegularの補正された結果\n" + str(#c) + " -> strstrの結果\n";
endmacro;
マクロの実行結果(FindRegularの結果と一致する)
---------------------------
表示される内容
---------------------------
17-> FindRegularの結果
9 -> FindRegularの補正された結果
9 -> strstrの結果
---------------------------
// 1
// 012345678901234567 hmjre.dllが認識している状態
//$a = "森鷗..外1𠘨......2";
// 0123456789 マクロ関数が認識している状態
//$a = "森鷗外1𠘨2";
DLL内で補正が有効になり、マクロ関数と同じ値となる。
引数がずれる例(SetUnicodeIndexAutoConvert で補正有効)
$a = "森鷗外1𠘨2";
loaddll hidemarudir + "\\hmjre.dll";
if(!result){
message "DLLのロードに失敗";
endmacro;
}
//7バイト目から検索するので、"2"を取得するのを期待している。
#n = dllfunc("SetUnicodeIndexAutoConvert", 1);
#a = dllfunc("FindRegular", "\\d", $a, 7);
#len = dllfunc( "GetLastMatchLength");
$a1 = midstr( $a, #a, #len);
message str(#a) + "バイト目\n\"" + $a1 + "\" -> FindRegularの結果";
endmacro;
マクロの実行結果
---------------------------
表示される内容
---------------------------
9バイト目
"2" -> FindRegularの結果
---------------------------
// 0123456789 マクロ関数が認識している状態
//$a = "森鷗外1𠘨2";
DLL内で補正が有効になり、マクロ関数と同じ値となる。
作成:2010/04/17 更新:2010/05/05
プロジェクトファイルのフォーマットについてのメモ
レベルは、タブ(0x09)コードの数で表現される。
プロジェクトファイルの中身1
"File1",name="File1"
"Group",group,expand
(tab) "File2",name="File2"
(tab) ----------
(tab) "File3",name="File3"
----------
"File4",name="File4"
プロジェクトの表示1
┌ File1
├ Group
│├ File2
│├ ----------
│└ File3
├ ----------
└ File4
タブを間違って消すと、途中でレベルがおかしくなる。
プロジェクトファイルの中身2
"File1",name="File1"
"Group",group,expand
(tab) "File2",name="File2"
----------
(tab) "File3",name="File3"
----------
"File4",name="File4"
プロジェクトの表示2
┌ File1
├ Group
│└ File2
├ ---------- ←
├ File3 ←レベルが一段下なのに、無視されている。
├ ----------
└ File4
タブを間違って追加すると、アイコンがおかしくなる場合がある。
正常な場合
───────────
"Gr01",group,expand
(tab) "File-11",name="File-11"
(tab) "File-12",name="File-12"
(tab) "File-13",name="File-13"
"File-01",name="File-01"
"File-02",name="File-02"
───────────
┌Gr-01
│├file-11
│├file-12
│└file-13
├file-01
└file-02
異常な場合
───────────
"Gr01",group,expand
(tab) "File-11",name="File-11"
(tab) (tab) "File-12",name="File-12" ← タブを追加
(tab) "File-13",name="File-13"
"File-01",name="File-01"
"File-02",name="File-02"
───────────
┌Gr-01
│├file-11 ← グループのアイコンになる。
││└file-12
│└file-13
├file-01
└file-02
作成:2013/07/07 更新:2018/09/14
レイヤーを指定して、カラーマーカーをつけても、colorcodeキーワードで検出可能。 (レイヤーに関係なく、カラーマーカーの検出は可能)
colorcodeキーワードで検出は可能だが、どのレイヤーにカラーマーカーが付いているか調べるには、 enumcolormarkerlayer関数で、あらかじめレイヤーを取得しておき、getcolormarker関数でレイヤーを指定し、戻り値をチェックする。
$n = getcolormarker(0x01, "レイヤー名");
getcolormarker(0x01) の戻り値は、カラーマーカーが設定されていない場合は、""(空文字) を返す。これはレイヤーを指定した場合も同じ。 (文字色に透明を指定しても、-1(0xFFFFFF)を返してくるので、「透明」とは区別可能) 同じ文字に複数のレイヤーで色付けしている場合もあるので、全てのレイヤーでチェックする事。
秀丸エディタ Ver.8.85 より、getcolormarker 関数の第一引数のフラグが追加されている。 0x100 を指定すると、一番上のレイヤー名を取得可能になった。その為、総当たりしなくても、それより下のレイヤーを調べればいい。
複数のレイヤーがある場合、新しく追加されたレイヤーが上になる。現状では、レイヤーの順番を入れ替える方法はない。(レイヤーの上下関係を操作する命令は存在しない。)
enumcolormarkerlayer で 0から得られる順番は、
追加したレイヤー順 = 下にあるレイヤー
という順番になる。
getcolormarker で 0x10 を指定しても、レイヤー上の文字色は取得出来ない。レイヤーを使用している場合、現在表示されている色を取得するには、一番上のレイヤーから、情報を取得すること。(透明な場合は、その下の色となるので、上から順番にチェックすることになる。)
"6)"は、一番最下層にあるレイヤー(一番最初に追加したレイヤー)「layer1」に、カラーマーカを設定しているので、他のレイヤーが上に重なっていて、見えていない状態になっている。
作成:2015/04/11 更新:2021/08/02(「範囲内検索を選択」を使う方法を追加)
選択範囲内で、複数回の全置換を行う方法です。
サンプルデータ
hidemaru1 hidemaru2 hidemaru3 秀丸A
hidemaru4 hidemaru5 hidemaru6
hidemaru7 hidemaru8 hidemaru9 秀丸B
サンプルマクロ ここから
setcompatiblemode 0x20000;
replaceallfast "hidemaru" , "秀丸" ,inselect ,regular;// 1回目
replaceallfast "秀丸" , "HIDEMARU" ,inselect ,regular;// 2回目
endmacro;
2行目を選択してマクロを実行した結果(希望の結果)
hidemaru1 hidemaru2 hidemaru3 秀丸A
HIDEMARU4 HIDEMARU5 HIDEMARU6
hidemaru7 hidemaru8 hidemaru9 秀丸B
2行目を選択してマクロを実行した結果(実際の結果)
hidemaru1 hidemaru2 hidemaru3 HIDEMARUA
HIDEMARU4 HIDEMARU5 HIDEMARU6
hidemaru7 hidemaru8 hidemaru9 HIDEMARUB
2行目を選択し、2行目だけ置換を行うつもりで上記マクロを実行しても、2回目は全体が置換されます。これは、以下のような動作になっているからです。
という事で、範囲選択している個所に複数回の全置換を行うには、工夫が必要です。
finddown/findupを使う
finddown/findupは、実行時に各種検索オプションがそのまま有効で、オプションを変化させません。 (そのため「選択した範囲内のみ」の範囲も保持される。)
注意点としては、以下になります。
範囲内を対象とするには、対象がマッチしなくなるまで、コマンドを繰返し実行する必要がある。
検索開始位置を保持しておく必要がある。マッチした箇所にカーソルが移動してしまうので、複数回実行するには、検索開始位置にカーソルを戻す必要がある。
setcompatiblemode (0x20000); //検索オプションを保持
#screentopy = screentopy; //画面の先頭行を保持
disabledraw; //画面描画無効
if(selecting){ //範囲選択中かチェック
#x = seltopx; //範囲選択中なら、先頭位置を取得
#y = seltopy;
forceinselect 1; //「選択した範囲内のみ」に設定
}else{
gofiletop; //範囲選択していないなら、ファイルの先頭へ移動
#x = x; //先頭座標を取得
#y = y;
if(inselecting) escapeinselect; //「選択した範囲内のみ」を解除
}
call REPLACE_WORK #x, #y, "hidemaru", "秀丸"; //置換その1
call REPLACE_WORK #x, #y, "秀丸", "HIDEMARU"; //置換その2
if(inselecting) escapeinselect; //「選択した範囲内のみ」を解除
moveto 0,#screentopy; //カーソル移動
enabledraw #screentopy; //画面描画有効
endmacro;
//実際に置換処理を行うサブルーチン
REPLACE_WORK:
setsearch $$3, (searchoption|0x00000004); //検索対象と、置換フラグをセット その他必要なオプションはここで設定する事
setreplace $$4; //置換文字をセット
##ret = true;
while(##ret){ //見つからなくなるまで、検索・置換を実行
finddown2; //カーソル位置から検索するので、finddown2 を使う。
##ret = result;
}
moveto ##1, ##2; //置換開始位置に移動
return;
部分編集を使う
選択範囲が行単位の場合は、部分編集が使えます。
部分編集を使うと、編集対象は部分編集中の箇所になるので、 replaceall/replaceallfast文の対象を限定できます。
ただし、マクロの互換性から、普通にreplaceall/replaceallfast文を実行すると、部分編集中でも部分編集が解除されてしまいます。(部分編集外も検索置換対象になる。)
その為、明示的に部分編集のみを対象とするように、指示を行う必要があります。その指示は、「setcompatiblemode」文を使用します。
setcompatiblemode (0x20000|0x000C);
また、部分編集になると画面が、部分編集モードに切り替わってしまいます。それが気になる場合は、画面の描画を制御してください。
欠点としては、すでに部分編集を行っていた場合、部分編集が解除されてしまう事です。 (マクロで、状況を調べ元の部分編集に戻す事は可能でしょう)
setcompatiblemode (0x20000|0x000C); //検索オプションを保持し、部分編集を解除しない
#screentopy = screentopy; //画面の先頭行を保持
disabledraw; //画面描画無効
if(selecting) rangeeditin; //範囲選択していたら部分編集へ
replaceallfast "hidemaru" , "秀丸" , regular; //置換その1
replaceallfast "秀丸" , "HIDEMARU" , regular; //置換その2
if(rangeeditmode != 0) rangeeditout; //部分編集中なら解除する
moveto 0,#screentopy; //カーソル移動
enabledraw #screentopy; //画面描画有効
endmacro;
カラーマーカーを使う
選択範囲が行単位ではない場合は、カラーマーカーを使います。
選択範囲にカラーマーカーをつけて、「追加の条件」から「範囲の指定/カラーマーカー内」をチェックし、「「一時的なカラーマーカー」の範囲」を指定する事で、replaceall/replaceallfast文の対象をカラーマーカーの範囲内に限定させます。カラーマーカーは、「編集したら削除」をOFFの状態で設定すれば、置換でカラーマーカーが削除されることはありません。
setcompatiblemode 0x20000; //検索オプションを保持
#screentopy = screentopy; //画面の先頭行を保持
$taegetlayer = "replaceall"; //レイヤー名の設定
$backuplayer = ""; //設定のバックアップ
disabledraw; //画面描画無効
if(selecting){ //範囲選択されていた場合
colormarker -1, -1, 0, 0, 0, $taegetlayer; //文字色、背景色を透明、普通、編集しても維持、で指定したレイヤー名に設定
$backuplayer = targetcolormarker; //追加の条件を保存
settargetcolormarker $taegetlayer; //追加の条件で対象になるレイヤーを指定
}
replaceallfast "hidemaru" , "秀丸" , regular, incolormarker; //置換その1(incolormarker を指定すること)
replaceallfast "秀丸" , "HIDEMARU" , regular, incolormarker; //置換その2(incolormarker を指定すること)
if(targetcolormarker == $taegetlayer){ //対象レイヤーが指定したレイヤーの場合
deletecolormarkerall $taegetlayer; //レイヤーないのカラーマーカーを全部削除
settargetcolormarker $backuplayer; //設定を復元
}
moveto 0,#screentopy; //カーソル移動
enabledraw #screentopy; //画面描画有効
endmacro;
「selectinselect(範囲内検索を選択)」を使う(Ver.8.98以降の場合)
Ver.8.98から、「選択した範囲」で指定した領域を選択する命令「範囲内検索を選択(selectinselect)」が追加されています。それを使えば、置換 → 再度選択 → 置換 と繰り返す事が可能です。
setcompatiblemode 0x20000;
//範囲選択していた場合は、「inselect」が有効
replaceallfast "hidemaru" , "秀丸" ,inselect ,regular;// 1回目
//範囲選択していた範囲を再度選択状態へ
selectinselect;
//範囲選択状態なので、「inselect」が有効
replaceallfast "秀丸" , "HIDEMARU" ,inselect ,regular;// 2回目
endmacro;