マクロでファイル間コピーNo.38702
NISKBSSS さん 21/02/09 15:00
 
こんにちは。
こちらで良かったでしょうか。

秀丸エディタのマクロを使用して下記機能を実現したいと思っています。
ヒントをいただけると幸いです。

【目的】
 ファイルAの内容の一部をファイルBにコピーする
【説明】
 ・ファイルA=既存のログファイル
 ・ファイルB=マクロにて新規作成するファイル
 ・ログファイルを開いた状態でマクロを実行する。

【不明点】
 ・ログファイル上でコピーした内容を
  新ファイルへペーストする方法がわかりません。
  "copy"、"paste"を実行する時の対象ファイルの指定は
  どのように行うのでしょうか?

【環境】
 秀丸エディタv8.96 統合版32bit
 Windows10 Pro 64bit

よろしくお願いします。

[ ]
RE:38702 マクロでファイル間コピーNo.38703
おすぎ さん 21/02/09 15:12
 
NISKBSSS さん
こんにちは。

ユーザーのおすぎです。

ログファイルを開いた状態で
次のマクロを実行したらいかがでしょ?

selectall;
copy;
newfile;
paste;


こんな感じでどうでしょ?

[ ]
RE:38702 マクロでファイル間コピーNo.38704
グズラ さん 21/02/09 16:51
 
秀丸ユーザーのグズラです。

> ファイルAの内容の一部をファイルBにコピーする

おそらくこの操作を何度も繰り返したいのではないかと思います。
つまりマクロにて、
ファイルAの内容の一部をコピー
  ↓
ファイルBにペースト
  ↓
ファイルAの内容の一部をコピー
  ↓
ファイルBにペースト
  :

これをやりたいのではないでしょうか?(外してたらすみません)

hidemaruhandle と setactivehidemaru を使うと実現できます。

#myhandle = hidemaruhandle(0);      // 現在の秀丸のハンドルを取得
newfile;                            // 新規作成(アクティブな秀丸も切り替わる)
#newhandle = hidemaruhandle(0);     // 新規秀丸のハンドルを取得
setactivehidemaru(#newhandle);      // マクロの実行を新規秀丸に切り替える

参考になれば幸いです。

[ ]
RE:38703 マクロでファイル間コピーNo.38705
NISKBSSS さん 21/02/09 16:54
 
おすぎ様
ありがとうございます。

言葉足らずで申し訳ありません。
次のような流れとしたいと思っています。

(1)ログファイル内をキーワードを検索します。
(2)キーワードを含む行をコピー(カット)します。
(3)新ファイルへペーストします。
(4)(1)に戻ります。
 ログファイル内にキーワードがなくなるまで実行します。

イメージ的には↓のような感じで考えています。

  openfile "";  //  ファイル作成
  while( true )
  {
    // ログファイルを検索
    searchdown "keyword-A" , hilight;
    if( !result )
    {
      break;
    }
    escape;
    golinetop;
    cutline  0;    //  行カット
    escape;      //  範囲選択解除

    //  ここで新ファイルへペースト

  }


よろしくお願いします。

[ ]
RE:38704 マクロでファイル間コピーNo.38706
グズラ さん 21/02/09 16:55
 
>#myhandle = hidemaruhandle(0);      // 現在の秀丸のハンドルを取得
>newfile;                            // 新規作成(アクティブな秀丸も切り替わ
>る)
>#newhandle = hidemaruhandle(0);     // 新規秀丸のハンドルを取得
>setactivehidemaru(#newhandle);      // マクロの実行を新規秀丸に切り替える

すいません。最後の1行を訂正します。

誤:setactivehidemaru(#newhandle);      // マクロの実行を新規秀丸に切り替える
正:setactivehidemaru(#myhandle );      // マクロの実行を元の秀丸に切り替える

[ ]
RE:38706 マクロでファイル間コピーNo.38707
NISKBSSS さん 21/02/09 17:00
 
クズラ様

私の希望する答えと思います。
ありがとうございました。



質問にわかりにくいところがあり
申し訳ありませんでした。

[ ]
RE:38702 マクロでファイル間コピーNo.38722
NISKBSSS さん 21/02/12 13:55
 
こんにちは

皆様のサポートにより機能実現はかないましたが
ひとつ気になることがあります。


newfileを実行後に変数#StartTimeの中身が0にクリアされているようです。
恐らく秀丸を切りかえるときにクリアされるのかなと思いましたが
いかがでしょうか?

#StartTimeにはマクロのはじめの方でtickcountを保持させています。
 #StartTime = tickcount;

変数の中身を保持するにはどのような方法があるでしょうか。
クリップボードを利用することも考えましたが
クリップボードをマクロで使用している
今回のケースでは難しく思えました。



もう一点教えていただけますか。
このフォーラムの過去ログから効率よく
検索する方法はありますか?

何度も申し訳ありませんが
よろしくお願いします。

[ ]
RE:38722 マクロでファイル間コピーNo.38724
秀丸担当 さん 21/02/12 15:07
 

変数は、newfileやsetactivehidemaruで実行対象の秀丸エディタが変わっても、マク
ロ実行中である限りは維持し続けます。

マクロの実行が終わって、もう一度マクロを実行する場合は、全てゼロになります。

message str(#StartTime); //A  常に0
#StartTime = tickcount;
message str(#StartTime); //B
newfile;
message str(#StartTime); //C  Bと同じ
endmacro;

もしCの時点でゼロになっているとしたら、変数名が違うのかもしれません。
大文字小文字の区別があるので注意が必要です。
(例外的にsetcompatiblemode 0x08000000;で変数を維持しないモードもありますが、
その場合はnewfile;の時点でエラーになります)

マクロの実行を終えても保持するためには、setstaticvariableで記憶させ、getstat
icvariableで取り出す方法があります。(詳しくはマクロヘルプ参照)

過去ログについては、以下のページから検索が可能です。
https://log.maruo.co.jp/

メールで配信を受け取れるようにしておくと、メールで受信した分は秀丸メールなど
のメールソフトで検索する方法もあります。
フォーラムのトップページの上部の「設定」から、メール転送の設定をすることがで
きます。
https://www.maruo.co.jp/hidesoft/

[ ]
RE:38724 マクロでファイル間コピーNo.38725
NISKBSSS さん 21/02/12 15:23
 
秀丸担当様

ご返事ありがとうございます。
教えていただいたようにnewfileを行っても
#StartTimeの値が保持されていることを確認できました。

私は#StartTimeを文字列に変換する時にdllfuncstr関数を使用しています。
この関数を使用すると値が0になってしまいます。

下記コードの"1 - xxx"はOKですが"2 - xxx"では値が0になってしまいます。
もう少しご教示いただけますか。

よろしくお願いします。

-----ここから-----
 setfloatmode 1;    // 浮動小数点数モード, 浮動小数点対応版の秀丸エディタが必要
 loaddll "hidemath.dll";
 if( !result ) {
     message "hidemath.dllのロードに失敗しました。";
     endmacro;
 }
 #StartTime = tickcount;  // 開始カウントの取得

 message str(#StartTime);
 $strStartTime = dllfuncstr( "Format", "%lf", #StartTime ); // 文字列に変換
 message "1 - " + $strStartTime;

 #myhandle = hidemaruhandle(0);  // 現在の秀丸のハンドルを取得
 newfile;       // 新規作成(アクティブな秀丸も切り替わる)

 message str(#StartTime);

 #newhandle = hidemaruhandle(0);  // 新規秀丸のハンドルを取得
 setactivehidemaru(#myhandle);  // 秀丸ファイルの切替

 message str(#StartTime);
 $strStartTime = dllfuncstr( "Format", "%lf", #StartTime ); // 文字列に変換
 message "2 - " + $strStartTime;
-----ここまで-----

[ ]
RE:38725 マクロでファイル間コピーNo.38726
NISKBSSS さん 21/02/12 15:41
 
秀丸担当様

いろいろ試行していてもう一つ気がついたことがあります。
なお、setcompatiblemodeは0x2000Fとしています。

試行したコード抜粋とメッセージ結果です。
BはAと同じ結果のはずですが
小数点以下が切り捨てられてしまいます。


-----ここから結果-----
A - 23454.89
A' - 23454.890000
B - 23454
C - 23454
C' - 0.000000
-----ここまで結果-----

-----ここからコード-----
 #StartTime = tickcount / 1000;
 message "A - " + str(#StartTime);
 $strStartTime = dllfuncstr( "Format", "%lf", #StartTime );
 message "A' - " + $strStartTime;

 #myhandle = hidemaruhandle(0);
 newfile;
 message "B - " + str(#StartTime);

 #newhandle = hidemaruhandle(0);
 setactivehidemaru(#myhandle);

 message "C - " + str(#StartTime);
 $strStartTime = dllfuncstr( "Format", "%lf", #StartTime );
 message "C' - " + $strStartTime;
-----ここまでコード-----

よろしくお願いします。

[ ]
RE:38726 マクロでファイル間コピーNo.38727
秀丸担当 さん 21/02/12 16:16
 

詳しい情報ありがとうございます。
確かに言われている通りになり、おかしいように感じました。

調べてみたところ、setfloatmode 1;は、newfileやsetactivehidemaru等でマクロの
実行対象が切り替わるたびにリセットされていました。
newfileやsetactivehidemaru等の直後に、setfloatmode 1;をすると問題を回避でき
ました。

その都度やらなくてもできるようになるべきだと思います。
今後のバージョンで修正を検討させていただきます。
互換性が心配なこともあり、setfloatmodeで2を指定できるようにするとか、慎重に
検討しようと思います。

[ ]
RE:38727 マクロでファイル間コピーNo.38729
NISKBSSS さん 21/02/12 17:36
 
秀丸担当様

ご確認ありがとうございました。
setfloatmodeを追加することで期待する動作となりました。
ありがとうございました。



対応版についてもお手数をおかけいたしますが
よろしくお願いします。

[ ]