Skip to content

DoGrep() 引数の構造体化対応 - #2634

Merged
berryzplus merged 1 commit into
sakura-editor:masterfrom
hpmy-dev:feature/grep-dogrep-args
Sep 4, 2026
Merged

DoGrep() 引数の構造体化対応#2634
berryzplus merged 1 commit into
sakura-editor:masterfrom
hpmy-dev:feature/grep-dogrep-args

Conversation

@hpmy-dev

@hpmy-dev hpmy-dev commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

PR #2631 の続きで、CGrepAgent::DoGrep() の 20 個の引数を構造体渡しに変更してます。

変更内容

  • DoGrep()DWORD DoGrep( CEditView* pcViewDst, const GrepInfo& gi ) の 2 引数にしました。
  • DoGrep() 冒頭の「Grepオプションまとめ」18 行を SGrepOption::FromGrepInfo() に切り出しました。
  • ダイアログの設定から GrepInfo を作る CDlgGrep::MakeGrepInfo() / CDlgGrepReplace::MakeGrepInfo() を追加しました。
  • 呼び出し元 3 箇所(CNormalProcess::InitializeProcess()Command_GREP()Command_GREP_REPLACE())を書き換えました。

呼び出し側への影響

Command_GREP() は実引数を組み立てるための cmWork1cmWork4 が不要になったので削除しました。Command_GREP_REPLACE() の同名変数は else 側でコマンドライン文字列を作るのに使っているため残しています。

従来ダイアログ経路が固定値で渡していた bGrepCurFolder = false / bGrepStdout = false / bGrepHeader = trueMakeGrepInfo() の中で同じ値を設定しています。

テスト

tests1 は 1,363 件 / 0 failed(#2631 の 1,357 件 +6)、SonarQube の New Code カバレッジは 87.3%、重複 0.0% です。

意図的にやっていないこと

確認したいこと

CDlgGrepMakeGrepInfo() を足した形でよいでしょうか。

呼び出し側で GrepInfo を組み立てるとそこは単体テストから叩けず、New Code カバレッジが 46.6% でした。ダイアログ側に寄せると直接構築してテストでき 87.3% になっています。CDlgGrep::GetData() まわりの整理でまとめて扱うべきであれば、本 PR からは外して呼び出し側に戻します。

@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown

Test Results

1 363 tests  +6   1 363 ✅ +6   7m 15s ⏱️ -13s
  124 suites +2       0 💤 ±0 
    1 files   ±0       0 ❌ ±0 

Results for commit 227fbaa. ± Comparison against base commit 80132bc.

@sonarqubecloud

sonarqubecloud Bot commented Sep 2, 2026

Copy link
Copy Markdown

@berryzplus

Copy link
Copy Markdown
Contributor

自分も何度かやろうとして何度か断念してるやつです。

データの集約先はGrepInfoでよいと思います。

コマンドラインからGrepInfoを作ってCDlgGrepに渡す
 ↓
CDlgGrepから取り出したGrepInfoをCGrepAgentに渡す
 ↓
CGrepAgent内部は GrepInfo を使い回す

本当はたぶん、以下が理想形。(現状は無理。)
class CDlgGrep : public CDialog, public GrepInfo

コマンドラインから取り込んだ引用符の二重化を解除する目的で CNativeW を使っているけど、CNativeWとダイアログ入力の文字数制限の相性があまりよくない。

それはそれとして、内容的に問題はなさそうなのでそのうちマージする感じだと思います。
(現状、チラ見しかできてないです。)

@hpmy-dev

hpmy-dev commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

ご確認ありがとうございます。
Grep メッセージ整形の分離など対応を進めようと思います。

@berryzplus berryzplus left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

対応ありがとうございます。

gi.bGrepPaste,
gi.bGrepBackup
);
this->m_pcEditApp->m_pcGrepAgent->DoGrep( &pEditWnd->GetActiveView(), gi );

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

後回しでいいですが、DoGrepの既存パラメーターは以下のような分類だったと思ってます。

  • Grepダイアログ・コマンドライン共通のパラメーター
  • コマンドライン用のパラメーター(bGrepStdoutとbGrepHeader)
  • Grep置換ダイアログのパラメーター(bGrepPasteとbGrepBackup)
  • 不要なパラメーター (CEditViewのポインタ)

※「アクティブな編集ビュー」はプロセス内に1つしか存在できない「シングルトン的なオブジェクト」なので、指定しなくても呼ばれた側で取得できます。むしろ「左右分割したビューの右側だけに結果表示」とかできないので指定させることがおかしい気もします。(この件は「全体的に」なので「超あとまわし」でよいはず。)

「渡したパラメーターが見える」ほうが分かりやすいよね、で
GrepInfo への集約とは別枠で「あえて外出しにするパラメーター」があってもいい気がします。

細かいことは「今後」でいいのかな、と。

@return 出力・置換の挙動を決めるオプション
@note Grep置換では「一致しなかった行を出力」が成立しないため、行単位出力に落とす。
*/
SGrepOption SGrepOption::FromGrepInfo( const GrepInfo& gi )

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

現状 既に CDlgGrepReplace inherits CDlgGrep です。

今後 CDlgGrep inherits GrepInfo にできたらいいな、と思っています。

GrepInfo inherits SGrepOption にするかどうかは悩みドコロ。

結局、CGrepAgent::DoGrep の実行に必要なパラメーターが揃っていることを担保する責任は誰にあるのか、揃ってなかったらUI表示して入力要求するのがスジなんじゃないか、みたいな厄介なことを色々思ってます。

// (正規表現が途中で途切れると困るので)
// 2011.12.10 Moca 表示の際に...に切り捨てられるので登録するように
wcsncpy_s( CAppMode::getInstance()->m_szGrepKey, int(std::size(CAppMode::getInstance()->m_szGrepKey)), pcmGrepKey->GetStringPtr(), _TRUNCATE );
wcsncpy_s( CAppMode::getInstance()->m_szGrepKey, int(std::size(CAppMode::getInstance()->m_szGrepKey)), gi.cmGrepKey.GetStringPtr(), _TRUNCATE );

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

_TRUNCATEってことはさ。

入り切らなかったらブッタ斬ります。

ってことなのよね。(いいんだっけ。)

(ただのポエム。)

@berryzplus
berryzplus merged commit 63afc73 into sakura-editor:master Sep 4, 2026
17 checks passed
@hpmy-dev

hpmy-dev commented Sep 5, 2026

Copy link
Copy Markdown
Contributor Author

マージいただきありがとうございました。
CDlgGrep inherits GrepInfo にできたらいいな、と思っています。 について
#2636 をあげましたので、ご確認いただければと思います。

_TRUNCATE はm_szGrepKey は StaticString<MAX_GREP_PATH> なので
512 wchar です。参照箇所は 4 つあって、

  • タイトルバー(CEditDoc.cpp)… LimitStringLengthW で 64 文字に切って "..." を付ける
  • マクロの $ 展開(CSakuraEnvironment.cpp)… 32 文字に切る
  • タブ名(CFileNameManager.cpp)… GREPKEY_LIMIT_LEN で切る
  • EditInfo::m_szGrepKey[1024] へのコピー(512→1024 なので安全)

いずれも表示専用で、実際の検索は gi.cmGrepKey を使っています。512 文字を超えて
切り捨てられても検索結果は変わらず、表示側もどのみち 64 文字・32 文字に切っているので、
実害が出る経路は無さそうでした。

@hpmy-dev
hpmy-dev deleted the feature/grep-dogrep-args branch September 5, 2026 00:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants