Sakura: .txt のカーソル位置がアウトラインのツリー位置に反映されない

Created on 10 Jun 2019  ·  10Comments  ·  Source: sakura-editor/sakura

問題内容

C ソースで F11 でアウトライン解析をすると,現在のカーソル位置に合わせてアウトライン側のツリー項目が選択されます.
しかし .txt のアウトライン解析ではツリー側に反映されないようです.そういう仕様なのかと思ったのですが,以下のコードもあるので,何かがうまく動いていない気がします.
https://github.com/sakura-editor/sakura/blob/fd461c3b63197c48c244ad74ef50fca04737e176/sakura_core/outline/CDlgFuncList.cpp#L1618-L1623

再現手順

無題
図のような txt で ●c の位置で F11 を押すと,アウトライン解析の方は ●a が選択されています.

再現頻度

100%

問題のカテゴリ

  • プログラムの動作上の問題

環境情報

  • OS バージョン

    • WIn10 Pro 64bit


  • サクラエディタバージョン
サクラエディタ   v2.4.0.1993 32bit dev
(GitHash fd461c3b63197c48c244ad74ef50fca04737e176)
(GitURL https://github.com/sakura-editor/sakura.git)

      Compile Info: V1916 WPR WIN601/I800/C000/N601
      Last Modified: 2019/6/8 11:43:32
🐛bug🦋 💩degradation🧻🚽

Most helpful comment

デグレっすかね。。。

みたいです。おそらく pull #780 「バッファが空の状態で CNativeW::Clear を呼び出したときに落ちる不具合修正」の副作用です。

https://github.com/sakura-editor/sakura/blob/fd461c3b63197c48c244ad74ef50fca04737e176/sakura_core/outline/CDlgFuncList.cpp#L1546 において pcFuncInfo->m_cmemFileName.GetStringPtr() が NULL でない値を返すことで、無条件に true が代入されていた bFileSelect に文字列比較の結果が代入されるようになっています。bFileSelect が hItemSelected に影響し、@yoshinrt さんが最初に指摘したように https://github.com/sakura-editor/sakura/blob/fd461c3b63197c48c244ad74ef50fca04737e176/sakura_core/outline/CDlgFuncList.cpp#L1618-L1623 のコードに影響しています。

CMemory は基礎的なクラスなので他にも NULL と "" の違いに頼っていた、結果として振るまいが変わっているコードがあるかもしれません。

追記 "" は長さ1の文字配列ですから NULL と並べるには不適切な対象でした。改めます。「NULL と "" の違いに頼っていた」というのは、NULL と長さ0の配列(=デリファレンスできないが有効なポインタ)を同一視していなかった、という意味です。長さ0の配列は古い C には存在しない概念なのである意味それはできていなくて当然のことですが、CMemory についてはポインタが NULL かどうかではなく長さが0かどうかを調べなければいけないということです。(CMemory は ANSI 版の昔も今も NULL でないときは余分のヌル末端を保証しているようなので追記部分は当てはまりません。削除します。何度か認識を改めた結果最初に戻ってしまいました)

All 10 comments

もう一度 F11 を押してみるとどうですか?

試したところでは、ドッキングしている場合は最初の F11 ではフォーカスが移動するだけみたいです。

手元で試した限り,(ドッキング有り / 無し) でアウトライン表示がない状態から始めて,

  • F11 を 1回→アウトライン選択がずれる
  • この状態で F11 もう一回→変わらず

でした.
.c だとどれもずれませんでした.

v2.4.0.1993 64bit DEBUG dev Alpha Version で再現しました。2.3.2.0 では再現せず。

図のような txt で

というのもポイントだったんですね。無題ドキュメントに「テキスト」タイプを一時適用していたので再現できていませんでした。

@yoshinrt さん、 @ds14050 さん、報告検証ありがとございいます。
デグレっすかね。。。
https://github.com/sakura-editor/management-forum/issues/72

デグレっすかね。。。

みたいです。おそらく pull #780 「バッファが空の状態で CNativeW::Clear を呼び出したときに落ちる不具合修正」の副作用です。

https://github.com/sakura-editor/sakura/blob/fd461c3b63197c48c244ad74ef50fca04737e176/sakura_core/outline/CDlgFuncList.cpp#L1546 において pcFuncInfo->m_cmemFileName.GetStringPtr() が NULL でない値を返すことで、無条件に true が代入されていた bFileSelect に文字列比較の結果が代入されるようになっています。bFileSelect が hItemSelected に影響し、@yoshinrt さんが最初に指摘したように https://github.com/sakura-editor/sakura/blob/fd461c3b63197c48c244ad74ef50fca04737e176/sakura_core/outline/CDlgFuncList.cpp#L1618-L1623 のコードに影響しています。

CMemory は基礎的なクラスなので他にも NULL と "" の違いに頼っていた、結果として振るまいが変わっているコードがあるかもしれません。

追記 "" は長さ1の文字配列ですから NULL と並べるには不適切な対象でした。改めます。「NULL と "" の違いに頼っていた」というのは、NULL と長さ0の配列(=デリファレンスできないが有効なポインタ)を同一視していなかった、という意味です。長さ0の配列は古い C には存在しない概念なのである意味それはできていなくて当然のことですが、CMemory についてはポインタが NULL かどうかではなく長さが0かどうかを調べなければいけないということです。(CMemory は ANSI 版の昔も今も NULL でないときは余分のヌル末端を保証しているようなので追記部分は当てはまりません。削除します。何度か認識を改めた結果最初に戻ってしまいました)

#949 を投げました。

949 をマージしました。

修正されているはずです

デグレ解消を確認できたら閉じられるのかな?(↓PR適用済み成果物のリンク)
https://ci.appveyor.com/project/sakuraeditor/sakura/branch/master/job/lilfv5y7lud0m9vg/artifacts

ds14050 さん、協力ありがとう。

手元で試した限り,(ドッキング有り / 無し) でアウトライン表示がない状態から始めて,

  • F11 を 1回→アウトライン選択がずれる
  • この状態で F11 もう一回→変わらず

が改善されていることが確認できました.ありがとうございました.

確認ありがとうございます。
閉じます。
degradation というラベルを付けました。

Was this page helpful?
0 / 5 - 0 ratings