Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

折り返しされた際、文字数カウントが合わない #1233

Closed
KENCHjp opened this issue Apr 21, 2020 · 10 comments
Closed

折り返しされた際、文字数カウントが合わない #1233

KENCHjp opened this issue Apr 21, 2020 · 10 comments
Labels
🐛bug🦋 ■バグ修正(Something isn't working) 💩degradation🧻🚽 デグレ (前に動いていた機能が動かなくなった) IMPORTANT 早急に解消すべきもの

Comments

@KENCHjp
Copy link
Member

KENCHjp commented Apr 21, 2020

問題内容

100文字の日本語を入力した際、全選択でのステータスバーの文字数カウントが
折り返しなし: 100 chars
30桁で折り返し: 95 chars
となってしまいます。

再現手順

日本語改行無し文字列100文字にて折り返し無しで選択と、30桁設定後折り返しありにして、文字列選択。

再現頻度

OSDNより取り急ぎ転載(すいません、私の方で今未検証)
v2.3.2では未発生を確認済。

問題のカテゴリ

  • プログラムの動作上の問題
    • 正式リリース版

環境情報

  • サクラエディタバージョン
    v2.4.0

スクリーンショット

@KENCHjp
Copy link
Member Author

KENCHjp commented Apr 21, 2020

再現しました。

キャプチャ

@KENCHjp KENCHjp added the 🐛bug🦋 ■バグ修正(Something isn't working) label Apr 21, 2020
@ds14050
Copy link
Contributor

ds14050 commented Apr 21, 2020

複数行に折り返されたレイアウト行のうち、先頭と末尾のレイアウト行を除いた中間のレイアウト行数分だけカウントが少ないようです。

GetLengthWithoutEOL() を GetLengthWithEOL() - 1 に置換した影響かと>354033d#diff-8038a8583a5548b60ab7e451ea17113e

レイアウト行は改行文字で終端しないことがありますから、無条件に -1 すれば実際より目減りします。

@berryzplus
Copy link
Contributor

GetLengthWithoutEOL() を GetLengthWithEOL() - 1 に置換した影響かと

お見事、それ多分正解。
201桁選択中で、6個の行末が含まれている。
文字はすべて全角だから95字であってそう。

さて、どう直したものか。

@ds14050
Copy link
Contributor

ds14050 commented Apr 21, 2020

LenWithEOL にすると CRLF が⒈文字になります(非互換)。元の通り LenWithoutEOL + EOLLen なら CRLF は2文字です。

@berryzplus
Copy link
Contributor

PRを辿ってみました。
#993 責任者ぼくですね...orz

元ネタは高速化のために色々変えてるわけですが、方向性がおかしかったかというとそうでもないと思っています。GetLineStrが効率悪い感じなのはきっとそうなわけで。

どうしたらいいか。

思い付く感じでは、選択の始点(行・桁)と選択の終点(行・桁)を物理位置(行・オフセット)に変換して、一連のUNICODE文字列を取得してから一括でバイトシーケンスに変換してバイト数を求めたら速いんじゃないかな、とか。

@KENCHjp
Copy link
Member Author

KENCHjp commented Apr 21, 2020

ま、PRは、みんなでレビューしてるので共同責任ってことで、どうするかに集中しましょ(笑)
そのためのチームやしw

対処療法、選択範囲(行)の中に画面橋折り返し改行が何個あるか数えて足す。。。ああダメな直し方の予感w

内部実装わかってないのでどうすれば早いかには全然貢献できそうにないですが、
改行文字のカウントとかもあるので慎重にって感じですね。

@berryzplus
Copy link
Contributor

自分で書いといてスルーしてましたが、変なトコもう1つありました。

201桁選択中で、6個の行末が含まれている。
文字はすべて全角だから95字であってそう。

全角100文字を選択してるのに 201桁 とは、これ如何に。

桁=半角1個分を1とする幅の単位。全角は2桁になる。

全角100文字を桁数に換算した場合の期待値は200桁なので、ここもおかしいっす。

@ds14050
Copy link
Contributor

ds14050 commented Apr 22, 2020

文字数カウントの話ですからキャレット位置は無関係です。

100文字選択しているのに「95 chars」。消えた5文字は全7レイアウト行のうち先頭と末尾の2レイアウト行を除いた5レイアウト行から、改行文字(※存在しない)の分として無条件に引かれた -1 × 5 です。

@beru
Copy link
Contributor

beru commented Apr 22, 2020

お、これ自分が入れてしまった不具合ですね。直さないと…。

@beru
Copy link
Contributor

beru commented May 7, 2020

#1241 が merge されて問題が解消したと思うので close します。

@beru beru closed this as completed May 7, 2020
@beru beru added the 💩degradation🧻🚽 デグレ (前に動いていた機能が動かなくなった) label Mar 21, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🐛bug🦋 ■バグ修正(Something isn't working) 💩degradation🧻🚽 デグレ (前に動いていた機能が動かなくなった) IMPORTANT 早急に解消すべきもの
Projects
None yet
Development

No branches or pull requests

4 participants