マクロを使用すると、検索条件が変わるNo.42537
どら焼き さん 12/04/17 13:35
 
こんにちは、秀丸メールにはお世話になっています。

 秀丸メールVer:5.76beta2 32bit
 OS     :XPSP3

最近、秀丸メールマクロライブラリに掲載されている、
「やすひさ」さん、ご作成の【「To:」ヘッダからアドレス帳を元に、
本文へ文字列を自動記入する Rev.20070528】(2007/05/28掲載)
マクロを使用させてもらっています。
やすひささん、ありがとうございます。

さて、そのマクロを実行後、「検索して一覧作成」を実行すると
検索ウィンドウの「大文字/小文字の区別」と「正規表現」が、
チェックオフから自動的にチェックオン状態になってしまいます。

秀まるおさん、この現象のご確認と、もし発生を確認できましたら
その対処方法のご教示をお願いできますでしょうか。

よろしくお願い致します。

[ ]
RE:42537 マクロを使用すると、検索条件がNo.42540
秀まるお2 さん 12/04/17 14:57
 
 これは秀丸エディタでもずっと昔からある問題なんですが、マクロで検索を実
行すると、それによって、検索ダイアログボックスの各種オプションが変わって
しまうというのはあります。

 それを回避するには、マクロを少々手直ししていただく必要があります。

 例えば、「a.mac」ってマクロがあったとして、それを実行しても検索条件を
変えないようにするには、

 例えば、以下のような内容の、「a-super.mac」ってマクロを別途作成します。

    $search = searchbuffer;
    #opt = searchoption;
    execmacro "a.mac";
    setsearch $search, #opt;

 で、今までa.macを割り当ててた所を、a-super.macに置き換えます。

 それで検索条件が変わらなくなります。

 ということでどうでしょうか。

 ちょっと面倒なのですけども。

[ ]
RE:42540 マクロを使用すると、検索条件がNo.42542
どら焼き さん 12/04/17 15:51
 
秀まるおさん

ご回答ありがとうございます。
ただ、ご回答いただいた通りにやってみたのですが、
うまくいきません。

マクロ動作終了後、「検索して一覧作成」実行するとやはり
検索ウィンドウの「大文字/小文字の区別」と「正規表現」が、
チェックオフから自動的にチェックオン状態になっています。

長文になってしまってすいませんが、マクロの内容を載せますので、
ご確認をお願いできますでしょうか?

●秀まるおさんから教えてもらったマクロ”a-super.mac”は
 内容を変えず、指定されるマクロの名前を”a.mac”に変えています。

●”a.mac”の内容は下記の通りです。
 マクロの内容は ”<<InsertNameToHeader>>[lastname]” と
 いった変数の場合、TOヘッダの内容をアドレス帳の名前に
 して貼り付ける、といったものです。
 マクロの使用タイミングは、送信メール作成時(エディタ上)です。


// InsertNameToHeader.mac Rev.20070528 /////////////////////////////////////
////
//                                                                          
  //
// 「To:」ヘッダからアドレス帳を元に、本文へ文字列を自動記入する            
  //
//                                                                          
  //
//                                                       xxxxxxx@yasuhisa.ne
t //
//                                                       http://yasuhisa.net
/ //
///////////////////////////////////////////////////// Copyright 2007 Yasuhis
a //
loaddll "TKInfo.dll";
if( !result ) endmacro;
if( ! dllfunc( "IsHidemaruMail" ) ) endmacro;

disabledraw;

///// 座標記憶 /////////////////////////////////////////////////////////////
////
if( selecting == true ){
 #x1 = seltopx;
 #y1 = seltopy;
 #x2 = selendx;
 #y2 = selendy;
 #select = true;
 escape;
} else {
 #X = x;
 #Y = y;
}

//if ( $Kugiri == "" ) $Kugiri = "\n"; // デフォルトは改行
if ( $Kugiri == "" ) $Kugiri = "、"; // 句読点(、)で区切り

call InsertName("To");
call InsertName("Cc");

///// カーソル位置を元に戻す ///////////////////////////////////////////////
////
if( #select == true ){
 moveto #x1, #y1;
 beginsel;
 moveto #x2, #y2;
 endsel;
} else {
 moveto #X, #Y;
}

enabledraw;
endmacro;

///// 以下サブルーチン /////////////////////////////////////////////////////
////

InsertName:
 if( dllfuncstr("CurrentHeader",$$1) == "" ) return;

 $$searchstr = "<<InsertName" + $$1 + "Header>>";
 moveto 0, -1;          // カーソル位置を本文先頭へ移動

 // 書式の検索 //
 searchdown $$searchstr + ".+$", regular;
 ##n = result;
 if( ##n == true ){
  ##format_x1 = foundtopx;
  ##format_y1 = foundtopy;
  ##format_x2 = foundendx;
  ##format_y2 = foundendy;


  // 書式の取得 //
  $$format = gettext( ##format_x1 + strlen($$searchstr), ##format_y1, ##form
at_x2, ##format_y2 );
  if( ##format_x1 != 0 ){
   $$format_f = gettext( 0, ##format_y1, ##format_x1, ##format_y2); // 「"<<
InsertName" + $$1 + "Header>>"」 より前の文字列
   call ReptStr " ", strlen($$format_f);
   $$format_f_sp = $$return;
  }
  // 書式の削除 //
  escape;  moveto 0,           ##format_y1;
  beginsel; moveto ##format_x2, ##format_y2;
  delete;
 } else return;


 ##HeaderMax = dllfunc("CountCurrentHeader",$$1);
 ##HeaderCount = 0;
 $$ret = "";

 //// ヘッダ分繰り返し ////
 while(##HeaderCount < ##HeaderMax) {

  $$AddrssList = dllfuncstr("CurrentHeader2",$$1,##HeaderCount);

  ##ListMax =  dllfunc("CountEmailList", $$AddrssList);
  if( ##ListMax <= 0 ) return;


  ##ListCount = 0;
  //// アドレス数分繰り返し ////
  while(##ListCount < ##ListMax) {
   $$Address = dllfuncstr("GetEmailList", $$AddrssList, ##ListCount);
   $$Name = dllfuncstr("UnDoubleQuote", dllfuncstr( "FindBook", $$Address));
    // 名前(アドレス帳)
   if ($$Name == "") {
    $$Name = dllfuncstr("UnDoubleQuote", dllfuncstr("SetNameOnly",$$Addres
s));   // 名前(ヘッダより)
    $$Note1 = "";
    $$Note2 = "";
    $$Note3 = "";
    $$Note4 = "";
    $$Note5 = "";
    $$Note6 = "";
    $$Note7 = "";
    $$Note8 = "";
   }else{
    $$Note1 = dllfuncstr( "FindBookNote",  $$Address);         // 備考1
    $$Note2 = dllfuncstr( "FindBookNote2", $$Address);         // 備考2
    $$Note3 = dllfuncstr( "FindBookNote3", $$Address);         // 備考3
    $$Note4 = dllfuncstr( "FindBookNote4", $$Address);         // 備考4
    $$Note5 = dllfuncstr( "FindBookNote5", $$Address);         // 備考5
    $$Note6 = dllfuncstr( "FindBookNote6", $$Address);         // 備考6
    $$Note7 = dllfuncstr( "FindBookNote7", $$Address);         // 備考7
    $$Note8 = dllfuncstr( "FindBookNote8", $$Address);         // 備考8
   }

   ##FindSpace = strstr($$Name, " ");
   if( ##FindSpace > 0 ) {
    $$LastName = leftstr($$Name, ##FindSpace);           // 名前(名字)
   }else{
    $$LastName = $$Name;
   }

   $$Email1 = dllfuncstr("SetEmailOnly",$$Address);          // アドレスのみ
   $$Email2 = $$Name + " <" + $$Email1 + ">";            // 「名前 <アドレス
>」形式

   if($$ret != "") $$ret = $$ret + $Kugiri;
   // 書式に従い、置換する //
   $$temp = $$format;
   call ChangeString $$temp, "[name]",     $$Name;     $$temp = $$return;
   call ChangeString $$temp, "[lastname]", $$LastName; $$temp = $$return;
   call ChangeString $$temp, "[note1]",    $$Note1;    $$temp = $$return;
   call ChangeString $$temp, "[note2]",    $$Note2;    $$temp = $$return;
   call ChangeString $$temp, "[note3]",    $$Note3;    $$temp = $$return;
   call ChangeString $$temp, "[note4]",    $$Note4;    $$temp = $$return;
   call ChangeString $$temp, "[note5]",    $$Note5;    $$temp = $$return;
   call ChangeString $$temp, "[note6]",    $$Note6;    $$temp = $$return;
   call ChangeString $$temp, "[note7]",    $$Note7;    $$temp = $$return;
   call ChangeString $$temp, "[note8]",    $$Note8;    $$temp = $$return;
   call ChangeString $$temp, "[email1]",   $$Email1;   $$temp = $$return;
   call ChangeString $$temp, "[email2]",   $$Email2;   $$temp = $$return;

   if( ##HeaderCount == 0 && ##ListCount == 0 ){
    $$temp = $$format_f + $$temp;
   } else {
    if( $Kugiri == "\n" || rightstr($$ret, strlen($Kugiri)) != $Kugiri ){
     $$temp = $$format_f_sp + $$temp;
    }
   }

   $$ret = $$ret + $$temp;

   ##ListCount = ##ListCount + 1;
  }
  ##HeaderCount = ##HeaderCount + 1;
 }
 moveto ##format_x1, ##format_y1;       // 書式が記入されていた行から文字列
を書き入れる
 insertfix $$ret;
return;

// 文字列の置換 //
ChangeString:
 // $$1 指定文字列
 // $$2 検索文字列
 // $$3 置換文字列
 ##n = strstr( $$1, $$2 );
 if( ##n != -1 ){
  $$ret_left  = leftstr( $$1, ##n );
  $$ret_mid   = $$3;
  $$ret_right = rightstr( $$1, strlen( $$1 ) - strlen( $$ret_left ) - strlen
( $$2 ) );
  $$ret = $$ret_left + $$ret_mid + $$ret_right;
 } else {
  $$ret = $$1;
 }
return $$ret;

// 繰り返し回数分の文字列を返す //
ReptStr:
 // $$1 文字列
 // ##2 繰り返し回数
 $$ret = "";
 ##loop = 0;
 while ( ##loop < ##2 ){
  $$ret = $$ret + $$1;       // 先頭文字数分の空白
  ##loop = ##loop + 1;
 }
return $$ret;


---以下の内容はコミュニテックス会議室システムにより付加されました。
本文中のメールアドレスは伏せ字に変換されました。伏せ字にしたくない場合
はメールアドレスを""で囲んで書き込んでください。

[ ]
RE:42542 マクロを使用すると、検索条件がNo.42543
Iranoan さん 12/04/17 16:25
 
 どら焼きさん今日は、一ユーザの Iranoan です。
> さて、そのマクロを実行後、「検索して一覧作成」を実行すると
> 検索ウィンドウの「大文字/小文字の区別」と「正規表現」が、
> チェックオフから自動的にチェックオン状態になってしまいます。
 検索して一覧作成のダイアログボックスの場合は、秀まるおさんの
>     $search = searchbuffer;
>     #opt = searchoption;
>     execmacro "a.mac";
>     setsearch $search, #opt;

//------------------------------------------------------------
    loaddll "tkinfo.dll";
    $search = dllfuncstr( "GetFindPack" );
    execmacro "a.mac";
    #n = dllfunc( "SetFindPack", $search );
    freedll;
//------------------------------------------------------------
とすべきかと思います。

[ ]
RE:42543 マクロを使用すると、検索条件がNo.42544
秀まるお2 さん 12/04/17 16:51
 
 追加ですみません。

 GetFindPack/SetFindPackと、setsearchの両方をやったら完全かと思います。
さらに、エディタ・ウィンドウ上で実行するためにはExecAtMainも必要かと思い
ます。

 総合すると、

    loaddll "tkinfo.dll";
    $search = searchbuffer;
    #opt = searchoption;
    $pack = dllfuncstr("ExecAtMain", "GetFindPack" );
    execmacro "a.mac";
    setsearch $search, #opt;
    #n = dllfunc( "ExecAtMain", "SetFindPack", $pack );

 みたいなマクロでどうでしょうか。

 それか、元のマクロを直すとしたら、

 searchdown $$searchstr + ".+$", regular;
 ##n = result;

 としている所を、例えば

 $$searchsave = searchbuffer;
 ##optsave = searchoption;
 $$packsave = dllfuncstr("ExecAtMain", "GetFindPack" );
 searchdown $$searchstr + ".+$", regular;
 ##n = result;
 setsearch $$searchsave, ##optsave;
 #n = dllfunc( "ExecAtMain", "SetFindPack", $$packsave );

 のように書き換えるか。それでうまくいくんじゃないかと思います。

[ ]
RE:42544 マクロを使用すると、検索条件がNo.42545
どら焼き さん 12/04/17 17:24
 
秀まるおさん、Iranoanさん

アドバイスありがとうございます。
元のマクロを直す方法で試して、うまくいくことを確認しました。

厚かましくてすいませんが、これからもお世話になることが
出てくると思いますので、その際はよろしくお願い致します。

[ ]