Title: マクロ作成関連

top秀丸エディタマクロ

update : 2017/08/12 (Sat)

マクロの作成に関するメモです。

1 目次

1.1 複数のDLLを使う方法

秀丸エディタVer.8β8より、loaddll関数により、複数DLLのロードが可能になりました。 詳細はマクロヘルプ-DLL呼び出し機能にある、 「複数のDLLを扱う場合(V8.00以降)」を参照して下さい。

秀丸エディタではVer.3.02以降、外部DLLを使用できるようになりました。 一度に使用できるDLLは一つだけなので、複数のDLLを使用する場合、 使用するDLLが変わるたびにDLLの解放・DLLのロードを繰り返す必要があります。 複数DLLの処理が完全に別々になる(DLL1を使った処理が全て終了後、DLL2を使う処理を行う) なら順番にロードすれば特に問題はありませんが、 別DLLの関数を交互に使いたい場合は、DLLのロードと解放を頻繁に行わなくてはいけません。

目次へ

1.2 DLLの有効範囲

複数の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より抜粋) とのことです。

1.2.1 loaddll関数の場合

Ver.8から追加された、loaddll関数を使用した場合は、マクロ実行時のみ、ロードした秀丸エディタで有効です。

Ver.8.00で、loaddll関数でロード後、ウィンドウを切り替え、再びロードしたウィンドウに戻っても、 loaddll関数が無効になっています。 (dllfuncを使うと、「DLLがロードされてないのにdllfunc関数が使われました」とエラーになる。)

これは、Ver.8.01で修正予定です。Ver8.01β2で修正されています。

目次へ

1.3 2バイト文字の判定

マクロで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キーワードを使えば判定できます。

目次へ

1.4 関連づけ起動

編集中のファイルを関連づけされたプログラムで開く方法です。

run "rundll32.exe url.dll,FileProtocolHandler " + filename;

起動するプログラムによっては、ファイル名を「"」囲ったり、filename3を使った方が いい場合もあります。

編集中のスクリプトの実行とか、編集中のhtmlファイルをブラウザで開くとかに使えます。

秀丸エディタVer.6.50β11より、openbyshell文に引数が指定できるようになり、上記方法 を使用しなくても関連づけ起動が可能になりました。

目次へ

1.5 コンソールプログラムの実行

コンソールプログラムの中にはいまだに有用なプログラムが多数あります。

秀丸エディタからもコンソールプログラムが使えますが、実行中はコンソールが表示されてしまい 見栄えが悪いです。(">con"の場合は大丈夫ですが。) コンソールを表示しないようにするには">nul"を指定すればいいのですが、リダイレクト 出力を使用したい場合には使えない場合もあります。 その場合はバッチファイルを経由して実行します。

バッチファイルの中身 test.bat

ruby -Ks test.rb %1 > %2

マクロの例

run "test.bat " + filename + " outfile > nul"

バッチファイルはマクロに添付するか、マクロ実行中に作成し作業終了後に削除する方法 もあります。

目次へ

1.6 各種情報表示マクロ

マクロ作成時に使用しているマクロです。"内部的な値を表現するキーワード"を新規秀丸エディタに出力します。

情報表示出力サンプル

「ファイルタイプ別の設定」の詳細(config文で指定できる物)

ファイルタイプ別の設定出力サンプル

目次へ

1.7 ファイル保存時のフォルダ指定

「ファイルの保存」ダイアログで、保存位置を任意のフォルダにする方法です。

//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」を実行。

目次へ

1.8 ファイルを開くときのフォルダ指定

「ファイルを開く」ダイアログで、開く位置を任意のフォルダにする方法です。

制限はありますが、動作環境で指定することも可能です。 ([HMEXXXXA]●ファイルを開く場合、最初に開く場所を指定したいを参照)

1.8.1 方法 その1 openfile文を使う。

openfileは引数にファイルを指定できますが、ここでフォルダとワイルドカードを 指定すれば任意のフォルダを開くことが出来ます。

openfile "C:\\TEMP\\*.txt";

欠点としてはワイルドカードを一つしか設定できない点です。

1.8.2 方法 その2 OPEN文を使う。

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文と違い「動作環境」で設定した拡張子と現在編集中の拡張子をもつファイルが 表示されます。

秀丸エディタが「保存」するまでファイルの作成を行わない事を利用し、ステルス秀丸エディタで任意位置の ダミーファイルを指定してカレントフォルダを変更しています。

1.8.3 方法 その3 OPEN文を使う(COM版)

OPEN文はメニューやツールバーの「開く」を押した場合と同じです。 通常は編集中の文書のあるフォルダを開いてしまいますが、秀丸エディタ Ver.8から追加された、 COM操作機能をつかい、カレントフォルダを変更します。

//フォルダの設定
$opendir = "C:\\";
//シェルオブジェクトの作成
#n = createobject("WScript.Shell");
if(#n == 0){
    message "オブジェクトの作成に失敗しました。";
    endmacro;
}
//カレントフォルダの変更
setpropstr #n, "CurrentDirectory", $opendir;
if(!result){
    message "カレントディレクトリの変更に失敗しました。";
}
//ファイルを開く
OPEN;
endmacro;

目次へ

1.9 webブラウズモード関連

2009/09/23
hideHidemarnet Explorerの設定を変更

Hidemarnet Explorer関連。

1.9.1 ブラウザモードで開く

1.9.2 モード判定

ブラウザモードのファイルタイプは、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))

でもいいかも。

1.9.3 タイトルタグの内容

ブラウザモードだと先頭行が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)も簡単に 作成できる。

1.9.4 hideHidemarnet Explorerの設定

レジストリの設定内容関連です。

レジストリの設定内容

1.9.5 webブラウズモード・ソースの切り換え

openfile を使えば任意のモードで表示出来ますが、新しいウィンドウが開いてしまいます。 新しいウィンドウを開かずに現在のモードを切り換える方法を、セイジ氏が秀ネットのフォーラムに 投稿しています。

秀ネットの投稿 turukame.3:05920を参照して下さい。

1.9.6 リンク先の取得

<a>タグでリンクされているアドレスを、マクロで取得する方法です。 リンク部は秀丸エディタ側の設定によって、取得方法が異なります。 "リンク先を番号で表示して下のほうにまとめる"にチェックが入っている場合と、そうでない場合では 、リンク部の表示が異なる為です。

1.9.6.1 チェック有りの場合

リンク部の表示は<a>タグに囲まれた文字になり(通常のwebブラウザと同じ)、実際にリンクされている アドレスは、自動的に番号が振られ、最期に出力されます。

秀丸エディタには

<a href="http://hide.maruo.co.jp/">『 秀まるおのホームページへ 』</A>

というhtmlは、

[xx:『 秀まるおのホームページへ 』.] 

と表示され、ページの最期に、

xx:http://hide.maruo.co.jp/

と、他のリンク一緒に、まとめて表示されます。

"["、"xx:"、".]"は自動的に追加されます。 "xx"が自動的に振られる番号で、この番号を元にリンク先を探します。

カーソルの位置がリンク部分かどうかは、colorcodeで判断します。"0x0C15"ならばリンクされている部分です。 リンク部の先頭は、必ず"[xx:"となっているため、これを検索し、"xx:"の部分を取得します。

searchup "(?<=\\[)[0-9]+?:", regular;

"xx:"を使って検索すれば、リンク部分のアドレスが取得できます。

絶対パス(http://〜)でない場合は、相対パスなので、fienameと組み合わせて絶対パスにします。

1.9.6.2 チェックなしの場合

リンク部の表示は<a>タグで指定された文字になり、実際にリンクされます。

秀丸エディタには

<a href="http://hide.maruo.co.jp/">『 秀まるおのホームページへ 』</A>

というhtmlは、

[a:http://hide.maruo.co.jp/]『 秀まるおのホームページへ 』

と表示されます。

カーソルの位置がリンク部分かどうかは、colorcodeで判断します。"0x0C15"ならばリンクされている部分です。 リンク部の先頭は、必ず"[a:"となっているため、これを利用し、正規表現(前方一致指定)を使って、 URL部分のみ取得します。

searchup "(?<=\\[a:)[^\\]]+",regular;

絶対パス(http://〜)でない場合は、相対パスなので、filenameと組み合わせて絶対パスにします。

1.9.7 web整形モジュールのメモ

VisualBasic6.0向け

目次へ

1.10 webブラウザ関連

2016/09/19 Firefoxメモ を更新(e10s と DDE通信)

webブラウザのメモ。 識別に必要なウィンドウクラス名とDDEサービス名などいろいろ。

Mozilla、Netscape7(6)、Firefoxはウィンドウクラス名では識別不能。 実際に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 Firefox Ver.4.0pre〜 e10sが有効だと、DDE通信に失敗する。(2016/09/19)
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 との識別はできない。ウィンドウのキャプションを取得すれば可能?

ブラウザの資料?(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使用時は動作しない。

ブラウザと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;

目次へ

1.11 キー操作の記録

マクロ作成時、秀丸エディタの機能でどのコマンドを使っていいのかわからない場合は「キー操作の記録」 を使います。 キー操作の記録を開始し、使いたい機能を実行して記録を停止。「キー操作の保存」でファイル に保存できるので、適当な名前をつけて保存し秀丸エディタで開けばコマンドがわかります。

[注意]

目次へ

1.12 カーソル移動コマンドの注意点

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等)

目次へ

1.13 ループ中の負荷低減

田楽シリーズのVer.2.70 から、SLEEP関数が追加されています。

秀丸エディタVer.8.00 から、sleep文が追加されています。

マクロでループ処理を行うとCPUを使い切ってしまいます。 NT系OSだとまだいいのですが、Windows9x系だと固まったように見えたりします。 そこでWSHを使ったCPU負荷の低減の方法です。(WSHを使うのでWindows98以降が必要。)

以下の内容を"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通信は秀丸エディタを切り換えると自動的に終了するので、秀丸エディタを切り換える ようなマクロでは、たぶん使用できません。

目次へ

1.14 ウィンドウ一覧のタブのon/off

秀丸エディタ Ver5.00β27より"settabmode"コマンドが追加された為、レジストリ操作は必要なし。

目次へ

1.15 任意部分のレジストリデータ列挙

reg.exeを使う方法を追加

マクロでレジストリの読み込みは出来ますが場所がわかっていないと駄目です。 つまり、任意部分の値を列挙することは出来ません。

そこで OS に付属されている regedit.exe を使ったレジストリ値の列挙方法を紹介します。 方法はいたって単純で、レジストリデータのエクスポート機能を使うだけです。

注意 Windows Vista以降、UAC(ユーザー・アカウント制御)が有効な場合、権限の昇格が必要な為、 マクロからレジストリエディタを起動しようとしても、失敗します。

レジストリエディタのエクスポート方法
regedit /e /a 出力ファイル名 レジストリの場所
/e エクスポート処理
/a ASCIIコードで出力(NT系は デフォルトでユニコード)

これで指定したファイルにレジストリデータがテキスト形式で出力されるので、これを解析します。 (grepを使うのがいいでしょう。)

注意事項としては指定されたレジストリデータ全てを出力するので、指定した場所によっては、 ファイルが巨大になる可能性があります。

1.15.1 WMIを使う方法

Windows Vista以降、UAC(ユーザー・アカウント制御)が有効な場合、権限の昇格が必要な為、 マクロからレジストリエディタを起動しようとしても、失敗します。 そのため、WMI(Windows Management Instrumentation)を使用し、レジストリデータを取得します。

参考にしたwebサイト

MicrosoftのWMIスクリプト入門

秀丸エディタ Ver.8から、COMを使えますが、結果を格納するのに文字列型の配列が必要になるため、 残念ながら、秀丸マクロから直接データを取得できません。

WMIを利用したマクロの例(マクロに付属している、VBSがWMIを操作している。)

上記マクロは、秀丸マクロ → WSH(VBS)→ WMI とVBS経由し、レジストリにアクセスしています。 マクロから実行した VBSで、列挙したレジストリデータを、iniファイル形式のファイルへ保存。 秀丸エディタマクロ側からは、iniファイル経由で、レジストリ情報を取得しています。

1.15.2 reg.exeを使う方法

Wimdows Vista以降に付属されている reg.exe のエクスポート機能を使ったレジストリ値の列挙方法です。 (reg.exe なら、レジストリエディタと異なり、権限の昇格が不要なので、マクロから実行しても、失敗しない。)

reg.exe のエクスポート方法
reg.exe export レジストリの場所 出力ファイル名 /y
/y 確認なしで、出力フィルを上書きする。
詳細は、コマンドプロンプトから「reg.exe export /?」と入力し表示されるヘルプを参照してください。

出力されるファイルの形式は、レジストリエディタ と同じ(Unicodeで出力される)なので、同じ方法で解析可能です。

目次へ

1.16 マクロから呼び出すWSH

2009/11/03
Ver.8より、追加されたコマンドに注記を追加。

マクロから呼び出すと、役に立つかもしれないScript各種? WSHは全部VBScriptです。

1.16.1 待機コマンド Sleep_sec.vbs

Ver.8 sleep文が追加されています。

指定された秒数待機します。引数に秒数を指定して下さい。 マクロからrunsync/runsync2で呼び出すこと。

sleep_sec.vbs

//10秒待機する
runsync2 "wscript.exe " + currentmacrodirectory + "\\sleep_sec.vbs 10";

1.16.2 削除コマンド del_files.vbs

Ver.8  deletefile文が追加されています。ゴミ箱に送ることも可能。フォルダも削除可能。

指定されたフォルダ、ファイルを削除します。(ゴミ箱には入らずに直接削除)

del_files.vbs

1.16.3 ショートカット作成マクロ Tk_MakeShortCut.vbs

指定されたフォルダ、ファイルのショートカットを作成します。

Wscript.exe Tk_MakeShortCut.vbs "対象ファイル/フォルダ" "ショートカットのフルパス"

Tk_MakeShortCut.vbs

1.16.4 自動的に閉じるダイアログpopup.vbs

田楽シリーズのVer.2.80 から、同等の機能をもつMSGBOX関数が追加されています。

指定された時間に自動的に閉じるダイアログ。サンプルマクロ付き。

popup.vbs

WSHとマクロのインターフェース

秀丸エディタマクロからWSH

コマンドラインオプション

Wscript.exe popup.vbs "表示する内容" 待機時間 "タイトル" アイコンとボタン設定
WSHから秀丸エディタマクロ

iniファイル。popup.vbsと同じ場所にpopup.iniを作成しそこに出力する。

[result]
value=押されたボタンを示す数字
err_num=エラー番号
err_msg=エラーメッセージ

1.16.5 ファイル操作スクリプト

移動、コピー、削除、リネームを行うWSH(VBS)です。 コマンドプロンプトを使えばできますが、WSHを使えば、コマンドプロンプトを表示させることなく、 実行できます。

fileutil.vbs

Wscript.exe fileutil.vbs cmd file1 file2
cmd
cmdには以下の文字を指定できます
  • move(移動)
  • copy(コピー)
  • delete(削除)
  • rename(リネーム)
file1
対象ファイル
file2
移動、コピー時の対象フォルダ。リネーム時は変更する名前を指定。 リネーム時はフルパスを指定できません。指定するとエラーになります。

空白を含むパスを指定する場合は"(ダブルコーテーション)で囲ってください。

1.16.6 IEの呼び出し

Internet Explorer7または8を呼び出すWSH(VBS)です。 複数のURLを指定した場合、タブで開きます。 引数には、インターネットショートカットも指定可能です。 (CallIE.vbsにドロップすれば、そのURLを開きます。複数でも問題ないハズ。)

CallIE.vbs

Wscript.exe CallIE.vbs URL1 URL2 …

目次へ

1.17 ダイアログを表示してファイル名を取得する

2007/03/12
マクロの説明を追加

関連項目

マクロでファイル選択ダイアログを使ってファイル名を取得する方法です。 田楽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;

目次へ

1.18 秀丸エディタのレジストリデータ

2017/01/07 「開く」のダイアログボックスを修正

1.18.1 動作環境

"HKEY_CURRENT_USER\Software\Hidemaruo\Hidemaru\Env"の設定です。 個人で調査した結果なので、間違っている可能性もあるので、注意して下さい。

1.18.1.1 バックアップを作成する場合の保存先を指定する
有効無効の切り換え
"IntensiveBackup"の値 0で無効、1で有効
保存先
"BackupPath"で指定する。
1.18.1.2 保存するかどうかの確認

"DeleteAtNull"の値

A:保存するファイルが空だったときは確認する
B:無題で更新されていて、内容が空のとき、保存するかどうか確認する
C:"DeleteAtNull"の値
 B│ A│ C
─┼─┼─
 0│ 1│ 3
 0│ 0│ 2
 1│ 1│ 1
 1│ 0│ 0
1:チェックあり
0:チェックなし
1.18.1.3 同じファイルを開く場合の処理

"DupOpen"の値

0:問い合わせる
1:上書き禁止
2:じファイルを2つ開くことを禁止する。
3:ファイルを読み直しする

秀丸エディタVer.6.0より追加された"setcompatiblemode文"を使用すれば、 レジストリの書き換えを行わずに、一時的に変更が可能です。

1.18.1.4 「開く」のダイアログボックス

"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 チェックあり

1.18.2 ウィンドウ

1.18.2.1 ステータスバー

"StatusBar"の値 0で表示しない、1で表示する。

1.18.2.2 ステータスバー ファンクションキーと合体

"DockingStatusBar"の値 0で合体しない、1で合体する。

1.18.2.3 ステータスバーに表示する内容

"StatusBarInfo"の値 誰か解析してください・・・。

1.18.2.4 タブモードの詳細

"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:[デザイン]「タブバーの位置」が非表示
全部解析してません・・・。
1.18.2.5 検索関連
検索での表示
範囲選択
"SelectFound"の値 0で点滅表示、1で範囲選択

秀丸エディタVer.6.0より追加された"setcompatiblemode文"を使用すれば、 レジストリの書き換えを行わずに、一時的に変更が可能です。

ツールバーの検索ボックス

0でチェックなし、1でチェック有り

リアルタイム検索
"SearchDetail"の2ビット目
起動直後は空欄
"SearchDetail"の3ビット目
置換の動作
全置換は常に高速で行う
"SearchDetail"の1ビット目 0でチェックなし、1でチェック有り
1.18.2.6 ダイアログボックス
grepのダイログボックス

GrepDlgの値

0:普通タイプ
1:新タイプその2(フォルダ選択は旧式のまま)
2:新タイプ(フォルダ選択がエクスプローラ風)

1.18.3 自動起動マクロ関連(レジストリ)

1.18.3.1 自動起動マクロ(Ver.6.00)
自動起動マクロを有効にする
"EventMacroFlag" 0:無効  1:有効
ファイルを開いた直後
"EventMacroOpened" 実行するマクロのファイル名
1.18.3.2 自動起動マクロ(Ver.7.00、Ver.8.00)
自動起動マクロの設定

"EventMacroFlag"の値 以下の値をORした値となる。 0x0004だけ意味が反転しているので注意。
Ver.7

0x0001 自動起動マクロを使用
0x0002 キャッシュ使用
0x0004 開いた直後を使用しない
0x0008 新規作成直後を使用
0x0010 保存直前と直後を使用
0x0020 印刷直前と直後を使用
0x0040 編集後タイマーを使用
0x0080 カーソル移動後タイマーを使用
0x0100 ファイルを閉じる直前

Ver.8で追加

0x0200 アクティ切り替え後
ファイルを開いた直後
"EventMacroOpened" 実行するマクロのファイル名
新規作成直後
"EventMacroNewfile" 実行するマクロのファイル名
印刷直前と直後
"EventMacroPrint" 実行するマクロのファイル名
保存直前と直後
"EventMacroSave" 実行するマクロのファイル名
編集後タイマー
"EventMacroUpdate" 実行するマクロのファイル名とタイマー設定値 ex)"macroname",100
カーソル移動後タイマー
"EventMacroCursor" 実行するマクロのファイル名とタイマー設定値 ex)"macroname",100
ファイルを閉じる直前
"EventMacroClose" 実行するマクロのファイル名
アクティ切り替え後(Ver.8で追加)
"EventMacroActive"  実行するマクロのファイル名とタイマー設定値 ex)"macroname",100

1.18.4 アウトライン解析の枠

"HKEY_CURRENT_USER\Software\Hidemaruo\Hidemaru\Outline"にあるアウトライン解析の枠に関する設定

「アウトライン解析の枠」の表示設定をレジストリ操作で変更する場合、

  1. 「アウトライン解析の枠」を非表示
  2. レジストリ操作
  3. 「アウトライン解析の枠」を再表示

という操作を行わないと、「その他」->「ファイルタイプ別の設定」で「アウトライン解析の枠」 を開いた場合に、画面表示がおかしくなる場合があります。

1.18.4.1 位置

Rightの値

0x0:左
0x1:右
0x2:上
0x3:下
0x1:浮かせる(Detailの値が0x1になる)
1.18.4.2 その他の設定

Detailの値 以下の値のOR

0x1:浮かせる(Rightの値が0x1になる)
0x2:枠の表示でウィンドウサイズを広げる
0x4:一覧の選択時にカーソルを上のほうに移動する
0x8:ドラッグ&ドロップ編集を可能にする

1.18.5 秀丸エディタのインストールフォルダ

秀丸エディタのレジストリ内には記録されていません。 Windowsのアンインストール情報から取得するのがいいとのこと。 (hidesoft.2:15202より)

"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Hidemaru"にある、以下の値から取得する。

64bit OSを使用していて、32bit秀丸エディタをインストールした場合には、レジストリのアクセスがリダイレクトされるので、 場所が異なります。

64bit OSを使用している場合には、

  1. 通常のレジストリ
  2. リダイレクトされたレジストリ

の順番に調べるのがいいでしょう。

64bit OS使用時の レジストリリダイレクトに関する情報

1.18.6 レジストリデータへのアクセス

秀丸エディタの設定をレジストリからアクセスするには、

  1. openreg、またはcreateregで開く(失敗したら閉じる)
  2. getregstr/getregnumで読み込む または、 writeregstr/writeregnumで書き込む
  3. closeregで閉じる

と、3つの行程が必要です。 ですが、iniファイルのアクセス関数を使うと1文ですみます。 iniファイル名を"hidemaru.ini"にすると、自動的にレジストリへのアクセスになります。 これは16bit版時代のマクロにも対応するための処置ですので、非推奨の方法になります。

1.18.7 64bit固有のレジストリデータ

1.18.7.1 正規表現DLLの設定

64bitでは、「JreDll」ではなく、「JreDll64」に記録される。

1.18.7.2 32bit版への互換性

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:チェックなし

目次へ

1.19 openfileについて

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 を参照)

目次へ

1.20 URLエンコードとrun

秀丸エディタから、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文に、引数が渡せるようになったので、 こちらを使った方がいいかもしれません。

目次へ

1.21 「検索での表示」の違いを吸収する

秀丸エディタの「動作環境」->「検索」->「検索での表示」には「点滅表示」と「範囲選択」の 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文」を使えば、 レジストリ操作なしで、マクロ実行時のみ設定を変更することが可能です。

目次へ

1.22 「検索文字列の強調」関連

秀丸エディタ 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;

目次へ

1.23 ウィンドウの分割について

秀丸エディタ Ver.8.54β4 からマクロを使用する事で、分割位置を指定して分割できるようになりました。

split #splitmode, 1, 分割位置

(詳細は、マクロヘルプのsplit文 を参照のこと。)

また、秀丸エディタ Ver.8.54β6から、splitposキーワードが追加になり、分割位置を取得可能になりました。

マクロを使用する必要はありますが、分割位置を指定して分割する事も、分割位置をキーボードで変更する事も可能になっています。 分割位置を変更するには、分割を解除する必要は無く、そのまま split文 で分割位置を指定して分割すれば可能です。

1.23.1 ウィンドウ分割時のマクロ注意点

1.23.2 ウィンドウの分割について-Ver.8.54未満の場合

基本的に「ウィンドウの分割」はウィンドウを半分の位置でしか分割できませんが、 任意位置、比率で分割する方法です。(例として1:2の比率で分割。)

  1. 現在のウィンドウ高さを保存
  2. ウィンドウの高さを元の大きさの2/3へ変更
  3. ウィンドウ分割
  4. ウィンドウの高さを元に戻す。

半分でしか分割できないので、あらかじめウィンドウの高さを変えてから分割するということです。

//現在の高さ保存
#baseHight = windowheight;
setwindowsize windowwidth,(windowheight/(1 + 2)) * (1 + 1);
split;
setwindowsize windowwidth,#baseHight;

また、上記マクロを画面上部で実行した場合では「上段2:下段1」、画面下部で実行した場合では 「上段1:下段2」となり、比率は同じものの、実行時のカーソル位置により異なる結果になります。 これは画面高さを元に戻す際、アクティブ(カーソルがある)側の大きさを変更しているためです。

つまり、

ということを利用するとキーボードで分割位置を変更する事も可能になります。 しかし、実際にやるとウィンドウのリサイズが多発するので、かなり画面がちらつくと思いますが・・・。

「ウィンドウの分割」時の「windowheight」キーワードはカーソルのあるウィンドウの高さを返します。 全体の高さではありませんので注意が必要です。

目次へ

1.24 割り当て可能なキーの一覧

割り当て可能なキーの一覧です。秀丸エディタ Ver.5からキーカスタマイズが大幅に強化され、いままで割り当てが できなかったキーが使用できるようになりました。

「キー割り当て拡張」関連のマクロ開発で必要になったので作ってみました。

目次へ

1.25 hmjre.dllのバージョン情報取得

hmjre.dllのバージョン情報を秀丸エディタと同じ形式で取得する方法です。

10進数の範囲内でバージョン表記されている限りは大丈夫・・・。 16進数になった場合はヘルプの方法を使いましょう。

目次へ

1.26 タブ関連メモ

2010/04/14
最小化した状態からタブを分離した場合を追加

"ウィンドウのタブモード"関連のメモ

<注意> 秀丸エディタ Ver.5.00β31から各種タブ関連のマクロが追加されたため、 各種キーワードを取得すればできるものもあります。

1.26.1 タブグループ関連

1.26.1.1 タブグループの数

tabgrouptotalキーワードで取得可能 以下の方法を使わなくてもいい。


基本的にはhidemarucountを使ってループをまわし、各秀丸エディタからtabgroupを取得するしかない。

タブグループは連続しているとは限らないので、存在するグループ番号を取得するには、総当たり するしかない。

外部DLLを使う場合、表示されているトップレベルウィンドウで、"Hidemaru32Class"というクラス名を 持つウインドウの数がタブグループ数となる。 (タブになっている場合、アクティブウィンドウ以外は非表示となる) タブグループの数はわかるが、グループ番号は取得できないので、ウィンドウハンドルから取得する 必要がある。

ちなみに、表示されているウィンドウ=タブグループにおけるアクティブなタブ になります。

つまり、秀丸エディタのウィンドウ番号を使ってループをまわせば以下の情報がわかる。

  • 表示されているウィンドウの数=タブグループの数
  • 表示されているウィンドウ=各タブグループのアクティブなタブ

まぁ、DLL使わなくても色々できるか?

1.26.1.2 新規に分離したタブのグループ番号取得

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;
}
1.26.1.3 タブのグループID取得

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;
    }

1.26.2 同じグループのタブの数

"tabtotal"で同じグループのタブの総数がわかる。他のタブグループの総数を知りたい場合は、 角カッコで添え字を付ける事で取得可能。

例)tabtotal[#cnt]

tabtotalの添え字に指定できるのは、ウィンドウハンドルか"tabgrouporder"(グループの順番)。 グループIDは使えないので注意すること。

1.26.3 "このタブを最小化"している場合

タブモード時、"このタブを最小化"・非表示しているファイルは、グループIDとタブオーダーが共に"-1"となる。 ウィンドウ毎最小化している場合は通常に取得可能。

1.26.4 グループ数、グループ内のタブ数取得時の注意

tabgrouptotalでグループ数、tabtotalでグループ内のタブ数が取得できますが、表示されている 秀丸エディタのみ対象としていると考えた方がいいです。 非表示および"このタブを最小化"している秀丸は数に含まれません。 ファイルが1つしかないグループで、非表示や、"このタブを最小化"した場合、tabgrouptotalでは カウントされません。

タブグループが2つで、1つのグループがA、B、Cと3つのファイルを開いている場合

A、B、Cと3つのファイルを開いている状態
tabgrouptotalは"2"、A、B、Cと3つのファイルがあるタブのtabtotalは"3"
A、B、Cと3つのファイルのうち、Cを"このタブを最小化"した状態
tabgrouptotalは"2"、A、B、Cと3つのファイルがあるタブのtabtotalは"2"
AとBを閉じた状態
tabgrouptotalは"1"、Cから取得できるtabtotalは"-1"
Cの最小化を解除
tabgrouptotalは"2"、Cから取得できるtabtotalは"1"

つまり、非表示、"このタブを最小化"した秀丸エディタがある場合、tabgrouptotaltabtotalでは 正確な値が取得でません。 確実に取得するには、非表示、"このタブを最小化"を解除する必要があります。

ちなみに、最小化、非表示化したウインドウの所属しているグループを取得する方法はなく、 表示状態を元に戻す必要があります。

1.26.5 タブモード時のwindowstate

タブモード時は、タブに表示されているファイル以外は、非表示状態(windowstate = 0)となっている。 本当に非表示状態なのか、タブで選択されていないかを判別するには、グループIDとタブオーダーの値を 確認する。

非表示及び、"このタブを最小化"している場合は、グループIDとタブオーダーは"-1"を返し、 選択されていない場合、グループIDとタブオーダーは"0以上"を返す為、判別が可能。

グループIDとタブオーダーが"-1"を返すと、タブが分離しているように見えるが、実際は分離している わけではない。

1.26.6 最小化した状態からタブを分離した場合

showwindow 2;
settabgroup hidemaruhandle(0), -1;
endmacro;

最小化した状態から分離したタブは、ウィンドウサイズが、通常サイズではなく、小さくなった状態で分離される。 分離する場合には、通常ウィンドウに戻してから、分離すること。

最小化から分離した状態

目次へ

1.27 日本語を含むファイル名の分解時の注意

日本語を含むフルパスから、ファイル名とフォルダ名に分割する場合の注意点。

各フォルダの区切りは"\"です。 その為、ファイル名とフォルダを分割する場合、最期の"\"を探す必要があります。

//フォルダ名を切り出す為、ファイル名の最期から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の使い方」を参照してください。

目次へ

1.28 grepdialog、grepdialog2文について

秀丸エディタ Ver6.00β11より、grepdialog、grepdialog2で表示されるダイアログからキャンセルした場合、result が -2 になります。 その為、以下の方法による「キャンセル」の判定は不要です。

1.28.1 grepdialog

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"が 区別できません。

1.28.2 grepdialog2

秀丸エディタ 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"の場合の処理
}

目次へ

1.29 versionキーワードを使う場合の注意

マクロを異なるバージョンの秀丸を動くようにするには、以下のように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";
}

目次へ

1.30 チェックリストダイアログのベース

大本はIKKIさんが作成した「閉じるダイログ」です。 「ファイルヒストリダイアログ」は、このベースから作成。

実行には田楽DLLが必要です。(要Ver.2.83) 拡張ソート機能を使うには、変換モジュールライブラリ のソートが必要です。 Version 1.4.0 以降は秀丸エディタVer.8に対応したため、追加の変換モジュールは不要です。

2006/01/08 Version 1.0.0
  • 初版
2006/01/15 Version 1.1.0
  • ソート機能を追加
2006/01/19 Version 1.2.0
  • 田楽でもソートon/offができるようにした。
2006/01/19 Version 1.2.0
  • 田楽でもソートon/offができるようにした。
2006/05/05 Version 1.2.1
  • バグ修正
    • ソートモード0(ソートしない)が設定できなかった
    • 全選択が機能していなかった
2006/08/21 Version 1.3.0
  • 初期表示でチェックの有無を指定出来るようにした。
2012/12/22 Version 1.4.0
  • 秀丸エディタ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[]にも、結果を戻す様にした。
2012/12/24 Version 1.4.1
  • ソートなしが、設定できなくなっていたバグの修正。
  • 選択した項目がない場合、#ld_CheckList[]をクリアしていなかったのを修正。
  • キャンセルした場合、戻り値と#ld_SelectCountを-1に設定するようにした。
2012/12/27 Version 1.5.0
  • 削除機能を追加。(メインルーチンの第4引数で設定)
  • "SETCTRLITEM"の使い方を間違っていたので修正。(第3引数が数値になっていた。)
2012/12/28
  • リストのダブルクリックイベントを有効にできるようにした。(メインルーチンの第5引数で設定)

    "ld_ListDoubleClickExt"というサブルーチンを呼ぶので、有効にした場合は作成すること。
    引数 第一引数:項目番号(文字)  第二引数:項目内容(文字)

このマクロを使用し、

を追加すればダイアログを表示するマクロができます。

// リスト表示ダイアログメインルーチン実行に必要なグローバル変数
// $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[]の配列に格納)
ダイアログの表示例
チェックリストダイアログの例

目次へ

1.31 マクロから変換モジュールを呼び出す方法

2010/02/15 ソートのパラメータを修正

マクロから変換モジュールを呼びだす方法です。各種変換機能を呼びだすには、filter文を使います。 文字変数に対して処理を行う場合は、filter関数を使います。

//変換モジュールを呼びだすマクロの例
filter "Sort.hmf" , "Sort" , "0111";
Sort.hmf:呼び出す変換モジュールの名称(標準の場合は""とする。)
Sort    :使用する機能名
0111    :変換モジュールに渡すパラメータ

変換モジュールに解説がある場合は、解説に従います。 解説がない場合は、"マクロの記録"を使って記録するのが、手っ取り早いです。 詳細は、秀丸エディタのヘルプ「目次− 動作環境− 編集−変換」にある、 「参考:変換モジュールをキー割り当てする方法」を参照してください。

秀丸エディタ本体で、変換モジュールを使う方法は、 "変換モジュールを使うには" を参照してください。

1.31.1 ソートのパラメータ

関連項目

ソートのパラメータ一覧です。

ソートのオプション指定 ビット割り付け
filter "" , "Sort" ," 1 0 0 1 0 0 1 1 0 0 0 2 0 0 1 \" 1 0 "
オプション指定 a b c d e f g h i j k l m n o p q r

  オプション指定 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 設定の記録 記録しない 記録する
o クォート判定 あり なし
p クォート文字 クォート文字
q TSV/CSV設定 無効 有効
r マイナス("-")と小数点(".")も計算(M) 無効 有効

1.31.2 filter関数を使ったソート

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の関数を使えば、簡単にできるかもしれません。

目次へ

1.32 タブに名前をつける

タブに任意の名前をつける方法です。

1.32.1 方法1(秀丸エディタVer.5の場合)

「ファイル名変更」を使えば、任意の名前をタブに表示できます。 (タイトルバーはフルパスになりますが) 「ファイル名変更」を実行した時点で、更新扱いになるので、閉じるときは、保存するかどうか問い合わせがでます。

ちなみに名前を変えているだけなので、保存するまでファイルは作成されません。

1.32.2 方法2(秀丸エディタVer.6の場合)

秀丸エディタVer.6β38より、title文が拡張され、タブにも任意の文字列を設定できます。

目次へ

1.33 マクロメモ

単なるメモ。

2014/09/07 マクロ引数関連を追加

1.33.1 「現在の内容」でgrep

裏技的内容:setgrepfileで"\x01"を指定。 (turukame.3:09093より)

1.33.2 rangeedittopとrangeeditend

rangeedittopとrangeeditendは、部分編集を行っていない場合は"-1"となる。

1.33.3 ステルスモード

現状、マクロ実行終了時に、ステルスモードが強制解除されます。 これは、マクロを実行した秀丸エディタだけでなく、他の秀丸エディタにも影響を及ぼします。

ステルス秀丸がいる場合に、他の秀丸でマクロを実行すると、ステルスが強制解除されます。

1.33.4 マクロの実行環境を判断する その1

マクロが、秀丸エディタ上で実行しているか、秀丸メール上で実行しているかを、判定する法法について。

秀丸メール Ver.5.60以降から、platformキーワードによる識別が可能になりました。 以下、秀丸エディタVer.8.03β6のマクロヘルプより、抜粋。

0x00800000 秀丸メール上で動作しているかどうか(秀丸メールV5.60以降)
1.33.4.1 DLLを使用する方法
  • 秀丸エディタ、秀丸メール共に、"tkinfo.dll"の"IsHidemaruMail"関数で判断します。

秀丸エディタの場合、"tkinfo.dll"のロード成功・失敗で、判断可能(成功:秀丸メール 失敗:秀丸エディタ) ですが、カレントフォルダが"tkinfo.dll"と同じ場所だった場合、 ロードに成功してしまう為、 "IsHidemaruMail"関数を使わないと誤判定してしまいます。

つまり、

  1. "tkinfo.dll"のロード成功・失敗で判断
  2. 成功した場合、"IsHidemaruMail"で確認

という方法が確実です。

1.33.4.2 ウィンドウのクラス名、ハンドルを使用する方法
秀丸メールのメインウィンドウのクラス名
TuruKameFrame
秀丸メールのメールエディタのクラス名
TuruKameOuterView

findwindowclassで上記クラス名からウィンドウハンドルを取得し、実行中のウィンドウハンドルと比較すればいい。 (ハンドルからウィンドウクラス名を取得するのが確実だが、秀丸マクロ単体では無理) ただし、秀丸メールの検索結果ウィンドウ上での実行は判定が出来ない。

1.33.5 マクロの実行環境を判断する その2

マクロが、秀丸エディタの日本語版で実行しているか、英語版で実行しているかを、判定する法法について。

秀丸エディタVer.8βより、platformキーワードが追加され、OSなど、実行環境の情報取得が、 可能になりました。 β7より、英語版、浮動小数点数版かどうかを示すビットも、追加されています。

秀丸エディタには、英語版も存在しますが、日本語版とはレジストリの位置が違います。 その為、マクロ内でレジストリを操作する場合、問題となります。

日本語版と英語版を区別するには、タイトルバーの文字列を使用します。 タイトルバーの内容が、"- 秀丸"で終わっていれば日本語版と判断できます。 タイトルバーの取得には gettitle関数を使います。 注意点としては、title文で内容を変更している場合もあるので、 変更を解除してから、タイトルバーの内容を取得することです。

1.33.6 setcompatiblemode

秀丸エディタ Ver 6.00から追加された命令。「折りたたみ」や「部分編集」がある場合に、マクロの互換性を 保つために追加されたが、「秀丸エディタで同じファイルを開く場合」や「検索での表示」の設定を、 マクロ実行時にレジストリを書き換えないで、一時的に変更することが可能。

setactivehidemaruで秀丸エディタを切り換えても、setcompatiblemodeで設定した内容は有効。 execmacroで他のマクロを起動した場合、setcompatiblemodeで設定した内容は無効

1.33.7 setwindowposの引数の順番

setwindowpos #posx, #posy, #width, #height;

1.33.8 新規ファイルからのopenfile文

新規ファイルで、編集していない場合、openfile文を使うと、新しい秀丸を起動しないで、 新規ファイル上に読み込む。(loadfileと同じになる。) ただし、起動オプション付きで、openfileした場合は、新しいウィンドウが開く。

1.33.9 起動オプションでの座標、サイズ指定

起動オプションで"/(posx,posy,width,height)"を指定できるが、引数に不正な値がある場合、 指定自体無効になります。(不正な値のみ、無視するのではなく、指定自体が無効になる。)

1.33.10 enabledrawの引数

enabledrawには、引数が指定できます。 引数は、enabledrawで再描画を許可し、表示する際の画面の先頭行を指定します。 ただし、カーソル位置が、エディタ画面表示範囲内にある必要があります。

例)画面サイズが80桁×40行の場合で、カーソル位置が50行にある場合。
 NG:enabledraw 80; 表示範囲が80行〜140行なので、カーソル位置が画面表示範囲外
 OK:enabledraw 40; 表示範囲が40行〜80行なので、カーソル位置が画面表示範囲内 
 NG:enabledraw 0;  表示範囲が先頭〜40行なので、カーソル位置が画面表示範囲外

1.33.11 rollup2

画面のカーソル位置を固定し、画面をスクロールアップする命令ですが、 画面の半分より上にはスクロールしない。

1.33.12 他のウィンドウの操作

対象のウィンドウハンドルを取得し、システムメニューを操作する。

最小化

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.33.13 「検索での表示」の違いと、カーソルの移動

サンプルテキスト

//          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文字文カーソルを移動させているが、 範囲選択の場合と、点滅表示の場合では、カーソルの移動結果が異なる。

範囲選択の場合、最初の右移動で、範囲選択の最後へカーソルが移動している。

1.33.14 サブルーチンコールの引数とgetconfig

//サンプルマクロ
//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");

1.33.15 「設定ファイル用のフォルダ」を取得する

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;

1.33.16 explorerの起動オプション

explorer.exeの起動オプションに関する資料

各起動オプション間は","(カンマ)で区切ること。" "(スペース)で区切ると、うまくいかない場合がある。

1.33.17 箱形選択時のコピーかどうかの判定

Ver.8から、getclipboardinfo 関数が追加され、箱形選択かどうかが、判定できます。

現在、クリップボード内のデータが、箱形選択時にコピーされたかどうかの判定方法は、以下の内容を参照

DLLを使用できるなら、GetClipboardData( CF_DSPTEXT )の中身が"BOX"という文字列であるかどうかで、 判断する事が可能。

1.33.18 input関数でキャンセルを判定する

input関数で、キャンセルしたかどうかを判断するには、resultの値を確認します。 キャンセル時は、関数の戻り値が""になるので、そこでも判断が可能ですが、resultを確認するほうが、確実です。

$in = input("実験","");
#ret = result;
if(#ret == 0){
    message "キャンセルされました。";
    endmacro;
}
if($in == ""){
    message "キャンセルされましたが、\"\"を入力したかもしれません。";
}

1.33.19 setactivehidemaruについて

setactivehidemaruでアクティブにした場合、最小化している場合は、最小化が解除される。 しかし、タブモードの場合、解除されない場合があるので注意。(Ver.8では修正される予定?)

1.33.20 ウィンドウの表示状態

非タブモードの場合です。(かなり特殊な状況)

最小化(showwindow 2)や最大化(showwindow 3)したまま、非表示(showwindow 0)にした場合、 windowstateは、0となる。 その為、非表示のウィンドウが、実際はどんな状態になっているかは不明です。

マクロで判定するには、非表示状態から、

という方法で可能です。

どうしても判定する必要がある場合は、"macrodll.dll"の"WINDOW_ISICONIC"か、"WINDOW_ISZOOMED"を、 使うのがいいでしょう。

1.33.21 静的変数について

秀丸エディタVer.8より、マクロが終了しても値を保持する、静的な変数が導入されています。

静的変数は、他の秀丸エディタ上からも参照可能な「共有」に設定できます。

1.33.22 setfocusとmessage文

setfocus文で、編集エリア以外にフォーカスを移しても、message文を実行すると、 編集エリアにフォーカスが移動します。 (turukame.3:04282)

通常はあまりないかもしれませんが、マクロデバッグ時などには注意すること。

1.33.23 hidemaruorderの引数

無効なハンドルを指定すると、-1が返る。

変数等に保存しておいたハンドルが、有効かどうかの確認に使える? filename[#n]でも、確認できそうだが、無題ファイルの場合は無理。 (filetype[#n]ならOK?)

1.33.24 ウィンドウ分割時のキーワード

1.33.25 lineupdatedについて

既存のファイル(保存済み)を編集している場合は、取得可能だが、新規ファイルの場合は、取得不可。 全ての状況で、編集の有無を確認出来る訳ではないので、注意する。

//確認用マクロ
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"の使い方にもよるが、新規ファイルかどうか確認が必要になる場合もある。

1.33.26 マクロ引数関連

マクロ引数を使う場合の注意点。(ヘルプにも注意点がありますが、実際にどうなるか実験的な内容です。)

例は、test.mac を 引数なしで実行した場合で、

test.mac  は、test1.mac を引数付きで起動。
test1.mac は、test2.mac を引数付きで起動。
test2.mac は、test.mac  を引数付きで開く。

という動作を行います。

問題になるのは、execmacro/openfile文 より後で、以下のような状態になります。

この動作から、

ということがわかります。

つまり、マクロ内で、起動時に受け取った引数の内容と、execmacro/openfile文を、マクロ引数付き実行し、 この命令より後ろで取得した内容は、一致しません。

マクロで引数を使う場合、マクロ先頭で別の変数にコピーしておくのが、安全という事になります。

1.33.26.1 マクロ引数関連のテスト用マクロ

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;
1.33.26.2 マクロ引数関連のテスト用マクロの実行結果

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

1.34 マクロで文字変数に対する正規表現を使った検索・置換を行う方法

マクロで、文字変数に対して、正規表現を使うには、各種DLLを使用します。

文字変数内にunicodeを含む場合は、dllfunc/dllfuncstr使用時に制限があります。 「外部DLL呼び出しとunicode」、「マクロと文字コード」を参照してください。

1.34.1 hmjre.dllを使う方法

hmjre.dllには、マクロ用関数があるので、各関数を呼びだします。 詳細は、hmjre.dllの使い方を参照のこと

1.34.2 田楽DLLを使う方法

田楽DLLには、hmjre.dll、 BREGEXP.DLLへのインターフェースがあります。 詳細は、ヘルプを参照してください。 bregonig.dllも使用可能です。("BRE_LOAD"でbregonig.dllをロードする。)

1.34.2.1 hmjre.dllを使用する場合

以下のマクロ用の関数を、呼び出すことが可能です。

  • HMJRE_MATCH、HMJRE_GET_TAG_POSITION、HMJRE_GET_MATCH_STRING、 HMJRE_FIND_REGULAR、HMJRE_FIND_REGULAR_NO_CASE_SENSE、 HMJRE_REPLACE_REGULAR、HMJRE_REPLACE_REGULAR_NO_CASE_SENSE、 HMJRE_GET_LAST_MATCH_LENGTH、HMJRE_GET_LAST_MATCH_TAG_POSITION、 HMJRE_GET_LAST_MATCH_TAG_LENGTH、HMJRE_ENV_CHANGED、HMJRE_OPTION_DIALOG
1.34.2.2 BREGEXP.DLLを使用する場合

Perl5互換の正規表現を使いたい場合は、BREGEXP.DLLを使います。以下の関数が使用が可能です。

  • BRE_MATCH(検索)、BRE_SUBST(置換)、BRE_TRANS(文字置換)、BRE_SPLIT(分割)

1.34.3 BRegIf.dllを使う方法

BRegIf.dllでも、hmjre.dll互換のマクロ用関数が、実装されています。

目次へ

1.35 浮動小数点バージョン

秀丸エディタ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と同じなので、検索すれば見つかるでしょう。

目次へ

1.36 run文が失敗する

run文が正常に動作しない原因として多いのは、

のどちらかです。

プログラム及び、ファイルに空白を含む場合は、ファイル名を「"」(ダブルクォート)で 囲む必要があります。

例1

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\"";
例2

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\"";

目次へ

1.37 ファイル一覧の取得

2011/05/04
COM関連マクロのサンプルサンプルその7へのリンクを追加

マクロから任意のフォルダから、ファイルの一覧を取得する方法です。

田楽DLLを使う方法は、田楽DLLのヘルプを参照してください。("ENUMDIR"、"ENUMFILE")

1.37.1 dirを使う方法

まず、dirってなに?という人は、コマンドプロンプトを起動して下さい。 起動したら">"(プロンプト)が表示されているはずなので、その後に"dir"と入力し、 リターンキーを押します。

C:\Documents and Settings\xxxx>dir

すると、ファイルの一覧が表示されます。

dir通常の表示例

dirには様々なオプションがあります。使えるオプションを表示するには"/?"と入力します。

C:\Documents and Settings\xxxx>dir /?

このオプションでよく使うのは、

場合によっては以下オプションも使います。

とりあえず "/B"と"/ON"を指定します。

C:\Documents and Settings\xxxx>dir /B /ON

最初の表示と違い、ファイル名だけになります。

dirファイル名のみ表示例

この出力を秀丸で使用します。

1.37.2 dirからの取得方法

秀丸エディタと同じフォルダにあるヘルプファイル(*.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] + "\"";
}

1.37.3 リダイレクト関連のメモ

">con"を使って、リダイレクトが可能ですが、設定によって、標準出力だけでなく、 標準エラー出力も取り込めます。 その為、通常のコマンドプロンプトでリダイレクトした結果と、違ってくる場合もあるので、 注意すること。

ちなみに、コマンドプロンプトで、標準エラー出力も取り込むには、

command >output_file 2>&1

とすること。

dirからの取得方法では、直接、秀丸エディタにリダイレクトさせたが、""も取り込みたいとか、 終了の条件判断が難しい場合は、ファイルにリダイレクトさせ、ファイルを読み込めるDLLを使って、 取り込んだ方が、楽かも。

1.37.4 秀丸エディタのgrepを使う方法

FAQ辺りに載っていたと思っていたが、なかったので追加。

秀丸エディタのgrepには、オプションとして、"ファイル名一覧だけ作成"という項目があります。 このオプションを有効にすると、通常と違い、

という、動作になります。

これを利用し、各ファイルに確実にマッチする正規表現を指定して、grepを実行すれば、 最後に行番号が付くけど、ファイルの一覧が取得できます。

grepなので、

ということも、可能です。

行番号が不要な場合は、置換で削除すればいいです。

目次へ

1.38 開いているファイルに対する処理の注意点

秀丸エディタで開いているファイル全てに対して、処理を行う場合の注意点です。 (単純な事なんですが、各ウィンドウの状態を見ておかないと、失敗する可能性が大きい。)

開いているファイル全てに対して、処理を行う場合は以下のマクロを使います。

#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を使用せずに、 hidemaruhandlesetactivehidemaruを、使用した方がいいかもいれません。

おまけに、アクティブなタブグループに対して処理する方法。

#i = 0;
while( #i < tabtotal) {
  //処理したい内容を記述
  nexttab;
  #i = #i + 1;
}

tabtotal自体、"このタブを最小化"と非表示を認識しないので、上記のような問題はない。

目次へ

1.39 INIファイル関連

2015/11/15
iniファイルとUnicodeを修正

マクロで設定を保存する場合、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;

1.39.1 iniファイルのフォーマット

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ファイルのキー名はマルチバイト文字を正しく認識できていません。

頻繁に起こるケースではありませんが、注意は必要になります。 (アルファベット以外のキー名使用し、文字数が少ないと、問題になるかもしれない。)

1.39.2 iniファイルとUnicode

秀丸エディタ 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)で作成される。

対処方法としては、以下の内容が考えられる。

目次へ

1.40 findhidemaruでファイルが見つからない

2007/07/05
内容修正

以下の内容は、秀丸エディタ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文には、ショートファイルネームではなく、 ロングファイルネームを指定しないと、検索に失敗するようです。

目次へ

1.41 自動起動マクロ関連

2013/01/12「ファイルを開いた状況の判定」を修正。「通常操作以外の自動起動マクロ」を追加

自動起動マクロに関する情報やメモ

1.41.1 event、geteventparamの値とseteventnotify

自動起動で起動された場合、起動されたイベントの種類およびパラメータの値は、 自動起動されたマクロからexecmacroで実行されたマクロでも、取得可能。

test.mac(自動起動)
 ↓
test1.mac(test.macからexecmacroで起動)
 ↓
test2.mac(test1.macからexecmacroで起動)

上記の様な構成でも、test2.macからeventおよび、geteventparamは正常に(自動起動したと判断できる値が)取得可能。

また、test2.macで"seteventnotify"を使用した場合でも、問題ない。(キャンセルなどが正常に行われる。)

1.41.2 ファイルを閉じる直前について

1.41.3 新規作成直後を有効にした場合の注意点

1.41.4 マクロ実行中の自動起動マクロ

マクロの実行中は自動起動マクロは実行されません。(自動起動マクロが起動すると、困る場合もある。) Ver8.30β12より、setcompatiblemodeの設定で、タイマー系(カーソル移動後、編集後)のみ自動起動マクロが実行可能になりました。

マクロ実行時に自動起動マクロを実行するには、レジストリから、マクロが有効か無効かを調べ、 有効な場合はマクロのファイル名を取り出し、各イベント毎にexecmacro文を使って実行します。 しかし、自動起動マクロで動作させることを前提としたマクロには、event、geteventparamをみて、 動作する場合もあり、単純にexecmacroでは動作しない場合もあります。

このような場合は、マクロ側の対処が必要です。Ver.8から、マクロに引数が指定できるため、 引数を指定した場合は、event、geteventparam の値にかかわらず、処理を実行する様、 マクロを構成します。

1.41.5 新規(無題)ファイル保存時

無題ファイルを保存時の動作。

  1. 保存ダイアログを表示
  2. 保存直前
  3. 保存直後

無題ファイル保存時に設定される、デフォルトの命名規則に、マクロで割り込もうかと思ったが、 無理みたい。

1.41.6 ファイルを開いた状況の判定

geteventparam(0)の値を確認する。

0
外部からファイルを開いた場合。
  • エクスプローラ等から、秀丸エディタを起動した場合
  • grep結果から、タグジャンプした場合など。
1
秀丸エディタ本体から開いた場合。
  • 通常に起動している秀丸エディタから「ファイルを開くダイアログ」や、 ファイル履歴から、ファイルを開いた場合。
2
常駐秀丸エディタから開いた。
  • タスクトレイの常駐している秀丸エディタから「ファイルを開くダイアログ」や、 ファイル履歴から、ファイルを開いた場合。
3 (秀丸エディタ ver.8.30β16以降)
タグジャンプ/ダイレクトタグジャンプした場合
  • タグジャンプ/ダイレクトタグジャンプの区別は、一つ下のウィンドウのファイルタイプを確認することで判断できる。

タグジャンプ/ダイレクトタグジャンプした場合は、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結果からジャンプしたことがわかる。

1.41.7 通常操作以外の自動起動マクロ

通常操作以外(?)で、自動起動マクロの実行される種類と順番等のメモ。 (編集後タイマー、カーソル移動後タイマーは、未確認。)

タグジャンプした場合(ファイルを開く場合)
  1. ファイルを開いた直後
  2. アクティブ切り替え後
タグジャンプした場合(ファイルを開かない場合)
  1. アクティブ切り替え後
grepを実行した場合
  1. アクティブ切り替え後
プログラムの実行で、新規秀丸エディタに出力した場合
  1. アクティブ切り替え後

目次へ

1.42 「ブラウザの指定」で指定するプログラム

通常は、ブラウザを指定しますが、スクリプトも指定可能です。(確認したのはWSH)

C:\Windows\system32\wscript.exe scriptfullpath.vbs

と指定しておくと、URLを引数にして、スクリプトが起動します。

URLのカスタマイズと、スクリプトを併用すれば、用途が増えそう。

サポートフォーラムでの例

目次へ

1.43 アウトライン関連

関連項目

1.43.1 「アウトライン解析の枠」の表示状態を確認する方法

キーワードはないので、「ファイルタイプ別の設定」の設定値を直接見る。

#n = getconfig("Outline");
if(#n == 0){
    message "枠が表示されていません。";
}else{
    message "枠が表示されています。";
}

Ver.8

秀丸エディタVer.8β22より、outlinehandle キーワードが追加されました。 outlinehandleは、アウトライン枠が表示されていれば、ウィンドウハンドルを、 表示されていない場合は、0(zero)をかえすので、これで判定が可能です。

非表示:outlinehandle = 0
表示 :outlinehandle = 0以外

1.43.2 「アウトライン解析の枠」の表示内容を保存したい。

現状(Ver.7.03)では、秀丸エディタの機能として、保存する方法はありません。 「ツリー表示」の場合にかぎり、レベルをTAB文字×レベルに変換した状態で、 クリップボードにコピーが可能です。ツリー状にするにはTAB文字−罫線の変換が必要。

ツリー以外では、他のツールを使う方法がある。

Ver.8

秀丸エディタVer.8では、「一覧のコピー」というコマンドが追加され、 ツリー表示以外(関数一覧、強調一覧)でも、アウトライン枠の内容を、 クリップボードにコピー可能になっています。 ツリーになっている箇所は、レベルをTAB文字×レベルに変換されます。

1.43.3 「アウトライン解析の枠」のウィンドウについて

「アウトライン解析の枠」ウィンドウのクラス名は"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で取得したハンドルに、コマンドを送信することにより、 「ツリーそのものをコピー」を実行する事が可能になっています。 実行可能なコマンドは、以下のページを参照。

1.43.4 「アウトライン解析の枠」に表示されてる項目の有無を確認

マクロで確認する方法としては、「見出し」の有無で確認する。 「見出し」は、「アウトライン解析の枠」に表示される内容なので、 その有無を調べればいい。

手順としては、

  1. ファイルの先頭に移動
  2. 移動先の「foldable」キーワードを確認し、見出しかどうか調べる。 見出しなら、項目有り(チェック終了)。
  3. 「次の見出し」を実行
  4. 移動先の「foldable」キーワードを確認し、見出しかどうか調べる。 見出しなら、項目有り。見出しでないなら、項目無し。

という感じです。

「次の見出し」は、見出しがない場合、ファイルの最後に移動し、 実行結果(result)は、常に"true"を返す。 その為、「次の見出し」の結果では判断できないので、 移動先の「foldable」キーワードを確認する必要がある。

あとは、DLLを作って、Windows APIを駆使し、"一覧に何もありません"と、 表示されているか調べる。

"一覧に何もありません"と表示されているか調べるのは、マクロでも可能です。 「アウトライン解析の枠」を表示した状態で、

message gettitle(4);

を実行すると、アウトライン解析の枠の見出しを取得できます。 何もない場合は、"一覧に何もありません"と表示されます。

1.43.5 「アウトライン解析の枠」が浮いているかどうかの簡易的な判別方法

getconfig("Outline")が"1"であり、findwindow("アウトライン","HM32OUTLINE")が"-1"以外なら、 浮いていると判断できる(と思う)。 確実に判定するなら、レジストリを読むこと。

1.43.6 「アウトライン解析の枠」の表示を一時的に切り換える

config("xOutline:?")を使えば、「一時的な設定」となり、表示状態が保存されることはありません。 「一時的な設定」にしたくない場合は、sendmessageを使います。

#ret = sendmessage(hidemaruhandle(0),0x0111, 338,0);

現状、sendmessageを使うと、「一時的な設定」にならず、表示状態が保存されることはありません。 ただ、保証されている動作でないかもしれません。

1.43.7 「一覧のコピー」について

目次へ

1.44 ファイルタイプ別の設定関連

現在開いているファイルで使用している、「ファイルタイプ別の設定」の設定は、 "currentconfigset"で取得可能。 "currentconfigset"は、config文で設定を変更しても(一時的な変更でも)保持される。 現在の設定が"一時的な設定"かどうかは、"configstate"で確認可能。 "一時的な設定"を解除するには、configset文を使用し"再設定"するか、 ファイルを一度閉じ、再度開く。(再読み込みでは不可)

任意の拡張子に関連付けられた、「ファイルタイプ別の設定」を取得するには、レジストリを見る。 "CURRENTUSER"にある"Software\Hidemaruo\Hidemaru"の下に、拡張子毎のノードが作成され、 設定名が保存されている。 レジストリを触りたくない場合は、調べたい拡張子をつけたダミーファイルを開き、 "currentconfigset"を調べればいい。

目次へ

1.45 新規ファイルの判定

"無題"の新規ファイルの場合、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追加
参考までに、各状態で取得できるファイル名関連のキーワード

目次へ

1.46 折りたたみ関連

1.46.1 foldableキーワードについて。

カーソル行が折りたたみ可能かどうかを表す、foldableキーワードには、 使い方として、引数なしと引数ありの、二通りがあります。

引数なしの場合は、秀丸エディタが認識している(?)、折りたたみの条件を返します。 引数を指定した場合は、指定した引数(折りたたみ条件)に対し、可能かどうかを返します。 (not falseで判定する)

1.46.2 折りたたみの保存・復元

秀丸エディタ本体には、この機能はありません。その為、実現するにはマクロを使う必要があります。 折りたたんでいる箇所の探すのが、手間がかかります。 「アウトライン解析との対応」のみを対象とするなら、「次の見出し」を使えばいいのですが、 その他の箇所も対象とすると、先頭から順番にスキャンする必要があります。

目次へ

1.47 COM関連

2014/09/07 "サンプルその10"を追加および修正

秀丸エディタVer.8.00より、COM関連のマクロが追加され、 秀丸マクロ上から、各種COMの操作が可能になります。

参考になるMicrosoftのwebサイト

参考になる各種webサイト

現状での問題点等

1.47.1 COM関連マクロのサンプル

サンプルその1〜6は、macrodll.dllの使い方のサンプルを、秀丸マクロで書き直しただけです。 Ver.8以外では動作しません。

1.47.1.1 サンプルその1

com_macro_test.mac

InternetExplorerの操作を行います。 指定されたURLを開き、URLショートカットを作成します。

1.47.1.2 サンプルその2

com_macro_test2.mac

標準入出力へのアクセスを行います。 実行時すると、コマンドプロンプトが表示されます。 秀丸エディタをアクティブにすると、InputBoxが表示されているので、 適当に入力してください。ソートして出力します。ソートはsort.exeを使用しています。

1.47.1.3 サンプルその3

com_macro_test3.mac

ファイル操作のサンプル。 実行時すると、InputBoxが表示されので、適当に入力してください。 入力された内容をファイルに出力し、コピー、移動を行います。 マクロ実行後、マクロと同じ場所に"COM_TEST3_TEST.TXT"が作成されるので、 削除してください。

1.47.1.4 サンプルその4

com_macro_test4.mac

起動済みのInternetExplorerから情報を取得。 マクロと同じ場所に、URLショートカットを作成します。

1.47.1.5 サンプルその5

com_macro_test5.mac

起動済みのInternetExplorerから情報を取得。 選択している文字列を取得します。

1.47.1.6 サンプルその6

com_macro_test_sleipnir.mac

タブブラウザの"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|}
1.47.1.7 サンプルその7

com_macro_test7.mac

ファイル一覧の取得を行います。フォルダを選択し、表示したい拡張子を入力してください。 指定しない場合は、全ファイルを表示します。 表示する順番の指定はできません。(WSHの規定の順番です。)

1.47.1.8 サンプルその8

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で取得できます。

1.47.1.9 サンプルその9

http通信を行う"Msxml2.XMLHTTP"についてのメモ。

実際のマクロの例は、サポートフォーラムの投稿 hidesoft.4:07045 を参照して下さい。

  • httpレスポンスヘッダの"Content-Type"で、"charset"が指定されている場合は、 "ResponseText"プロパティの内容は、文字化けしないで取得可能。 "charset"が指定されていない場合は、文字コードをUTF-8として処理するため、 UTF-8以外の文字コードでは、文字化けを起こす。
    (metaタグで指定された、"charset"ではないので注意)
    • "charset"が指定されていない場合は、metaタグで指定された、"charset"を取得し、 "responseBody"から、"ADODB.Stream"を使用して、コード変換を行う必要がある。 (UTF-8の場合は、"ResponseText"で取得可能。)
  • 同じURLに連続でアクセスした場合、2回目はキャッシュを参照する。 確実にwebサイトからデータを取得するには、リクエストヘッダを設定する必要あり。 ("If-Modified-Since"、"Cache-Control"等)
  • 参考にしたwebサイト
1.47.1.10 サンプルその10

com_macro_test_word.mac

MS Office の Wordと連携(?)を行う例 です。 Wordを起動し、何か文字列を入力後、範囲選択を行ってから、マクロを実行してください。

Word文書で選択している範囲を秀丸エディタに取り込みます。

  1. 起動しているWordオブジェクトを取得
  2. SelectionオブジェクトのText プロパティ の内容を取得する。
  3. 新規秀丸エディタを開いて、取得した内容を挿入する。

Wordオブジェクトに関しては、Word のヘルプを参照してください。

目次へ

1.47.2 COM作成関連

1.47.2.1 Windowsスクリプトコンポーネント

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

1.47.2.2 開発環境(Visual Staduio)を使う
  • 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が作成できる。

1.48 CSV、TSVモード

2010/04/08 CSV、TSVモードの判定方法を追加

CSV、TSVモードのメモ

1.48.1 ","のcolorcode

CSVモードの場合、区切り文字である","のcolorcodeには、"0x00000020(タブ)"がセットされる。

1.48.2 CSV、TSVモードの判定方法

現在のモードは、"TabMode"で取得可能

#TabMode = getconfig("TabMode")

モード判定の例

if((0x000f & #TabMode) == 0x0000){
  //通常モード
}else if((0x0f0f & #TabMode) == 0x0001){
  //TSVモード
}else if((0x0f0f & #TabMode) == 0x0101){
  //CSVモード
}

目次へ

1.49 ファイルマネージャ枠とアウトプット枠

2013/06/29 アウトプット枠に、リンク追加

ファイルマネージャ枠とアウトプット枠のメモ

非表示
秀丸エディタ本体に、各枠のDLLが読み込まれているが、表示されていない状態
未ロード
秀丸エディタ本体に、各枠のDLLが読み込まれていない状態

1.49.1 共通事項

1.49.2 ファイルマネージャ枠

関連項目

1.49.3 アウトプット枠

目次へ

1.50 マクロと文字コード

2015/03/21 マクロファイル自体の文字コードについて を修正

主にShift_JISとUnicodeに関してです。他の文字コードに関しては、使ってないのでよくわかりません。

1.50.1 マクロファイル自体の文字コードについて

マクロヘルプに記載があるように、以下のようになります。

Shift_JIS以外の場合は、必ずBOMをつける必要があります。

マクロを公開する場合は、Shift_JISにしておいた方が無難です。(どのバージョンで使われるか不明なので。)

1.50.2 マクロ内部の文字コード

基本的には、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文字)

1.50.3 文字変数内に、Shift_JIS にないUnicodeが含まれているかどうかの確認

判定用関数は現状ではない。 「charindex_to_byteindex」 を使用することにより、確認可能です。

1.50.4 サロゲートペアについて

サロゲートペアに関しては、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関数は、サロゲートペアの上位、下位が、単独で対象になる場合は、その値(サロゲートの上位、または下位)をそのまま返します。 (サロゲートの片側だけでは、コードポイントがわからない為)

1.50.5 Unicodeを文字単位で扱う

Unicodeを含む文字変数内の文字列を、文字単位で操作する場合には、unicode関数でコードポイントをチェックしながら行います。

//英字、漢字、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;

1.50.6 外部DLL関連

基本的には、dllfunc/dllfuncstrの引数に Shift_JIS範囲外の文字は指定できません。 dllfuncw/dllfuncstrwを使用することになります。 例外的に、hmjre.dll等、サイトー企画が作成しているDLLは、Shift_JIS + 独自形式データ の引数を渡すことが可能になっています。

外部DLLの呼び出しに関しては、「外部DLL呼び出しとunicode」も参照のこと。

1.50.6.1 hmjre.dll使用時の注意

hmjre.dllは、例外的にdllfunc/dllfuncstrで、Unicodeを含む文字列を、秀丸エディタ独自の形式で受け取ることが可能です。

独自形式はUnicode1文字を4バイトで表現するため、hmjre.dllは、Unicode1文字を4バイトとカウントします。 マクロ関数は、Unicodeでも2バイトとカウントするため、DLL関数の引数や戻り値と、マクロ関数の引数や戻り値には、 ずれが発生します。

このずれを、補正するための方法としては、2つあります。

  • hmjre.dllにある、SetUnicodeIndexAutoConvert 関数を使う。
  • byteindex_to_charindex を使う。

前者は、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内で補正が有効になり、マクロ関数と同じ値となる。

目次へ

1.51 プロジェクトファイルについて

プロジェクトファイルのフォーマットについてのメモ

ファイル
"ファイルパス",name="枠に表示する名前"
セパレータ
---------- ("-"×10個)
グループ
"グループ名",group[,expand] ",expand"が付くと展開して表示される
フォルダ内のファイル一覧
"ファイルパス+ワイルドカード",name="枠に表示する名前",folder

レベルは、タブ(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

目次へ

1.52 カラーマーカーのレイヤー

レイヤーの表示例

"6)"は、一番下にある「layer1」でカラーマーカを設定している為、見えていない。

目次へ

1.53 選択範囲内で、複数回の全置換を行う

選択範囲内で、複数回の全置換を行う方法です。

サンプルデータ

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回目は全体が置換されます。 これは、以下のような動作になっているからです。

  1. 1回目実行時は、範囲選択されているので、"inselect"が有効、二行目のみ処理。
  2. 1回目実行後に、範囲選択が解除される。
  3. 2回目実行時は、範囲選択されていないので、"inselect"が無効、対象が全体になる。 「replaceallfast」は、指定された内容で、各種検索オプションを変更します。 その為、「選択した範囲内のみ」の状態も変更しようとしますが、2回目の命令実行時は、 範囲選択が解除されているので、結果的に「選択した範囲」が無い状態になっている。

という事で、範囲選択している個所に、複数回の全置換を行うには、工夫が必要です。

目次へ


top秀丸エディタマクロ