1 件の投稿を表示中 (合計 24 個)
  • 作成者
    投稿
  • #32169
    Applek
    Participant

    お世話になっております。
    メールで質問しましたようにWindows11 24H2になったことでマクロのサイズ制限が厳しくなりました。
    とはいってもマクロのサイズが大きい原因は実質的には置換のための同じ文字の行が大量に繰り返されているだけです。

    この行が何万行もあるからです。
    batch_list.AddReplace(“”,””,eeFindReplaceRegExp | eeFindReplaceCase,0);

    これを
    batch_list.AddReplace(“→∈
    “,”→∮
    “,eeFindReplaceRegExp | eeFindReplaceCase,0);→∋

    このように3文字に置き換えればマクロのサイズは5分の1以下に出来るのですが可能でしょうか?

    たとえば
    batch_list.AddReplace(“タロウ”,”太郎”,eeFindReplaceRegExp | eeFindReplaceCase,0);

    この場合は以下のように書けばマクロサイズは小さく済みます。
    ∈タロウ∮太郎∋

    このようにすることは可能でしょうか?
    一括置換は正規表現のところをあとから修正に向いていないのと短い文字を優先する問題があるので代用できないです。
    よろしくお願いいたします。

    #32170
    Applek
    Participant

    この掲示板の編集は投稿後、他の人が書き込むまでか数時間は出来るようにして頂きたいです。
    ぶっきらぼうな書き方になってしまいました。

    メールで質問しましたようにWindows11→メールで質問させていただました件です。Windows11 

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

    #32171
    Applek
    Participant

    batch_list.AddReplace(“”,””,eeFindReplaceRegExp | eeFindReplaceCase,0);
    これは71文字なので実質的に20分の1くらいのサイズになったマクロに出来るはずです。

    #32172
    snow
    Participant

    こんにちは。
    以前も同様の回答をした記憶がありますが、JavaScriptの文法内で短縮するのではだめなんでしょうか?
    例えば

    batch_list=~
    function F(a,b){
        batch_list.AddReplace(a,b,eeFindReplaceRegExp | eeFindReplaceCase,0);
    }
    F(“タロウ”,”太郎”);
    F(“ハナコ”,”花子”);
    ~
    #32177
    Applek
    Participant

    ありがとうございます。
    再度省略せずに書いて頂けませんでしょうか?
    記載が省略されているのでうまく書けず動きませんでした。

    以下の連続置換のパターンです。
    batch_list.AddReplace(“タロウ”,”太郎”,eeFindReplaceRegExp | eeFindReplaceCase,0);
    これを
    ∈タロウ∮太郎∋
    これにする方法です。よろしくお願いいたします。

    
    batch_list = editor.filters;
    batch_list.AddReplace("タロウ","太郎",eeFindReplaceRegExp | eeFindReplaceCase,0);
    // このパターンが数万続く
    document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);
    #32181
    Applek
    Participant

    このような同じ命令文は一括で書けることを説明したEmEditorマニュアルページを教えていただけますと幸いです。

    #32183
    snow
    Participant

    失礼しました。読み解けるものと思っていました。
    エディタではなくJavaScriptの話になりますので、それはご自身で勉強されてはどうでしょうか。

    batch_list=editor.filters;
    function F(a,b){
      batch_list.AddReplace(a,b,eeFindReplaceRegExp|eeFindReplaceCase,0);
    }
    F("タロウ","太郎");
    F("ハナコ","花子");
    document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);
    

    あるいはこのような形も考えられるでしょうか。この形であればfunctionを別ファイルに追い出して#includeするという手もあるでしょうか(複数のマクロから呼ぶかどうか、ご質問からでは判りませんが)。

    function F(){
      batch_list=editor.filters;
      for(a=arguments,i=0;i<a.length;i+=2)
        batch_list.AddReplace(a[i],a[i+1],eeFindReplaceRegExp|eeFindReplaceCase,0);
      return batch_list;
    }
    batch_list=F(
      "タロウ","太郎",
      "ハナコ","花子"
    );
    document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);
    
    #32184
    snow
    Participant

    以下余談になります。
    プログラマが短い記述を好むかどうかはそれぞれですが、短くするにしても、意味が読み取れる記述であることが前提です。
    そのため、

    ∈タロウ∮太郎∋
    

    このように記述できる仕様を、プログラマは考えません。
    「EmEditorのマクロファイルを生成するツール(マクロ)」を作るしかないでしょう。

    #32186
    Applek
    Participant

    ご回答ありがとうございます。御厚意、感謝しております。
    この方法でいずれも単純な行数では動作はしましたが以下の問題で私のやりたいことが出来る代替にはなりませんでした。

    行が多いと
    Maximum call stack size exceeded
    このようなエラーが出ました。

    それから
    for( i = 0; i < 20; ++i )
    このようなコードがあると組み合わせて使えないようです。
    以前の方法では動作していたのでなんとかなりませんでしょうか?
    このままですとEmEditorでできることに大幅な制限が出来ます。

    Geminiの回答では以下のように出ました。
    「Maximum call stack size exceeded」は、プログラミングにおいて、関数の呼び出しが深くなりすぎた場合に発生するエラーです。

    スタックとは

    プログラムが関数を呼び出すとき、その関数の実行に必要な情報(引数、ローカル変数、戻り先アドレスなど)が「スタック」と呼ばれるメモリ領域に一時的に保存されます。関数が終了すると、スタックから情報が取り除かれ、呼び出し元の関数に戻ります。

    エラーの原因

    このエラーが発生する主な原因は、以下の2つです。

    再帰呼び出しの無限ループ: 関数が自分自身を呼び出す「再帰呼び出し」において、終了条件が正しく設定されていない場合、関数が無限に呼び出され続け、スタックが溢れてしまいます。
    非常に深い関数呼び出し: 再帰呼び出しでなくても、関数が非常に深くネストして呼び出される場合、スタックが溢れることがあります。
    エラーの解決方法

    このエラーを解決するには、以下の方法を試してみてください。

    再帰呼び出しの終了条件を見直す: 再帰呼び出しを使用している場合は、必ず終了条件が正しく設定されているか確認してください。
    再帰呼び出しをループ処理に置き換える: 再帰呼び出しが必須でない場合は、ループ処理に置き換えることで、スタックオーバーフローを回避できる場合があります。
    関数の呼び出し回数を減らす: 関数呼び出しのネストが深すぎる場合は、コードの構造を見直し、関数の呼び出し回数を減らすことを検討してください。
    スタックサイズを増やす: 環境によっては、スタックサイズを増やすことでエラーを回避できる場合がありますが、根本的な解決にはなりません。

    以下は、再帰呼び出しの無限ループによって「Maximum call stack size exceeded」が発生する例です。

    copy
    def recursive_function():
    recursive_function()

    recursive_function()
    この例では、recursive_function関数が自分自身を無限に呼び出し続けるため、スタックが溢れてエラーが発生します。

    まとめ

    「Maximum call stack size exceeded」エラーは、関数の呼び出しが深くなりすぎた場合に発生するエラーです。再帰呼び出しの無限ループや、非常に深い関数呼び出しが主な原因です。エラーを解決するには、再帰呼び出しの終了条件を見直したり、ループ処理に置き換えたり、関数の呼び出し回数を減らすなどの対策が必要です。

    #32187
    Applek
    Participant

    以下の代替方法は可能でしょうか?
    今回の24H2の改定は一回当たりに読み込ませて動作させる一回当たりの量に制限が出たというだけなので2回、次のマクロのボタンを押したことにすれば何工程でも行けます。
    一回当たりの動作範囲のマクロの範囲を指定して、そのマクロ群が終わったら次のマクロを動作させるという新機能です。
    これだと分割するだけのため24H2の制限は掛かりません。
    よろしくお願いいたします。

    #32188
    Yutaka Emura
    Keymaster

    いつもお世話になっております。江村です。

    snow様の方法をお試しいただいてもマクロのサイズが大きすぎて動作しない場合は、検索や置換に使用するデータが大きすぎる可能性があります。そのため、データとコードを別のファイルに分けて保存することをお勧めします。

    EmEditorの連続置換機能では、リンクファイルを使用することができます。詳しくはこちらのビデオをご覧ください:

    https://youtu.be/Rl6lS5YTu60?si=nbCrdgZOuus3Yong

    このビデオのような操作をマクロに記録すると、次のようなマクロが記録されます:

    
    batch_list = editor.filters;
    batch_list.AddReplace("(パス)\\replace_list.txt", "", eeFindReplaceCase | eeFindReplaceRegExp, eeExFindLinkFile);
    document.selection.BatchReplace(batch_list, eeReplaceAll, 0);
    

    replace_list.txt には、検索文字列と置換後の文字列をタブで区切って1行ずつ記載します。例えば、

    
    タロウ <tab> 太郎
    ハナコ <tab> 花子
    

    このように記述して保存してください。ファイルは、UTF-16 (BOM付き) または UTF-8 (BOM付きまたはBOM無し) で保存してください。

    snow様、ご協力いただき誠にありがとうございます。

    今後ともどうぞよろしくお願いいたします。

    #32190
    Applek
    Participant

    ありがとうございます。リンクだと連続置換が爆速化したように感じます。
    リンクの方法でWindows11 24H2でも以前のように大量の候補でも動作するようになりました。
    リンクは一括置換だけかと思い込んでいました。

    やってみて連続置換なのに以前よりもリンクにすると猛烈に連続置換が速くなったように思います。
    リンクファイルにすると連続置換も通常より速くなるのでしょうか?
    これは多くの人は気がついていないと思います。
    よろしくお願いいたします。

    #32192
    Applek
    Participant

    いろいろ試して分かりましたのはこのリンクファイルにして連続置換するのは大量のリストとかには向いてますが複雑な正規表現の置換が絡み合ったタイプには向いてないようです。
    全部この方法にすれば爆速マクロになるのではないかと試しましたがリンクにすると正規表現の記載にエラーがあると多発してまともに動作しませんでした。

    この方法は単純なリストが何万行もあるとかのような方法には使えますが一般の正規表現マクロでは正規表現の記載方法の統一がされていないので使い回しが出来ない問題があります。
    この問題は解決しますでしょうか?
    よろしくお願いいたします。

    #32193
    Yutaka Emura
    Keymaster

    お世話になっております。江村です。

    正規表現の記載にエラーがあると多発してまともに動作しませんでした。

    正規表現の記載方法の統一がされていないので

    ご質問の内容が少し分かりづらいのですが、もしかするとバックスラッシュを2重にするかどうかの違いが原因ではないでしょうか? マクロではバックスラッシュを2重に記述する必要がありますが、リンクファイルでは2重に記述してはいけません。ご確認いただけますでしょうか。

    もし他の意味でご質問されている場合は、もう少し詳しく説明していただけると助かります。

    どうぞよろしくお願いいたします。

    #32195
    Applek
    Participant

    回答ありがとうございます。
    まさに動作エラーはバックスラッシュの問題でした。
    普通の記載に戻すとマクロは動作しました。

    別の問題が発生しています。
    //
    このマークの後ろのコメントで無効化しているはずのコードにまで反応してマクロが止まります。
    そのためコメントになっているコードはすべて消さなければ動作しませんでした。
    コメントを消すと普通に動きはしますが、これだと今後の保守性は極めて悪化するのでこの問題は解決しますでしょうか?
    // から始まる後ろは一切反応してもらっては困ります。
    /* */この範囲の無効化の記載も全部駄目になります。

    コメントで無効化も違うのでしょうか?

    最終的にどれくらい速くなったか報告します。
    よろしくお願いいたします。

    #32196
    Applek
    Participant

    タブで区切るやり方ですが空白文字なのでやりにくいです。何か見える文字が代替できたほうがいいです。
    よろしくお願いいたします。

    #32197
    Yutaka Emura
    Keymaster

    いつもお世話になっております。江村です。

    //
    このマークの後ろのコメントで無効化しているはずのコードにまで反応してマクロが止まります。
    そのためコメントになっているコードはすべて消さなければ動作しませんでした。
    コメントを消すと普通に動きはしますが、これだと今後の保守性は極めて悪化するのでこの問題は解決しますでしょうか?
    // から始まる後ろは一切反応してもらっては困ります。

    タブで区切って最後の列にコメントを記入することは可能です。例えば、次のようになります。

    
    タロウ <tab> 太郎 <tab> // TEST 1
    ハナコ <tab> 花子 <tab> // TEST 2
    

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

    #32198
    Yutaka Emura
    Keymaster

    いつもお世話になっております。江村です。

    タブで区切るやり方ですが空白文字なのでやりにくいです。何か見える文字が代替できたほうがいいです。

    タブ区切りの CSV になりますので、[CSV] メニューの [タブ区切り] を選択すると、整列して表示されます。

    また、EmEditorの[表示]メニューから[記号]を選び、[半角空白]と[タブ]を選択すると、スペースとタブに記号を付けて表示することもできます。

    どうぞよろしくお願いいたします。

    #32199
    Applek
    Participant

    ありがとうございます。アドバイスいただいた方法でコメント含めて動作しました。
    速度を測ったところ1割くらいは速くなる可能性はありそうですが期待するほど変わりませんでした。
    複雑な正規表現マクロではあまり劇的な速度効果はなさそうです。

    ●リンクファイルにしないままタブ形式で表記は可能でしょうか?
    それ以外の記述の度にリンクしないと行けないので保守性としては別々のファイルになってめんどくさいです。

    ●お気に入りに追加機能の不具合は御願いできますでしょうか?
    よろしくお願いいたします。

    #32200
    Applek
    Participant

    リンクファイル形式はファイルサイズが少なく済むのでメリットも大きいですが以下のように途中で別の処理が必要になった場合はそのたびに途切れます。
    再度作らなければなりません。

    document.selection.Find("∈[^∋]{0,15000}?∋",eeFindNext | eeFindReplaceRegExp | eeFindSelectAll,eeExFindRegexOnigmo);// 置換の検索範囲を指定

    そのためひとつのファイルで全部記述しているのに比べて一括編集が出来なくなります。
    最終的に完成品で今後保守する必要がない場合は最後に作れば良いだけですがそれ以外では実質的に出来ないです。
    他のデメリットが多いからです。

    そのため両方のやり方の良いところ取りが出来るように改良してもらいたいです。
    よろしくお願いいたします。

    #32201
    Yutaka Emura
    Keymaster

    いつもお世話になっております。江村です。

    リンクファイルにしないままタブ形式で表記は可能でしょうか?

    コードとデータを別々のファイルにする必要があります。

    お気に入りに追加機能の不具合は御願いできますでしょうか?

    質問の意図が少しわかりにくいのですが、もしかして「マイ マクロ」に含まれていないマクロファイルをドラッグ&ドロップしようとしていませんか?「マイ マクロ」に含まれていないファイルは、たとえ拡張子が .jsee であっても基本ツールバーにはドロップできません。また、同じファイル名でもファイルのパスが異なる場合は「マイ マクロ」に含まれていないとみなされますので、ご確認ください。

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

    #32202
    Applek
    Participant

    回答ありがとうございます。
    リンクの仕組みは理解しました。

    お気に入りの機能ですがマイマクロに含まれています。拡張子も.jseeです。
    そのため同じマクロでも何度かやると登録されることがありますが反応が非常に悪いです。
    そのため繰り返して登録されるかどうかですのでドラッグ&ドロップで登録できるとはほとんどの人は気がつかないと思います。
    よろしくお願いいたします。

    #32203
    Yutaka Emura
    Keymaster

    いつもお世話になっております。江村です。

    そのため同じマクロでも何度かやると登録されることがありますが反応が非常に悪いです。
    そのため繰り返して登録されるかどうかですのでドラッグ&ドロップで登録できるとはほとんどの人は気がつかないと思います。

    ご質問の意味がよくわからないので、サンプルも付けて、できるだけ詳しく、わかりやすく説明してください。

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

    #32204
    Applek
    Participant

    ありがとうございます。
    タイトルは「マクロのサイズを小さくする方法」ではなく「マクロをリンクファイル形式で高速化する方法 Windows11 24H2の問題対応」に変更をお願いいたします。
    不具合については動画で撮って送らせていただきます。

    上記のリンクの方法はスレ記事を見た人のために書いておきます。

    これは変換候補のファイルがマクロと同一のフォルダにある前提です。
    拡張子を.jseeにしているのは、コメントに色が付いて見やすくなると言うだけの理由です。

    batch_list = editor.filters;
    batch_list.AddReplace(ScriptFullName.substr( 0, ScriptFullName.lastIndexOf( "\\" ) + 1 ) + "変換候補.txt.jsee", "", eeFindReplaceCase | eeFindReplaceRegExp, eeExFindLinkFile);
    document.selection.BatchReplace(batch_list, eeReplaceAll, 0);
1 件の投稿を表示中 (合計 24 個)
  • このトピックに返信するにはログインしてください。