Hidemaru Q and A

第I部〜秀丸エディタQ&A集
 質問番号順Q&A(マクロ編)


[HMM0001A]

●マクロファイルとは?

Q. マクロファイルは、何をするものですか?

A. 拡張子が「MAC」のファイルで、秀丸のいろいろな機能を連続で実行させたり、実行結果を元に処理の流れを制御するためのプログラムファイルです。ファイルそのものはテキストファイルです。

[解説]
マクロを使うことで、秀丸の標準にない機能を自分で作って、あたかも秀丸の標準機能のように使うことが可能になります。


[HMM0002A]

●マクロはどこで入手できるの?

Q. マクロファイルを自分で作れないのですが、便利なマクロなどがどこかに公開されていませんか。

A. 秀丸マクロは NIFTY SERVE の「Windows 実用ソフトフォーラム(FWINAL)」の19番ライブラリを中心に数多く登録されています。

[解説]
いきなりは作れないと思いますが、そのうちに自分でも作れるようになると思います。便利なマクロが出来たら、登録して下さい。


[HMM0003A]

●マクロファイルの置き場所

Q. マクロファイルは、どこへコピーするのですか?

A. 設定により、2箇所(秀丸フォルダ又はマクロファイル用のフォルダ)のうちのどちらかになります。

[解説]
「その他→動作環境→パス」タブの「マクロファイル用のフォルダ」にパスを設定してある場合にはそのフォルダが、設定してない場合には秀丸フォルダがマクロファイルの置き場所になります。
なお、秀丸フォルダとは、秀丸本体「HIDEMARU.EXE」が入っているフォルダのことです。


[HMM0004A]

●マクロファイルの管理

Q. マクロファイルを、秀丸本体とは別フォルダで管理したいのですがどうしたらいいでしょうか?

A. 「その他→動作環境→パス」の「マクロファイル用のフォルダ」エディットボックスにドライブ名を含むフルパスで指定して下さい。但し、最後に「\」をつけてはいけません。

[HMM0005A]

●マクロファイル用のフォルダは必須か?

Q. マクロファイルは、マクロファイル専用フォルダで管理しないといけないのでしょうか?

A. 絶対に必要という訳ではありませんが、管理を容易にするために(秀丸本体とは分けて管理)分けておいた方が良いでしょう。

[HMM0006A]

●マクロを動かす方法

Q. マクロファイル(拡張子が「MAC」のテキストファイル)を入手したのですが、動かし方が分かりません。どうやったら動くのですか?

A. 以下の手順で実行でき、そのマクロを動かすことができます。

[手順]

  1. マクロをマクロファイル用フォルダにコピーして下さい。
  2. 「マクロ→マクロ実行」で、入手したマクロ(拡張子が「MAC」のファイル)を選択した後、「OK」のボタンを押す。
これでマクロが動きます。

[HMM0007A]

●「マクロ実行」はめんどう

Q. マクロを実行させるたびに「マクロ実行」でマクロファイルを選択するのが面倒です。

A. マクロを「マクロ登録」してみましょう。さらに、お好みのキーに「割り当て」てください。割り当てたキーを押すだけで、マクロが実行されるので大変便利です。

[HMM0008A]

●マクロ登録方法

Q. マクロの登録方法がわかりません。

A. 「マクロ→マクロ登録」で行います。ここでは「TEST.MAC」を「マクロ1」に登録する例を示します。

[手順]

  1. 「マクロ1」の「タイトル」のエディットボックスに適当なタイトル(例えば「てすと」)を入力。
  2. 「マクロ1」の「ファイル名」のコンボボックスに登録したいマクロ「TEST.MAC」を指定。
  3. 「OK」のボタンを押す。
なお、ここでは「マクロ1」を例としましたが、登録場所はどこでもかまいません。

[HMM0009A]

●マクロを「キー割り当て」して使いたい

Q. 入手したマクロのドキュメントファイルに「キー割り当て」して下さいと書いてあったのですが、どういうことでしょう?

A. 「その他→キー割り当て」を使ってマクロを実行するキーを決めて下さいということです。頻繁に使うマクロは、「キー割り当て」をするのが一般的です。

[手順]

  1. まずは、マクロを登録して下さい。
  2. 「その他→キー割り当て」でキー割り当てダイアログを表示。
  3. 「キー」のリストボックスと「Ctrl」のチェックボックス等をONにするなどして自分が使用したいキーを設定。
  4. 「コマンド」のコンボボックスに「メニュー/マクロ」を指定。
  5. 「コマンド」のリストボックスに先ほど登録したマクロを指定後、「OK」のボタンを押して下さい。

[HMM0010A]

●マクロ実行でエラー

Q. マクロを実行すると「エラー」のダイアログボックスが出ます。

A. マクロの構文に誤りがあります。データライブラリなどから入手したマクロの場合、修正版がアップされているかもしれません。ただし「修正」等は必ずしも作者の義務ではありません。添付されているドキュメントファイルなどがある場合は、免責事項等をよく読んで下さい。

[HMM0011A]

●バッファが溢れるとは?

Q. マクロを実行したら「バッファが溢れた」と言われました。

A. 「マクロ実行」でマクロを実行した場合は、「マクロ登録」をおこなって再度、マクロを実行してみて下さい。それでも改善されない場合は、マクロ自身が大きすぎる、マクロが扱っているデータが大きすぎるなどの原因が考えられます。これはケースバイケースですので、特定の解決方法はありません。一度に処理するデータの量を減らす、マクロ内の余分なコードを削る、などで対処することになります。

[HMM0012A]

●登録したマクロがメニューにない

Q. マクロ登録したのにメニューに出ない。

A. プルダウンメニューに直接表示されるのは「マクロ10」までです。「マクロ11」以降は「グループ名」が設定されていればそれが表示されます。また、「タイトル」がきちんと入力されているかも確認して下さい。

[HMM0013A]

●マクロを登録する位置はどこが最適?

Q. マクロを登録にあたって、どこにマクロ登録したらベストなのか、よくわかりません。それとも、どこでも同じなんですか?

A. 以下の点を参考にしてみてください。
  • マクロ登録できるのは「マクロ80」まで。
  • キー割り当て・ユーザーメニュー登録できるのは「マクロ50」まで。
  • ツールバーのアイコンがあるのは「マクロ10」まで。
  • 「マクロ」からのプルダウンメニューに直接表示されるのも「マクロ10」まで。
  • 無条件でショートカットキー(Ctrl+1〜9)に登録されるのは「マクロ9」まで。
  • 「マクロ11」以降は10個づつ「グループ名」が付けられる。

[HMM0014A]

●「¥」の使い方

Q. マクロでファイル名に「"C:\TEST.TXT"」と指定してもうまく動きません。たとえば、次のマクロ文で「C:\TEST.TXT」を開きたいのですが、エラーになってしまいます。もちろん、このファイルは確かに存在しています。
openfile "C:\TEST.TXT";

A. 「\」はC言語同様特殊文字なので、
openfile "C:\\TEST.TXT";
というように「\」を2つ重ねて下さい。

詳しくは、『第III部〜秀丸マクロのいろはにほへと』の『マクロ内での「\」や特殊文字の使い方』をご覧ください。


[HMM0015A]

●拡張子の認識

Q. 編集中のファイルの拡張子を調べたいのですが。

A. いろいろな方法がありますが、次の例は拡張子を取り出し、その結果を文字列型変数$KAKUTYOUSI に格納します。
  1. Windows3.1の場合、ファイル名は8.3形式であり、ピリオドを名前に用いないなどの制限があるため、これを利用します。次の例は、ピリオドの位置を検索して、検出した位置以降の3文字分を拡張子として取得します。
    $KAKUTYOUSI=midstr(filename,strstr(filename,".")+1,3);
    message "拡張子="+$KAKUTYOUSI;

  2. Windows95以降のOSの場合、単純にピリオドを探したのでは問題が生じます。次の例は、とりあえずファイル名の最後の4文字を取得してファイル形式を類推しています。
    $KAKUTYOUSI=midstr(filename,strlen(filename)-4,4);
    if($KAKUTYOUSI==".txt")message "テキストファイルです";

    一般に拡張子の文字列を取得したい場合は、ロングファイル名ではファイル名に「.」を使用可能ですので、ファイル名の後方から「.」を探す必要があります。
    実際のマクロは[HMM0074A] ●文字列の後方から文字列を検索 を参照して下さい。


[HMM0016A]

●openfile のオプションでの注意項目

Q. openfileに正しくオプションを指定しているつもりですが、うまく動きません。

A. オプションを指定する場合には、『半角空白』が必要な場合もあるので、不正動作時にはチェックしてみてください。次に2つの例を示します。
不可例1:openfile "/(100,100,500,500)"+$fileName;
修正例1:openfile "/(100,100,500,500) "+$fileName;
不可例2:openfile "/h"+$fileName;
修正例2:openfile "/h "+$fileName;

[HMM0017A]

●openfile の /(x,y,cx,xy) オプション

Q. openfile のオプションで「 /(x,y,cx,xy)」がありますが、なんだかうまく動きません。

A. 実ファイルが既に開いている場合は、予想した通りにファイルを開けますが、(無題)の秀丸上で openfile をやるとそのパラメタが、キャプションに入力されてしまい、後の位置移動などのコントロールたとえば、setwindowpos などが効かなくなる症状が古いバージョンの秀丸では発生するようです。そこで、正しく動かす為には、まず(無題)かどうかをチェックすると良いでしょう。

[HMM0018A]

●openfile の /(x,y,cx,xy) オプションでのマクロの動作時の注意

Q. openfile で自由な位置にウィンドウを開きたいのですが、思ったように動きません。

A. openfile 文の引数「x,y,cx,xy」には、文字列で数値を指定します。従って「openfile "/(100,200,300,400)";」は正しい書き方ですが、「openfile "/(#XX,#YY,#CX,#CY)";」は誤りです。数値型変数を使って秀丸の開く位置をコントロールするには、数値型変数を文字型変数に変換してください。次にその例を示します。

openfile "/("+str(#XX)+","+str(#YY)+","+str(#CX)+","+str(#CY)+")";


[HMM0019A]

●windowwidth と width の注意点

Q. windowwidth と width の違いがわかりません。

A. 「windowwidth はウィンドウの横幅(文字数)」、「witdh は折り返し文字数」をそれぞれ参照するための変数です。実際の運用で注意する点があります。通常、windowwidth が width より小さい場合は正確な数値が得られます。ただし、秀丸V1.32において、width より大きなウィンドウサイズの状態では、文字数による横幅は得られないで、width の値が入ってしまいます。ウィンドウのサイズによっては、この点に留意してください。

[HMM0020A]

●長い文字列を message 表示

Q. 長い文字列を表示したのですが、message 文では問題があるようです。

A. 確かに秀丸V2.14あたりまでは、約500バイト、秀丸V2.15でも約4000バイト程度で問題が発生するようです。表示させる内容があらかじめわかっている場合であれば、文字列を短くするとか、message 文を複数用意するといった対応方法があります。
しかし、マクロの途中などで、多量かつ何文字になるかわからない場合は、message 文は不適当です。そこで menuarray を使う方法があります。これだとどれだけながくなっても少なくとも表示はできます。欠点としては、幅が長くなると右で切れます。従ってどうしても長い情報を表示させたい場合には、情報(文字列)を適当に切って menuarray の配列子にいれると見栄えが良くなります。ただし、こうした長い文字列を message 文や menuarray 文で処理するのは原則的に避けるべきです。

[HMM0021A]

●サブルーチンへの引数

Q. サブルーチンへ引数がうまく引き渡せません。

A. 引数の「数」と「型」と「順番」を合わせる必要があります。次の例は、3つの文字列型変数と2つの数値型変数を「test」というサブルーチンへ渡しています。引数の順番に注意しましょう。特にサブルーチン側での引数の参照順に留意してください。
//------- サンプルマクロ -------//
call test #n1,$s1,$s2,#n2,$s3;
endmacro;

test:

##ukenum1=##1;
$$ukestr1=$$2;
$$ukestr2=$$3;
##ukenum2=##4;
$$ukestr3=$$5;
//...処理
return;
// ---------------------------- //

[HMM0022A]

●サブルーチンからの戻り値(文字列)

Q. サブルーチンから戻り値を得ることができますか?

A. 戻り値として変数値をひとつ得られます。次の例は、文字列型変数2つを「calcStrToNum」サブルーチンへ渡し、これを合計し、答えを文字列型変数で呼び出し元へ戻しています。戻り値は文字列型であれば「$$return」、数値型であれば「##return」という変数に格納されます。
//------- サンプルマクロ -------//
$a="123";
$b="456";
call calcStrToNum $a,$b;
$ans=$$return;
message $ans + "円";
endmacro;

calcStrToNum:

$$s1=$$1;
$$s2=$$2;
##wa=val($$s1)+val($$s2);
$$anser=str(##wa);
return $$anser;
// ---------------------------- //

[HMM0023A]

●サブルーチンからの戻り値(数値)

Q. 戻り値を数値で得たいのですが。

A. サブルーチンからの戻り値は文字列型変数だけでなく、数値型でも得られます。次の例は上の例とほぼ同じですが、戻り値を数値型で返してします。
//------- サンプルマクロ -------//
$a="123";
$b="456";
call calcStrToNum $a,$b;
#ansNum=##return;
endmacro;

calcStrToNum:

$$s1=$$1;
$$s2=$$2;
##wa=val($$s1)+val($$s2);
return ##wa;
// ---------------------------- //

[HMM0024A]

●サブルーチンからの戻り値($$return,##return)をそのまま使う

Q. サブルーチンからの戻り値(##return,$$return)を新しい変数で受けるのは面倒です。

A. 戻り値を他に利用しないのであれば、戻り値そのものをマクロ文で利用できます。次の例は、上の例とほぼ同じですが、戻り値を新しい変数に格納しないですぐに利用してます。
//------- サンプルマクロ -------//
$a="123";
$b="456";
call calcStrToNum $a,$b;
$kotae=str(##return)+"円";
message $kotae;
endmacro;

calcStrToNum:

$$s1=$$1;
$$s2=$$2;
##wa=val($$s1)+val($$s2);
return ##wa;
// ---------------------------- //

[HMM0025A]

●サブルーチンからの戻り値(複数の戻り値)

Q. 戻り値がひとつしか使えないのでは不便です。

A. グローバル変数をサブルーチン側で用いることで対応できます。
//------- サンプルマクロ -------//
$a="123";
$b="456";
call calcStrToNum $a,$b;
message "和="+str(#wa)+"差="+str(#sa);
endmacro;

calcStrToNum:

$$s1=$$1;
$$s2=$$2;
#wa=val($$s1)+val($$s2);
#sa=val($$s1)-val($$s2);
return;
// ---------------------------- //

一見、return文で何も返していないようですが、#wa,#saでグローバル変数を使用しているので、これらの変数は元のルーチンでも参照できます。こうした「グローバル変数を用いた戻り値」では、実質的に複数の戻り値を返せます。これらは一般的なプログラミングにおける変数の有効範囲における留意点とほぼ同様です。

[HMM0026A]

●setsearchのフラグ

Q. setsearchのフラグって何ですか?

A. 検索ダイアログボックスの設定状態をマクロ文で再現するためのものです。下記の数値(の和)を指定します。
1 :単語の検索
2 :大文字/小文字の区別
4 :置換かどうか
8 :(置換の場合)問い合わせの有無
16 :正規表現
32 :あいまい検索
64 :ファイル名一覧だけ作成
128 :(秀丸forWin95のみ)次の秀丸も続けて検索
例えば「単語でしかも大文字小文字の区別あり」の場合は(1 + 2 =) 3 を指定します。

[HMM0027A]

●検索フラグの適用

Q. searchupなどはフラグでコントロールできないようですが。

A. 検索フラグを使って影響を及ぼすことができるのは、findup,finddown文だけであり、searchup/down,grep文などは、その命令行のパラメタを直接指定する他には方法がありません。

[HMM0028A]

●マクロファイル用フォルダの存在

Q. マクロを配布する場合、マクロファイル用フォルダを作っている人と作ってない人があります。どうやって判別すればよいのですか?

A. いくつか方法がありますが、次の例は、文字列型変数「$$MF」にマクロファイル用フォルダのパスを格納するものです。秀丸V1.33β5以降で有効です。
$$mp=getinistr("hidemaru.ini","Env","MacroPath");
if($$mp=="")$$MF=hidemarudir+"\\";
else $$MF=$$mp+"\\";
ver.3.02から、キーワード macrodir が追加されました。[HMM0028B]も参照してください。

[HMM0028B]

●マクロで秀丸マクロフォルダを取得するには

Q. 秀丸マクロの中で、秀丸マクロフォルダを文字列として取得したいのですが、どうすればいいですか?

A. ver.3.02から、キーワード macrodir が追加されました。
ver.3.01以下の秀丸でも macrodir と同等の文字列を取得したい場合は、以下のマクロ例を参考にしてください。16bit版と秀丸95(ver.3.02以降を含む)のどちらでも動作します。
// (例) 秀丸マクロフォルダを取得するマクロサンプル ---------

$macrodir = getinistr("HIDEMARU.INI", "Env", "MacroPath");
if ($macrodir == "") $macrodir = hidemarudir;
message $macrodir;

// (ここまで)-----------------------------------------------


[HMM0029A]

●マクロファイルの存在確認

Q. マクロファイルがあるかどうかを判定できますか?

A. さまざまな方法があります。次の例は、引数に確認したいマクロのファイル名を指定すれば、あとはマクロファイル用フォルダを自力で探し、存在する場合には1、存在しない場合は0を返すサブルーチン「isExistMac」です。
//------- サンプルマクロ -------//
call isExistMac "test.mac";
if( ##return != 0 ) message "マクロがありました。";
else message "マクロはありません。";
endmacro;

isExistMac:

$$checkFile=$$1;
$$mp=getinistr("hidemaru.ini","Env","MacroPath");
if($$mp=="")$$fDir=hidemarudir+"\\";
else $$fDir=$$mp+"\\";
$$cF=$$fDir+$$checkFile;
##existYN=existfile($$cF);
return ##existYN;
// ---------------------------- //

[HMM0030A]

●ファイルの存在確認

Q. ファイルがあるか確認したいのですが。

A. いくつか方法がありますが、次の例は、existfile関数を使ったものです。
//------- サンプルマクロ -------//
$target = "c:\\data\\test.txt";
if(existfile($target))message $target+"は存在します";
else message $target+"は見つかりませんでした";
endmacro;
// ---------------------------- //

[HMM0031A]

●findwindow()の秀丸ファイル名指定時の注意事項

Q. findwindow() がうまく使えません。

A. ちょっとしたコツが必要です(^^;。たとえば「秀丸 - c:\hmmacro\test.mac」とキャプションバーに表示されている場合を想定しましょう。このまま、文字列としてfindwindow() 関数に指定しても発見できません。ジツは下の例のように、キャプション表示されているファイル名の最後に、半角の空白が必要です!
//------- サンプルマクロ -------//
$searchWindowName="秀丸 - c:\\hmmacro\\test.mac ";
#ans=findwindow($searchWindowName);
if(#ans==0)
message "『"+$searchWindowName+"』を持つウィンドウはありません";
else
message "WindowHandle『"+str(#ans)+"』にあります。";
endmacro;
// ---------------------------- //

※ 秀丸ウィンドウのウィンドウハンドルを取得したい時は hidemaruhandle() 関数を使った方が楽です。


[HMM0032A]

●「検索での表示」を設定

Q. ある文字列を検索させて消去したいのですがうまくいきません。

A. 「その他−動作環境−ユーザインタフェース−検索での表示」を[点滅]ではなく、[選択する]にしないとうまくいきません。そこでマクロ実行直後にこれを調査して、[点滅]になっていれば[選択する]に変え、マクロが終了する直前に「検索での表示」を元の状態にもどしてやります。次の例はこれを自動的に設定します。
//------- サンプルマクロ -------//
#SForg=getininum("hidemaru.ini","Env","SelectFound");
if(!#SForg){
writeininum "hidemaru.ini","Env","SelectFound",1;
envchanged;
}

//マクロ本体
// …… ここにマクロを書きます

//マクロ終了
if(!#SForg){

writeininum "hidemaru.ini","Env","SelectFound",0;
envchanged;
}
endmacro;
// ---------------------------- //

[HMM0033A]

●insertreturnの上書き/挿入MODEでの動き

Q. 改行を入れるためにinsertreturn文を使っていますが、なんか変です。

A. insertreturn文は、キーボードからの「Enter」キー(リターンキー)の動きを再現します。従って、設定されている上書き/挿入モードによって動作が異なります。上書きモードの場合で、しかも「その他→動作環境」の「カーソル」の中の「上書きモード時のリターン」の設定が「カーソル移動する」になっていると、カーソルが次の行頭へ移動するだけで、改行されません。ただし、カーソル上に[eof]マークがある場合だけ、改行が挿入されるので注意してください。

[HMM0034A]

●rollup等の動き

Q. roll系のマクロ文の動きがわかりません。

A. 画面のスクロールなどを担当するroll系マクロ文には「rollup/rollup2/rolldown/rolldown2」があります。rollup/rolldown文は「カーソル位置は、画面とともに上へ移動」します。また、「rollup 5;」などのようにパラメータを指定して移動量を指定できます。一方、「rollup2/rolldown2」は「カーソル位置は、画面の同じ位置をキープ」したままで画面をスクロールさせます。なお、rollup2/rolldown2文はパラメータの指定はできないので注意が必要です。

[HMM0035A]

●時間待ちサブルーチン

Q. 秀丸マクロには、処理の待ち時間を設定するコマンドがないので不便です。

A. 空の処理をすることで待ち時間を発生させます。次の例は、引数によって待ち時間の長さを調整できるサブルーチン「WaitTime」で、引数の相対値で待ち時間を設定します。
//呼出し例:
call WaitTime 500;
//サブルーチン本体:
WaitTime://時間待ち、空処理
while(##n<##1)##n=##n+1;
return;

次の例は待ち時間を絶対時間(ミリ秒)で指定するサブルーチンです。
※但し、多少の誤差があります。
//呼出し例:
call WaitMillisecond 5000;
//サブルーチン本体:
WaitMillisecond:
##goaltime = tickcount + ##1;
while(##goaltime > tickcount);
return;


[HMM0036A]

●IMEのマクロ動作中切断方法

Q. マクロの実行前後で、IMEの状態を同じにしておきたいのですが。

A. マクロの実行直後と終了直前にIMEの状態を調査して、希望の状態になるように設定します。次の例はマクロ実行中はIMEをOFFにし、マクロ実行後に、IMEのON/OFF状態を元の状態に戻します。
//------- サンプルマクロ -------//
#imeYN = imestate;
if( #imeYN ) imeswitch; // IME を OFF

//以下、マクロ本体
// ……ここからマクロ本体を書く

//終了直前
if( #imeYN != imestate ) imeswitch;
endmacro;
// ---------------------------- //


[HMM0037A]

●IMEのマクロ中、強制OFF

Q. keypressed文による値でループさせるマクロを作ったのですが、ついIMEのON/OFFキーをさわってしまい、動作が変になります。

A. 誤ってキーを押すことはよくあることです。keypressedループ中で常にON/OFFを調査して、変更があればその都度修正します。次の例は、IMEがONされても、常にOFFが維持されます。
disablebreak;
while(1){
while(1){
#k=keypressed;
if(#k=27)break;
else if(#k=...
// elseによる分岐が続く
}
if(imestate)imeswitch;
}

[HMM0038A]

●検索ダイアログボックスを出す

Q. 検索ダイアログボックスを出すためのマクロ文が見当たりません。

A. ありません(^^; 一応、未公開コマンドですが、公然の秘密状態になっている次のマクロ文があります。
find;
ただし、これで検索ダイアログボックス出ますが、正しいresult値が得られない事をはじめ、さまざまな留意点があります。十分試験をして動作確認を行った上で使ってください。

[HMM0039A]

●単語の検索

Q. 検索ダイアログボックスを出すには「find」という隠しコマンドがあるそうなんですが、「単語の検索」に相当するマクロ文が見当たりません。

A. 検索ダイアログボックスを「単語の検索」だけがオンになっている状態で出したいわけですね。これまた正式なマクロ文ではないのですが、「単語の検索」のダイアログボックスを出すためのマクロ文があります。次にそのマクロ文を示します。引数はありません。
findword;

[HMM0040A]

●config "w"

Q. config "w"で折り返し文字数を変えると、「やり直し」「やり直しのやり直し」のヒストリーをキャンセルされてしまいます。

A. このコマンドは、折り返し文字数の再設定を行いますが、ご質問のように「やり直し」「やり直しのやり直し」のヒストリーをキャンセルしまいます。つまり、このコマンドにより、それ以前の状態にやり直しで戻ることができなくなります。注意しましょう。

[HMM0040B]

●マクロ実行後に「やり直し」が効かない

Q. 「その他→動作環境→編集→やり直し」の「やり直しバッファサイズ」を超えないような編集であるにも関わらず、マクロ実行後に「編集→やり直し」、「編集→やり直しのやり直し」が効かなくなる場合があります。

A. 「config "w80";」、「config "k+";」などで、「折り返し文字数」、「禁則処理」のようなワープロ行(見た目での行数)が変わる可能性(実際に変わらなくても)がある設定を変更した場合は、秀丸内部で情報の再配置が必要なため、「編集→やり直し」、「編集→やり直しのやり直し」が効かなくなります。
「その他→ファイルタイプ別の設定」、「その他→動作環境」で設定を変更した場合も同様です。[HME0082A]●設定変更後に「やり直し」が効かない を参照して下さい。

[HMM0041A]

●文字列型変数の扱う文字列の限界

Q. ヘルプには「文字列型変数の扱える文字列は,長さが8000バイト程度までのものなら自由な内容を記憶することができます。ただし,NULL文字を含むことはできません。」とあります。もっと多量の文字列を扱いたい場合はどうするんですか?

A. クリップボードを利用することで、この限界を軽くクリアーできます。また、秀丸を常駐させると使えるようになる「クリップボード履歴」の機能を使えば、複数の文字列をコントロールできます。

[HMM0042A]

●grepのダイアログボックスを出す

Q. grepのダイアログボックスだけを出すことは出来ますか?grepdialog文では新規に白紙の秀丸が出てきてしまってイライラします。

A. 見えない所でこの(無題)秀丸を開く方法があります。次にその例を示します。
openfile "/(1600,1600,100,100)";
grepdialog;
setwindowpos 100,100,500,500;

[HMM0043A]

●(無題)秀丸からのマクロ実行

Q. 新規の秀丸、つまり、(無題)秀丸はファイルを開いたり、grepをしたりする時、(無題)秀丸を無題のままにしておきたい場合(読み込み回避)はどうするのですか?

A. (無題)および(無題)(更新)がタイトルバーに表示されている秀丸から、一時処理ファイルを開くような作業をする場合(openfile系コマンド等)、通常、(無題)秀丸にファイルが優先的に読み込まれてしまいます。通常の編集作業では問題ないのですが、マクロで自動処理をする場合、トラブルの原因になるケースもあります。そこで、(無題)状態をキープしたい時は、changename により「ファイル名」を与えておいて、終了時に再度(無題)に戻すことで回避できます。ただし、なぜかちょっとした追加処理が必要だったりします。次にその例を示します。
//(1)前処理
#hwndOrg = hidemaruhandle( 0 );
if(filename==""){
changename "xxxxxx.tmp";
#changeFileName=1;
}

//ここからマクロ本体
openfile "00temp$$.$$$"; // 一時処理ファイルを開く
#hwndTmp = hidemaruhandle( 0 );

//(2)終了処理
setactivehidemaru #hwndOrg;
closehidemaruforced #hwndTmp;
if(#changeFileName){

changename "";
insertfix "a";
undo;
}

[HMM0044A]

●文字列型変数中の半角小文字を大文字に

Q. 編集中のファイルにある文字ではなく、文字列型変数の中にあるアルファベットを大文字にすることはできますか?

A. いくつかの方法はありますが、ここではマクロだけで対応する方法を紹介します。次の例は、与えられた文字列($orgStr)のうちで、半角英文字だけを大文字にします。手軽ですが、大量の文字列を変換するには向いているとは言えません(2バイト文字がある場合も考慮されていません)。
//------- サンプルマクロ -------//
$orgStr="abcDeFあいAAAbbbうえお*+-/ABcd";
call CaseToUPPER $orgStr;
message $$return;
endmacro;

CaseToUPPER:

##s = strlen( $$1 );
while( ##s > 0 ){
##s = ##s - 1;
##code = ascii( midstr( $$1, ##s, 1 ) );
if( ##code > 96 && ##code < 123 )##code = ##code - 32;
$$str = char( ##code ) + $$str;
}
return $$str;
// ---------------------------- //

[HMM0045A]

●文字列型変数中の半角大文字を小文字に

Q. 文字列の中にある半角英文字を小文字にできますか?

A. 上の例と同じアプローチをした例です。
//------- サンプルマクロ -------//
$orgStr="abcDeFあいAAAbbbうえお*+-/ABcd";
call CaseToLOWER $orgStr;
message $$return;
endmacro;

CaseToLOWER:

##s = strlen( $$1 );
while( ##s > 0 ){
##s = ##s - 1;
##code = ascii( midstr( $$1, ##s, 1 ) );
if( ##code > 64 && ##code < 91 ) ##code = ##code + 32;
$$str = char( ##code ) + $$str;
}
return $$str;
// ---------------------------- //

[HMM0046A]

●keypressed文による分岐のスケルトン

Q. keypressed文によって分岐させたいのですが、キーコードを探すのが面倒です。

A. 次にベースになるマクロを掲載しました。それぞれのキープレスに対応した動作を記述するだけで、すぐに使えるマクロになります。デフォルトではエスケープキーで終了し、リターンキーではビープ音が鳴りますが、自由に変更できます。必要なキーだけを残すように編集してください。
//------- サンプルマクロ -------//
// 編集者注:長さを短く押さえるため一部省略してあります。
disablebreak;
title " [Esc] 終了";
while(1){
##k=keypressed;
if(##k==0x1B){ break;//Esc
}else if(##k==0x0D){// ENTER
beep;
}else if(##k==0x25){// ←left
}else if(##k==0x26){// ↑UP
}else if(##k==0x27){// →right
}else if(##k==0x28){// ↓DOWN
}else if(##k==0x24){// Home
}else if(##k==0x23){// End
}else if(##k==0x21){// PgUp
}else if(##k==0x22){// PgDn
}else if(##k==0x09){// Tab
}else if(##k==0x11){// Ctrl
}else if(##k==0x10){// Shift
}else if(##k==0x08){// BackSpace
}else if(##k==0x20){// space
}else if(##k==0x2D){// Ins
}else if(##k==0x2E){// Del
}else if(##k==0x14){// CapsLock
}else if(##k==0x41){// a,A
// : :
}else if(##k==0x5A){// z,Z
}else if(##k==0xBD){// -_
}else if(##k==0xBB){// =+
}else if(##k==0xDC){// \ |
}else if(##k==0xDB){// [{
}else if(##k==0xDD){// ]}
}else if(##k==0xBA){// ;:
}else if(##k==0xDE){// '"
}else if(##k==0xBC){// ,<
}else if(##k==0xBE){// .>
}else if(##k==0xBF){// /?
}else if(##k==0xC0){// `~
}else if(##k==0x70){// F-1
// : :
}else if(##k==0x78){// F-9
}else if(##k==0x79){// F-10//Ver.2.14以下は取得不能
}else if(##k==0x7A){// F-11
}else if(##k==0x7B){// F-12
}else if(##k==0x91){// Scroll Lock
}else if(##k==0x13){// Pause
}else if(##k==0x31){// keyBoard-1
// : :
}else if(##k==0x30){// keyBoard-0
}else if(##k==0x60){// tenkey-0
// : :
}else if(##k==0x69){// tenkey-9
}else if(##k==0x6E){// tenkey-.
}else if(##k==0x6B){// tenkey-+
}else if(##k==0x6D){// tenkey--
}else if(##k==0x6A){// tenkey-*
}else if(##k==0x6F){// tenkey-/
}else if(##k==0x14){// tenkey-Num Lock
}else if(##k!=0)beep;
}
endmacro;
// ---------------------------- //

[HMM0047A]

●特定のファイルを開く

Q. 指定したファイルが開いてなければ開く、既に開かれていればアクティブにする、というような操作をしたいのですが。

A. これもさまざまな方法があります。次の例は、既に開かれているファイル名を調査するタイプのマクロで、常に「MEMO.txt」という文書を編集できる状態にします。
//------- サンプルマクロ -------//
$openFileName="c:\\hmmac\\MEMO.txt";
if($openFileName!=filename){
#findWind = findhidemaru($openFileName);
if(#findWind>0)setactivehidemaru #findWind;
else openfile $openFileName;
}
endmacro;
// ---------------------------- //

[HMM0048A]

●上書き禁止・閲覧モード時のマクロの動作

Q. 上書き禁止や閲覧モード時にテキストの編集をするマクロを実行すると、編集結果がぐちゃぐちゃになってしまいます。

A. マクロ命令の中に、上書き禁止や閲覧モードになっていても動作に影響せず書き込んでしまうものと、書き込み動作を行わなくなるものの2種類が存在するためです。上書き禁止や閲覧モードになっていたら、警告ダイアログを出してマクロを終了させるか、もしくはモードを変更するかしましょう。
//(例)
if(readonly){
message "「上書き禁止」なので実行を中止します。";
endmacro;
}
if(browsemode){
message "「閲覧モード」なので実行を中止します。";
endmacro;
}

[HMM0049A]

●検索系コマンドを使う場合は

Q. 検索系コマンドを使うと、検索ダイアログのオプション指定が変化してしまいます。

A. searchup/searchdown文を使うことによって、検索バッファの内容が書き換えられてしまうために起こる現象です。なるべくマクロ実行の痕跡を残さない=マクロ実行前後で検索バッファが置き換わらないほうが良いので、マクロの最初に検索バッファを変数に退避しておき、マクロ終了前に戻します。秀丸マクロヘルプの setsearch 文のところに記述があります。
//(例)
// マクロの先頭
$b=searchbuffer;
#s=searchoption;

// マクロの最後
setsearch $b,#s;


[HMM0050A]

●自動インデントとinsertreturn

Q. insertreturn 文で改行挿入すると、次の行の行頭に空白が挿入されてしまいます。

A. 自動インデント(キーワード indentstate)が無し以外の場合に、insertreturn 文で改行挿入する時、その行の先頭に空白があると自動インデントされて次の行の行頭に空白が挿入されます。テキスト整形等をするときにインデントがじゃまになる場合は、マクロの先頭でインデントをオフにして最後で戻しましょう。indentstate と config の i の値とが違うのでちょっと複雑ですが(^^;)
//(例)
// マクロの先頭
#indentstate = indentstate;
if (#indentstate != 0) config "i0";

// マクロの最後
if (#indentstate == 1) config "i1";
else if (#indentstate == 3) config "i2";
else if (#indentstate == 5) config "i3";
else if (#indentstate == 7) config "i4";


次へ:[HMM0051A]〜


目次に戻る