既に開いているファイルで、
-Y= 指定で現在のキャレット位置だと、範囲外の場合のみの修正です。
-Y= と -X= 指定で、フリーカーソルの範囲になるのは、そのままです。
現在のキャレット位置は使わない変更です。
data[6223] コマンドライン -Y=num <バグ> フリーカーソル以外で
▽ 2007/8/17 (金) 13:54:14 山茶花
コマンドラインパラメータの -Y=num にバグがあります。
環境はサクラエディタ Ver. 1.5.17.0 (V 1310) on Windows 98/ME です。
行の長さが違うファイル file1.txt があって、桁の短い行が
4行目にあり、長い行が3行目あったとします。まずサクラエ
ディタをフリーカーソルでないように設定し、このファイルを
開き、4行目の改行以降に当たる3行目の桁位置へカーソルを
移動します。そして、
> sakura -Y=4 file1.txt
とすると、フリーカーソルでないのにカーソルが改行の次の位
置へきてしまいます。この状態で Backspace を押すと改行が
削除され行が連結ほか、Del を押すと次の行の先頭へ移動しま
す。
ファイルが開いている状態で
> sakura -Y=4 -X=500 file1.txt
と桁位置を越えてもこうなりますが、ファイルが開いていない
状態ではこうなりません。
2007-07-08CNormalProcess_cpp.txt
改行の真ん中にカーソルが来ないように
Logged In: YES
user_id=1480046
Originator: NO
この問題については、
CNormalProcess.cpp(246)
CEditDoc.cpp(734)
にある「改行の真ん中にカーソルが来ないように」と同じ処理を
CEditWndのMYWM_SETCARETPOSにも入れるのが
良いかな~、と思ったのですがどうでしょう。
(パッチを作ってみたのでUploadしておきます)
File Added: FixMoveCursorEOL1.patch
Logged In: YES
user_id=1480046
Originator: NO
>にある「改行の真ん中にカーソルが来ないように」と同じ処理を
もとのCNormalProcess.cpp(246)、CEditDoc.cpp(734)の処理
自体にもバグがあるようで、そこを通る時に誤って桁位置が左に
ずれることがあります(悲)。
どうやらレイアウト行/改行単位行の扱いが間違っているみたい。
追加修正
Logged In: YES
user_id=1480046
Originator: NO
修正の追加版です。
→FixMoveCursorEOL2.patch
開ファイル時に関連するカーソル位置修正です。
1.開いた状態のファイルを更にコマンドライン-Y指定で
開くとカーソルが改行の真中に来ることがある
(data[6223]の件)
2.履歴(カーソル位置の復元)で開いたときにカーソル
位置が左にずれることがある
3.コマンドラインから-X指定で開くとカーソル位置が左に
ずれることがある
4.外部で変更されたファイルを開き直したり、別の文字
コードを指定して開き直すとカーソルが不適切な位置
になることがある
5.CEditView::MoveCursorSelecting()でnCaretMarginRate
引数が使われていない
【2、3の再現方法】
折り返し桁数を20にして、
123456789012345678901234567890
ABC
という内容のファイルを開く。
(1行目は折り返される)
カーソルを1行目の末尾(改行コードの手前)に移動し、
「閉じて(無題)」で閉じる。
履歴からファイルを開くと1文字左にずれている。
そのまま、「閉じて(無題)」、履歴からファイルを開く
操作を繰り返すと、次々に左にずれていく。
上のファイルを、閉じた状態からコマンドライン指定
-Y=1 -X=25
で開いてみると桁位置が25でなく24で開かれる。
似たような処理が複数個所にあるので、まとめて
関数化するのが良い気もしますが、
選択したまま移動のパターンなどとの絡みもあって
ちょっとややこしくなりそうなので今回はパスです。
File Added: FixMoveCursorEOL2.patch
Logged In: YES
user_id=1480046
Originator: NO
開き直しの場合(「4.外部で...」の場合)について、
折り返し行インデントへの考慮が欠けていたので、
更に修正しました。
File Added: FixMoveCursorEOL2_1.patch
「開き直す」の行頭インデント処理追加
2_1への微修正
Logged In: YES
user_id=1480046
Originator: NO
FixMoveCursorEOL2_2です。
2_1の修正にちょっとミスがありました。
File Added: FixMoveCursorEOL2_2.patch
再読み込み時カーソル移動関数共通化
Logged In: YES
user_id=1480046
Originator: NO
CEditView::MoveCursorToPoint()の主要部分を関数化し、
再読み込み時のカーソル移動もその関数を使うようにしてみました。
→FixMoveCursorEOL2_3.patch
よく見ると2_2でもEOF直前カーソルの考慮が抜けていましたね。
2_3では実績のある処理を流用しているので、
自前で書くより信頼性が高そうです。
File Added: FixMoveCursorEOL2_3.patch
Logged In: YES
user_id=86076
Originator: NO
元々の問題(1)に対応する修正はCEditView.cppのMYWM_SETCARETPOSのカーソル位置調整だけで,残りの修正は2-5の問題に相当するという理解でOKですか?
(2)と(3)が2つあるGetLineInfoへ渡す桁位置の誤り,
(4)がReopenの処理ですよね.
報告されている(1)については動作確認しました.
Logged In: YES
user_id=86076
Originator: NO
(2)についても旧バージョンでの再現と,修正されていることの確認ができました.
Logged In: YES
user_id=1480046
Originator: NO
>元々の問題(1)に対応する修正はCEditView.cppのMYWM_SETCARETPOSのカーソル位置調整だけで,残りの修正は2-5の問題に相当するという理解でOKですか?
はい。その理解でOKです。
Logged In: YES
user_id=86076
Originator: NO
(4)を確認しました.以前のバージョンは読み直しで桁が少なくなると
フリーカーソルのような挙動になってしまいますね.
ただ,画面の表示位置復元の効果をまだうまく再現できていません.
(その後のマウス移動でも動いてしまう)
(5)はRev.998を確認したところ,私が入れ忘れていたようです.
テスト用ファイル
Logged In: YES
user_id=86076
Originator: NO
(3)も確認しました.
これで1-5まで再現と修正確認ができたので,commit OKです.
テストファイルを添付しておきます.
File Added: test1.txt
Logged In: YES
user_id=1480046
Originator: NO
commitしました。(rev:1118)