1 件の投稿を表示中 (合計 33 個)
  • 作成者
    投稿
  • #31432
    Applek
    参加者

    前に遅らせていただいた以下の件はまだ直ってないようなので再度質問させていただきます。

    document.selection.Find(“ゝ.{0,1000}?ゞ”,eeFindNext | eeFindReplaceRegExp | eeFindSelectAll,eeExFindRegexOnigmo);//置換の検索範囲を指定
    batch_list = editor.filters;
    batch_list.AddReplace(“”,””,eeFindReplaceRegExp | eeFindReplaceCase,0);//ここに置換候補
    batch_list.AddReplace(“”,””,eeFindReplaceRegExp | eeFindReplaceCase,0);
    batch_list.AddReplace(“”,””,eeFindReplaceRegExp | eeFindReplaceCase,0);
    document.selection.BatchReplace(batch_list,eeFindReplaceSelOnly | eeReplaceAll,0);//選択範囲のみ→選択した範囲しか置換しない。

    document.selection.Collapse();//選択範囲のブルー反転を解除 これ以降は選択範囲は関係なくなるはず→これが利いてない。

    こちらのコードは選択した範囲を解除するはずですがマクロでこのコードを入れた後でもそれ以前に選択されていた範囲が有効になっています。
    これだと選択を解除するというコードの意味を完全になしていませんがこれは正常な動きだったのでしょうか?
    たしか色の見かけ上は選択範囲からは外れています。

    対策としては
    document.selection.SetActivePoint(eePosLogical, 1, 6);//ブルー反転を解除させる
    これを入れてはじめて解除されます。

    このようにどこか画面をクリックした扱いにすれば完全に選択範囲が解除されますが、この方法だといちいち問題を認識してる人しか解除できないことになります。
    わざとこの動作にしているとしたらdocument.selection.Collapse();だけで完全に範囲が解除されない理由は何でしょうか?

    #31434
    Yutaka Emura
    キーマスター

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

    大変お手数ですが、問題が再現できる範囲で、サンプルをできるだけシンプルにしていただき、サンプル ファイルの例も付けて、再掲示していただけないでしょうか?

    なお、複数選択した後に、

    
    document.selection.Collapse();
    

    を実行しただけでは、特に問題は再現できませんでした。

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

    #31441
    Applek
    参加者

    回答ありがとうございます。
    サーバにマクロとサンプル文を送らせて頂きました。
    もしかしたら書き方が悪いのかと思って以下のようにもしましたが同じく全部の範囲が選択されたままになります。
    document.selection.Find(“ゝ[^ゝゞ]{1,1000}?ゞ”,eeFindNext | eeFindReplaceRegExp | eeFindSelectAll,eeExFindRegexOnigmo);// 置換の検索範囲を指定

    後ろのすべての文字が選択された状態になっています。
    document.selection.Collapse();は利かないです。

    後ろの対象文字まで置換されます。
    よろしくお願いいたします。

    #31443
    Yutaka Emura
    キーマスター

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

    確かに受け取りました。

    document.selection.Collapse();

    の後に、

    Quit();

    と書いて、実行したところ、選択はすべて解除されていました。つまり、問題は再現できませんでした。そのようになりませんか?

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

    #31444
    Applek
    参加者

    回答ありがとうございます。

    document.selection.SetActivePoint(eePosLogical, 1, 6);//ブルー反転を解除させる。
    これの代わりにQuitでやってみましたら、そこの部分でマクロが止まった結果になりました。
    これだとそれ以降のマクロが動作しないまま途中で終わってしまいますためこの方法は使えませんでした。

    サンプルコードではその部分が再現するかだけのことしか書きませんでしたので動作したように見えるかもしれませんが実際のマクロではそれ以降にも長くマクロの処理は続きます。
    そのため途中で動作が止まってしまっては困ります。
    この問題はどう解決できますでしょうか?

    #31447
    Applek
    参加者

    お世話になり、ありがとうございます。
    Quit();をつけないと選択が解除されないということであればdocument.selection.Collapse();このコードの意味は何なのでしょうか?
    二つの組み合わせをしないと解除されないということが一般の人に分かるはずがないと思います。

    私自身解除されないで後ろにも影響が出るので散々色んな方法を試してどこかに画面にポインターをクリックしたことにするという方法で解除ができることをやっと見つけました。
    私自身はこの方法で解除できることで解決していますが、ほとんどの人がこんな方法に気が付くとは思えず「このEmEditorというソフトではできないんだ」と思うだけだと思います。

    document.selection.Collapse();これ単独で解除させない理由が何かあるのでしょうか?
    Quit();を付けたらちゃんと動作しましたという回答は逆に言うとdocument.selection.Collapse();で単独では解除できないことを認めておられるようにも思うのですが、それなのに修正されない理由がわからないです。
    私の勘違いの可能性もありますのでそうでしたら恐縮です。

    #31449
    Yutaka Emura
    キーマスター

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

    Quit(); を付けるというのは、あくまでも、テストのためです。そこでマクロを中止させて、 document.selection.Collapse(); で本当に選択が解除されているかどうかを確認するためです。実際のマクロには、もちろん、Quit() を付ける必要はありません。Quit() でマクロを中止させ、本当に選択が解除されているかを確認していただけますか?

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

    #31451
    Applek
    参加者

    回答ありがとうございます。
    解除されているというのはあくまでも見かけ上の表示として解除されているだけです。
    実際には影響はまだ残っていますからその後の置換で指定した範囲以外のところにも影響します。
    サンプルではこれが確認できるように送ったつもりですがどのように見えたのでしょうか?
    後ろの範囲も違う文字になっているはずです。ご確認していただけますでしょうか。
    document.selection.Collapse();は見かけ上の色がなくなるというだけです。
    なお毎度の質問で共通することなので毎度書きませんが、私は詳しくないので恐縮ですが勘違いである可能性もあります。
    メールで画像を送ります。

    #31453
    Applek
    参加者

    サンプルの作り方を間違えてたかも知れません。
    document.selection.SetActivePoint(eePosLogical, 1, 6);//ブルー反転を解除させる
    これを付けても同じ結果でした。
    確認します。

    #31454
    Applek
    参加者

    実践で直っているかどうかしばらく確認してみます。
    前はdocument.selection.SetActivePoint(eePosLogical, 1, 6);//ブルー反転を解除させる
    このコードを付けることで解決したのは事実です。

    #31464
    Yutaka Emura
    キーマスター

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

    お送りいただいたマクロ ファイルの最終行は、

    document.selection.BatchReplace(batch_list, eeReplaceAll,eeExFindRegexOnigmo);

    となっていましたが、これだと文書全体に対して置換を行うため、期待した通りの動作ということになります。もし、選択範囲のみで置換を行いたい場合には、

    document.selection.BatchReplace(batch_list,eeFindReplaceSelOnly | eeReplaceAll,eeExFindRegexOnigmo);

    というように、 eeFindReplaceSelOnly フラグを追加指定する必要があります。

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

    #31466
    Applek
    参加者

    回答ありがとうございます。
    サンプルに関しては書き方が間違っていたと思います。
    実践ではちゃんと範囲だけ置換出来てます。
    最近のバージョンではdocument.selection.Collapse();だけにしてやってもうまく切り替わっている感じで再現するか様子を見ている感じです。

    #31469
    Applek
    参加者

    最新の23.10で問題が再現しましたので勘違いではなかったようです。
    document.selection.Collapse();これだけでは解除されていないです。

    document.selection.SetActivePoint(eePosLogical, 1, 6);//ブルー反転を解除させる
    しばらくこのコードをコメントアウトにしてやっていたら不具合が起きてました。
    これを付けないと他の所がおかしく変換されました。
    コメントアウトを消すと直りました。

    どうやら同じ行にあると影響が残る感じです。これは送ったサンプルとは再現の仕組みが違いました。

    #31470
    Applek
    参加者

    何かしらの複数の要因が絡んで起きている可能性がありますので再現パターンがどのようなときに起きるかを確認してみます。
    単純に書いたサンプルでは再現しないのかもしれません。

    #31471
    Applek
    参加者

    まだどの法則で発生するかは特定できませんが、常にいつでもどの箇所にも起きているのではないようです。
    document.selection.Collapse();だけでは何かしら条件が重なって選択が外れないことが起きる不具合があるようです。
    document.selection.SetActivePoint(eePosLogical, 1, 6);これを組み合わせて動作させることで完全に選択範囲は解放されるようですので、document.selection.Collapse();だけで組み合わせて動くように改良してもらえれば防げます。

    #31473
    Yutaka Emura
    キーマスター

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

    状況、原因がわかりました。

    document.selection.Collapse();

    の後、選択範囲は解除されます。それは確認いたしました。問題は、その後、

    document.selection.BatchReplace(batch_list,eeFindReplaceSelOnly | eeReplaceAll,eeExFindRegexOnigmo);

    というように選択範囲のみの置換を行うということ自体、使い方が間違っていることです。選択範囲が無いのに、選択範囲のみの置換を行うことはできません。本来ですと、ここでエラーが発生してマクロの動作が停止するはずですが、エラーにならずにマクロが継続してしまったことが原因であり不具合でした。これについては次に公開するバージョンで、マクロを停止するよう修正いたします。

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

    #31474
    Applek
    参加者

    回答ありがとうございます。
    私はdocument.selection.BatchReplace(batch_list,eeFindReplaceSelOnly | eeReplaceAll,eeExFindRegexOnigmo);このコードは使っていないです。
    そのため今回の不具合のパターンとは因果関係が違います。

    以下が実際に不具合が起きているマクロです
    よろしくお願いいたします。

    document.selection.Find(“∈[^∈∋]{0,15000}?∋”,eeFindNext | eeFindReplaceRegExp | eeFindSelectAll,eeExFindRegexOnigmo);// 置換の検索範囲を指定
    batch_list = editor.filters;
    batch_list.AddReplace(“”,””,eeFindReplaceRegExp | eeFindReplaceCase,0);
    document.selection.BatchReplace(batch_list,eeFindReplaceSelOnly | eeReplaceAll,0);
    document.selection.Collapse();// 選択範囲のブルー反転を解除させる
    // document.selection.SetActivePoint(eePosLogical, 1, 6);// ブルー反転を解除させる
    以下は
    batch_list = editor.filters;
    batch_list.AddReplace(“”,””,eeFindReplaceRegExp | eeFindReplaceCase,0);
    document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);

    そのためdocument.selection.BatchReplace(batch_list,eeFindReplaceSelOnly | eeReplaceAll,eeExFindRegexOnigmo);これは使っていないです。

    #31475
    Applek
    参加者

    しばらくテストしているのですが前後の文字数などによって起きたり起きなかったりする結果が変わります。
    そのためサンプルマクロで簡単に書いて再現させるということが難しいです。
    何かしらの組み合わせの原因で選択範囲が完全に解除されないままマクロが進行する現象が時々起きるようです。

    いずれにしてもdocument.selection.SetActivePoint(eePosLogical, 1, 6);このコードと組み合わせて動かせば完全に意図通りの動作をしており、何億字でも不具合は出ていません。

    #31476
    Yutaka Emura
    キーマスター

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

    最終行が、

    document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);

    だとすると、選択範囲があるかどうかは関係せず、文書全体に対して置換を行うことになります。

    私の読解力が弱くご質問の意味がよくわからなくて申し訳ないのですが、何がどのように問題なのか、できるだけシンプルなサンプルとコードを示していただき、期待する動作と実際の動作の両方を示していただけますでしょうか?

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

    #31481
    Applek
    参加者

    回答ありがとうございます。
    私の使い方は特定範囲の置換と全般の置換を交合にしてます。

    document.selection.BatchReplace(batch_list,eeFindReplaceSelOnly | eeReplaceAll,0);これで特定の範囲のみ置換して
    document.selection.Collapse();// 選択範囲のブルー反転を解除させる
    これで特定範囲の置換終わり
    次に全般の普通の置換をしてます。
    batch_list = editor.filters;
    batch_list.AddReplace(“”,””,eeFindReplaceRegExp | eeFindReplaceCase,0);
    document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);これは全般に置換するときに使っているコードです。

    不具合のパターンを検証します。

    #31482
    Applek
    参加者

    ためしにこれはコメントアウトして// document.selection.Collapse();

    こっちだけ単独でやると全然解除されてませんでした。 document.selection.SetActivePoint(eePosLogical, 1, 6);//

    なぜか法則は不明ですが組み合わせて二つ続けないと解除されない場合がまれにあります。
    ただ、99%以上の箇所ではdocument.selection.Collapse();これだけでマニュアルどおりに正常に解除されています。

    #31483
    snow
    参加者

    横から失礼します。
    もしかしたら、マクロオプションの「既定でマクロを非同期に実行する」のチェックを外すと期待どおり動くのではないかと思いました。
    このオプション自体、元々私が「なぜかうまく動かない」系の質問をさせていただいたのが大元で、生まれたものと記憶しています。

    #31484
    Applek
    参加者

    ご回答ありがとうございます。
    今回の事例が発生するパターンで試しましたら、結果は同じでした。
    同期、非同期、どちらの設定でも起きるようです。
    御厚意、感謝しております。

    #31485
    Applek
    参加者

    お世話になり、ありがとうございます。
    原因が特定できました。
    この現象はまったく普通に使われるような文字では起きないようです。
    再現マクロはこれらの文字を故意に前後に入れてやると解除されないことが発生するはずです。
    前後に入れて試してみてください。
    すべての制御文字かどうかはわかりません。
    制御文字など表示が正しく行われない□で表示される文字などが前後にあるときにも発生する現象のようですが□で表示される文字すべてではありません。

    少しずつ文字を削っていって現象が発生する時と発生しない時を比較していたら制御文字などある特定の文字を消したところからは発生しないということがわかりました。
    現象が起きるのは制御文字だけでなく不正な文字も含まれますが、全ての文字種類は特定出来ていません。

    これらを取り除いて置換してみると通常の思惑どうりの範囲指定のみの置換結果になります。
    私がやっていますように画面をクリックすると言う動作を組み合わせることによって今回のような場合も完全に範囲が解除されますのでその方法で修正してください。
    document.selection.Collapse();
    document.selection.SetActivePoint(eePosLogical, 1, 1);//画面をクリック
    EmEditorの変更で仕様をこのふたつを組み合わせて動作させるようにしてください。

    #31486
    Applek
    参加者

    前後の話がおかしくなりました。これらの文字とは一部の制御文字や不正文字の一部です。

1 件の投稿を表示中 (合計 33 個)
  • このトピックに返信するにはログインしてください。