【不具合】矩形選択の貼り付け

  1. ks です.
    矩形選択で不具合らしきものがあったので報告します.

    矩形選択⇒コピー⇒全選択⇒貼り付け
    で,2 行目以降の先頭の文字が抜けます.
    さらにそこから全選択して貼り付けると,今後は改行が抜けます.
    全選択がないと正常に動作します.

    以上,ご確認願います.

    # 初めは DLL 作成中だったから変にメモリいじったのかと焦りました
    # 焦りましたが……他の方でも再現しますよね?(汗

     |  ks  |  返信
  2. ks です.
    矩形選択でないですが,もう 1 件不具合報告をば.

    置換ダイアログで

    検索:.*
    置換後:
    正規表現:オン

    を実行したとき,最終行が置換されません.
    強調表示はされているのでマッチはしているようですが.

    ご確認願います.

     |  ks  |  返信
  3. ご報告ありがとうございます。

    > 矩形選択⇒コピー⇒全選択⇒貼り付け

    確認いたしました。
    矩形選択の後の貼り付けが怪しいですね。
    変な改行文字が含まれたり、しかもその改行文字を消そうと
    DEL キーを押すとフリーズしたり・・・。

    次バージョンでは修正しておきます。

    # 初めは DLL 作成中だったから変にメモリいじったのかと焦りました
    # 焦りましたが……他の方でも再現しますよね?(汗

    ほんと、変にメモリいじったときに似てる動きでした^^;
    矩形難しいなぁ・・・。

    > 置換ダイアログで

    確認いたしました。
    これはエディタエンジンの仕様(不具合?)のようですね。
    真魚(onig.dll版)でも発生するので

    調査してみましたところ意図的にされているようなコーディングに
    なっているのですが、そこを外してみたら治ったんですけど・・・。謎。

    いいのかしら。

     |  Kuro  |  返信
  4. > 矩形選択⇒コピー⇒全選択⇒貼り付け

    確認すると,Mery2 正式版の最初の ver だと発生しないんですね.
    あまり詳しくは追えていませんが.

    > ほんと、変にメモリいじったときに似てる動きでした^^;

    現象から原因が想像つかないので,PG ミスよりはメモリ破壊疑いたくなりますね.

    > これはエディタエンジンの仕様(不具合?)のようですね。
    > 真魚(onig.dll版)でも発生するので

    > 調査してみましたところ意図的にされているようなコーディングに
    > なっているのですが、そこを外してみたら治ったんですけど・・・。謎。

    > いいのかしら。

    良いと思います(無責任)
    ただ最終行だけ外す,というのは理由が思い当たらないですね.
    文字終端超えて置換するとかオーバフローでも起こすバグがあったのかしら?

     |  ks  |  返信
  5. > 確認すると,Mery2 正式版の最初の ver だと発生しないんですね.
    > あまり詳しくは追えていませんが.

    ええ、2.0.16.4257 で矩形選択範囲の置き換えロジックを修正しており、その影響で発生しているようです。一応、修正は完了しました。

    > 良いと思います(無責任)

    私も賛成ですw

    > ただ最終行だけ外す,というのは理由が思い当たらないですね.
    > 文字終端超えて置換するとかオーバフローでも起こすバグがあったのかしら?

    正確に申しますと、最終行を外しているわけではなく、鬼車の API に渡すときに検索範囲の最大長を渡すのですが、それが文書全体の長さ + 1 が渡されるようになっていました。

    当然、鬼車から帰ってくる最終行のマッチングした長さは最終行の長さ + 1 なので、マッチングはしているものの、エディタ的にはマッチング位置とマッチング長さを足すと溢れてしまい、選択範囲にならないという挙動になっています。

    論理的には + 1 しなくても良い気がするのですが、何か意図があってされているのかどうかはもはや動作検証を重ねるしかなさそうですね。正規表現の場合、".*" に限らず様々なパターンが予想されますので、もしかすると何かの正規表現の場合にうまく動かないといった副作用が出る可能性もありますが・・・。

     |  Kuro  |  返信
  6. なかなか納得できないので、もう少しご説明をお願いします。

    > > 置換ダイアログで

    > 確認いたしました。
    > これはエディタエンジンの仕様(不具合?)のようですね。
    > 真魚(onig.dll版)でも発生するので

    これは不具合ですかね?

    最初の記事には、明示されていませんが、

      行末文字の次にあって、行末文字がなくファイル終端になる文字列(行)が、
      「置換」ではなく「すべて置換」で 「.*」の検索に該当しない、

    という動作を指して不具合としていますが、その理由はなんでしょう?

    ファイル終端にも行末文字があれば「すべて置換」の対象になります。
    それでも行末文字の有無を無視することは必要ですか?

    行末文字に続くのではなく、その最後の行内でなら
    .*
    でも「置換」されます。

    いまの挙動は
    .*(?=\n)$
    となっていてエディタの行末文字までの行に対応しているのに、
    (?=\n)
    の判断を除くことになります。

    最後の行には行末文字がない文字列にも一致したければ、
    .*$
    とすれば「すべて置換」でも置換できますが、これは正しくないのですか?

     |  inuuik  |  返信
  7. こんばんは、書き込みありがとうございます。

    > なかなか納得できないので、もう少しご説明をお願いします。

    了解です。私も納得しかねている部分ではありますので、整理させていただきます。

    >   行末文字の次にあって、行末文字がなくファイル終端になる文字列(行)が、
    >   「置換」ではなく「すべて置換」で 「.*」の検索に該当しない、
    > という動作を指して不具合としていますが、その理由はなんでしょう?

    不具合と申してしまったのは語弊がありました、すみません。
    ヒットしないのはヒットしないでこれはこれで正しい動作だと思います。
    不具合という判定は微妙なところではありますが、鬼車では終端文字列を含めてヒットしているのに、エディタ側ではそれを無かったことにしている点が不具合といえば不具合、いえ、不整合、と言った方がよいかもしれません。

    まず、前提条件の整理。
    すべて置換で「.*」が改行文字を含まない最終行にヒットしない、というお話でした。調査してみましたところ、通常の検索でも「.*」は改行文字を含まない最終行にはヒットしませんし、置換でもヒットしません。が、ここはあまり問題とされてませんよね。たぶん・・・。

    > ファイル終端にも行末文字があれば「すべて置換」の対象になります。
    > それでも行末文字の有無を無視することは必要ですか?

    鋭いところですね。
    以前の仕様ですと「.*」で検索文字列に「$」が含まれていない場合、ファイルの終端は「\0」なので「\0」も含めてヒットします。

    aaa
    bbb
    ccc[EOF]

    この場合、最終行は「ccc[EOF]」までがヒットします。
    これはこれで正しいです。

    んで、Mery 側ですが、文書全体の文字列長から溢れた場合はオーバーフロー防止のためヒットしなかったことにする仕様になっています。そもそも終端文字列が選択できてしまうとまずいですから。これもこれで正しいと思います。

    > 最後の行には行末文字がない文字列にも一致したければ、
    > .*$
    > とすれば「すべて置換」でも置換できますが、これは正しくないのですか?

    これは正しいと思います。

    で、今回なぜ終端文字を無視するようにしたかという点ですが、真魚の最新版 (bregonig.dll 版) や某テキストエディタなどでは最終行にもヒットするから。というだけの理由です。

    ・鬼車で終端文字を含んでヒットした場合、エディタ側でそれをヒットさせることはできない。
    ・他のテキストエディタではヒットする

    この 2 点を考慮し、どちらに合わせるかということを考えますと、長いものには巻かれろということで、後者を選択したというわけです。

    inuuik さんのおっしゃることも的確で正しいと思いますので、現在の仕様で問題がある場合は良きアドバイスを頂けると嬉しいです。

     |  Kuro  |  返信
  8. inuuik さん,Kuro さん

    > これは不具合ですかね?

    不具合,というと確かに語弊を招きますね.申し訳ないです.
    本来であれば別のスレッドを立てるべきでしたが,連続で別のスレッドはどうだろうか,
    ということでタイトルに【不具合】を含むスレッドに内容を投稿していました.

    inuuik さん
    > 最初の記事には、明示されていませんが、
    > 行末文字の次にあって、行末文字がなくファイル終端になる文字列(行)が、
    > 「置換」ではなく「すべて置換」で 「.*」の検索に該当しない、
    > という動作を指して不具合としていますが、その理由はなんでしょう?

    Kuro さん
    > 不具合という判定は微妙なところではありますが、鬼車では終端文字列を含めてヒットしているのに、エディタ側ではそれを無かったことにしている点が不具合といえば不具合、いえ、不整合、と言った方がよいかもしれません。

    メモ帳で同様の機能が使えないですから基準となる動作はないですし,
    他の有名どころのエディタで試しても,検索:「.*」で置換後「hoge」として全置換したときの動作はばらばらでした.
    (ただ最終行だけ置換対象とならなかったエディタは少なくとも試した範囲ではありませんでした)
    ただ Mery の場合 ver1 時代からずっとこの動作だったようで(後で確認しました),
    これだけ長い間の実績があれば Mery の動作仕様ともとれますね.

    ただ個人的には,最終行が「^.*」でも「.*$」でも「^.*$」でも置換できるのに,
    最も広範にマッチするはずの「.*」が置換できないのは矛盾に感じました.
    Kuro さんの実装の話をきけばプログラマとして現状の動作に納得はしますが,
    それがユーザの意図に反していないかはまた別の話です.
    この矛盾を「仕様」とするか「不具合」とするかは私では判断しかねるので,
    確認の意図を含んでの報告でした.

    正規表現に関しては素人に毛が生えた程度の私にとって,
    「.*」がマッチしない行があるというのが不具合に見えてしまった,
    ということをご理解いただければ恐縮です.

     |  ks  |  返信
  9. ● ks さん

    > 不具合,というと確かに語弊を招きますね.申し訳ないです.
    > 本来であれば別のスレッドを立てるべきでしたが,連続で別のスレッドはどうだろうか,
    > ということでタイトルに【不具合】を含むスレッドに内容を投稿していました.

    お気になさらず。そしてお気づかいありがとうございます。まったく問題ございません。
    一応今回は私が不具合っぽくね?と思ったので。

    > ただ Mery の場合 ver1 時代からずっとこの動作だったようで(後で確認しました),
    > これだけ長い間の実績があれば Mery の動作仕様ともとれますね.

    一応、真魚のエディタエンジンを使わさせていただいておりますので、この仕様と同じというわけです。ただ、真魚は最新版では 64bit 対応に向けて正規表現ライブラリの onig.dll を捨てて bregonig.dll に変更されていまして、このせいか最新版では最終行もマッチするようになっていました。

    > それがユーザの意図に反していないかはまた別の話です.
    > この矛盾を「仕様」とするか「不具合」とするかは私では判断しかねるので,
    > 確認の意図を含んでの報告でした.

    そうですね。ユーザの意図に反していないかという点はやはり重視すべき点だと思います。ただ、仕様の修正にあたってあいまいな回答をしてしまったのは申し訳ないです。

    > 正規表現に関しては素人に毛が生えた程度の私にとって,
    > 「.*」がマッチしない行があるというのが不具合に見えてしまった,
    > ということをご理解いただければ恐縮です.

    私も正規表現は自信がありません。ただ、ご意見があれば私が勉強させていただく機会になりますので、ありがたい限りです。ああでもない、こうでもない、と意見交換しながら作っていくのって楽しいですからね。

     |  Kuro  |  返信
  10. ありがとうございました。

    これで終わりにします。

     |  inuuik  |  返信
  11. こんばんは、どうも返信が長くなってしまいすみません。

    回答になっていましたでしょうか?
    うまくまとまっていない文章ゆえ、疑問点などございましたらお気軽に聞いてやってくださいませ。

     |  Kuro  |  返信
スポンサーリンク