-
Notifications
You must be signed in to change notification settings - Fork 163
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
除外ファイル・除外フォルダの指定をGrep置換でも使えるようにする #1210
除外ファイル・除外フォルダの指定をGrep置換でも使えるようにする #1210
Conversation
原因: 除外ファイル・フォルダを-GFILEにpackする処理が1箇所でしか行われていない。 対策: 該当のpack処理にCDlgGrepのインスタンス経由でアクセスできるように変更、必要な関数群をアクセスできる位置に移動。
分かりやすさのためにカット&ペーストしていた。 変数を適切な名前に改め、不足していたコメントを追加する。
✅ Build sakura 1.0.2643 completed (commit 50c7a23c92 by @berryzplus) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
動作しない原因が判明しました。 下記がPRブランチをデバッグ実行中に
|
問題の再現方法を忘れてしまったので #743 のコメントを読み直して確認してみましたが、Grep置換の結果出力が別のエディタウィンドウに出力される場合に再現します。別のエディタウィンドウに出力されるようにするのに手っ取り早い方法として、デバッグ起動後に何か適当なファイルを開いた状態からGrep置換を実行すれば良いことが分かりました。 なお、#1210 (review) で報告した問題ですが Grep条件入力画面のファイルの文字列の末尾がセミコロンで終わるように手動で入れる事でも動作する事が分かりました。ただまぁ手動で入れないとちゃんと動作しないようでは不具合なので修正してください。 |
#1210 (review) |
ちゃんと書いていませんでしたが、今回の修正で影響を受けるのは「Grep置換が別ウインドウで実行される場合」です。 細かい起動条件は Command_GREP_REPLACE に書いてありますが、次のいずれかを満たす条件でGrep置換の「置換」ボタンを押したときに発動します。
このパターンで起動したときに除外ファイル・除外フォルダが渡らない、という問題を解決したいPRでした。 新設したメソッドGetFileが何故か SUPER 不評だったのでリネームしました。 これならメソッドのやることを説明できてる気がします。 ここが直っても課題は残ります。 |
✅ Build sakura 1.0.2644 completed (commit e04ffa4480 by @berryzplus) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
CDlgGrep::GetPackedGFileString()
メソッドにおける、コマンドライン用に二重引用符をエスケープする記述について #1210 (comment) で疑問点をコメントしました。
それに対して解説お願いできますか?
ええっと・・・
結論から言うと「エスケープ処理に意味はない」です。 これは元々 二重引用符( GFileに指定した文字列 = 元々の 今回PRの処理位置はコマンドラインを作る処理ではないのでエスケープは不要です。持ってきた関数群全体が「エスケープを行ったあとの文字列を操作する前提」になっているので一度エスケープをかけてから元に戻す感じで「エスケープを元に戻す」の処理を追加しました。 エスケープ自体に何の意味もないことについては今回スルーしています。 |
さて、どうしたものか。 「エスケープに意味はないです。」と説明したうえで、 比較的少ない修正で済む話なので対処を入れてしまうべきか悩み中・・・。 |
理由 ・そもそも不要な処理だった。 ・エスケープ(=引用符付加)によってCGrepEnumKeys::SplitPatternが誤動作していた。 その他 ・エスケープ(=引用符付加)が必要なケースが漏れていたので追加した。 ・エスケープ(=引用符付加)の仕方が誤っていたのを修正した。"#folder", "!file"とする必要があるが、#"folder", !"file"になっていた。 ・代入演算子の前に空白が2個あるのがキモかったので削った。
不要なエスケープ処理を削ってみました。 結果的に3件のバグを修正できました。 受け側(=CGrepAgent::DoGrep)が、 |
✅ Build sakura 1.0.2648 completed (commit d09d43fbe0 by @berryzplus) |
結果的に3件のバグを修正できたっていうのは不要なエスケープ処理を削った事によってでですか? 3件の不具合ってどこかのコメントに列挙されてたかな…。 Issueの説明には難しいことはしていないので誰でもレビュー出来ると書かれているので、他のまともな人ならいちいち質問しないでも完全に理解出来るのかな…。
等をいちいち時間割いて書くべきだとは思わないので、きっと謎は謎のままにしておいた方が後から見る人の脳の体操になるという配慮ですね。 |
ここに 7b93023
問題
Grepを別ウインドウで起動する処理にだけ含まれていた 必要な箇所
改善点
残課題
|
追加の対応によってPR本文で宣言している修正内容と一部ズレているので、後で本文更新します。 |
PR本文修正は終わっているのでレビューお願いします。 |
GetPackedGFileString導入により使わなくなった変数を除去する。(実は対応漏れ。)
2つの解析済み配列からリストを作る処理(2つ)をメソッド化。
cFilePattern.AppendStringF(L"!%s%s%s;", escapeStr, pattern.c_str(), escapeStr); | ||
} | ||
} | ||
|
||
void CControlTray::DoGrepCreateWindow(HINSTANCE hinst, HWND msgParent, CDlgGrep& cDlgGrep) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
別ウインドウを起動してのGrep置換に除外ファイル指定が渡らない不具合(?)を引き起こした元凶は、ここにこの関数が「存在すること」だと思っています。
問題を引き起こした原因には対処しません、と言ってる通り、このPRでここに手を打つのは重い気がするので対処は別の機会にしたいと思っています。
✅ Build sakura 1.0.2653 completed (commit 1259a84fa1 by @berryzplus) |
const auto& fileKeys = m_vecExceptFileKeys; | ||
excludeFiles.insert( excludeFiles.cend(), fileKeys.cbegin(), fileKeys.cend() ); | ||
const auto& absFileKeys = m_vecExceptAbsFileKeys; | ||
excludeFiles.insert( excludeFiles.cend(), absFileKeys.cbegin(), absFileKeys.cend() ); | ||
return excludeFiles; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- 以下のようにするか (個人的には、こちらのほうがわかりやすいと思う)
const auto& fileKeys = m_vecExceptFileKeys;
const auto& absFileKeys = m_vecExceptAbsFileKeys;
excludeFiles.insert( excludeFiles.cend(), fileKeys.cbegin(), fileKeys.cend() );
excludeFiles.insert( excludeFiles.cend(), absFileKeys.cbegin(), absFileKeys.cend() );
- 以下のようにする
const auto& fileKeys = m_vecExceptFileKeys;
excludeFiles.insert( excludeFiles.cend(), fileKeys.cbegin(), fileKeys.cend() );
const auto& absFileKeys = m_vecExceptAbsFileKeys;
excludeFiles.insert( excludeFiles.cend(), absFileKeys.cbegin(), absFileKeys.cend() );
のようにしたほうがいいと思います。
パッと見で、コードを読みにくい。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ここって参照の一時変数をわざわざ使って書く必要性が、ここの記述だけ見てますが自分にはよくわからないです。
まぁ書いた人がこの書き方が良いならそれでも良いんじゃないとも思ったりしますね。見なかったことにすればいいし。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@m-tmatma さん>
1の書き方だと、宣言と利用箇所が離れてしまうのが嫌です。
2と今のコードの差は空行1行に見えました。関数コメント含めてみたらきっと分かる・・・と思うので放置で行きたいです。
ここって参照の一時変数をわざわざ使って書く必要性が、ここの記述だけ見てますが自分にはよくわからないです。
元データの変数名が長いのでエイリアスを切っています。
1行80桁にはこだわりませんが、単に見辛いと感じました。
excludeFiles.insert( excludeFiles.cend(), m_vecExceptFileKeys.cbegin(), m_vecExceptFileKeys.cend() );
excludeFiles.insert( excludeFiles.cend(), m_vecExceptAbsFileKeys.cbegin(), m_vecExceptAbsFileKeys.cend() );
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
その場合は途中で改行を入れれば見やすくなると思いますよ。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
改行は改行で、どこに入れるかで揉める系なんですよね:cry:
excludeFiles.insert( excludeFiles.cend(),
m_vecExceptFileKeys.cbegin(), m_vecExceptFileKeys.cend() );
excludeFiles.insert( excludeFiles.cend(),
m_vecExceptAbsFileKeys.cbegin(), m_vecExceptAbsFileKeys.cend() );
個人的にconst参照でハマったことはないのでエイリアスのまま行きたいです。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
2と今のコードの差は空行1行に見えました。関数コメント含めてみたらきっと分かる・・・と思うので放置で行きたいです。
そうです。
どこからどこまでが処理の区切りかが、ぱっと見たときにわかりずらいです。
現状のコードでもわからないことはないですが、
著者以外の人が見たときに コンマ何秒考えないといけないのですが、
空行を入れることで、まったく考えなくていいです。
@param[in] pattern チェックするパターン | ||
@return true エスケープする必要がある | ||
@return false エスケープする必要がない | ||
@author m-tmatma |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
https://github.com/sakura-editor/sakura/pull/758/files
で私が追加したときと比べて、108 行目 ~ 115 行目の部分が増えているので
author とするのは微妙な気がします。
オリジナルと比べて、変更されているのなら、それがわかるようにしてほしいし、
そもそも論として 別に author はなくてもいいです。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ノリで付けた感じです。なんか追加で修正する件があったらこのPRで削っときます。
{ | ||
return true; | ||
} | ||
if (pattern.find(L'\x20') != NotFound) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
L' '
としていなのは見やすさのためですか?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
その通りです。L' '
だと見落とす危険があると思ったので文字コードで書きました。
「常にこうする」みたいな意図はないっす。
// 除外フォルダの解析済みリストを取得する | ||
auto excludeFolders = cGrepEnumKeys.GetExcludeFolders(); | ||
std::wstring strPatterns = FormatPathList( excludeFolders ); | ||
cmemMessage.AppendString( strPatterns.c_str(), strPatterns.length() ); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
細かいですが、念のため確認
cmemMessage.AppendString( strPatterns.c_str(), strPatterns.length() );
は
cmemMessage.AppendString( strPatterns.c_str() );
とも書けると思いますが、内部で wcslen
する処理を省くため?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
そうです。std::wstring
は内部に計算済みの有効文字列長を持っているのでそれを活用しました。第2引数を省略したらダメか?っていうとそうでもないと思っています。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
cmemMessage の型を std::wstring に変えた方が良いのかもしれないですね。
このPRでやるべき事ではないと思いますが。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
全体的な構成を見た感じだと、WriteLine(const wchar_t* szLine, size_t cchCount)
的なメソッドを作るんじゃないかなと思っています。
cmemMessageに溜め込んだ出力データは最終的にCGrepAgent::AddTailに渡っていて、出力先は「Grepモードのエディタ or コンソール」になります。現状は「溜め込んだ文字列がN文字以上になったらフラッシュ」ってイメージで実装されとりますが、出力が「行単位」と分かっているのだからバッファを std::list<std::wstring>
にして「バッファにN行以上溜まっている」が分かる構成にしたら実行速度と結果出力のレスポンスを取りやすくできるんじゃないかと思っとります。
ついででやるには重すぎる改修内容だと思うので、結構先の話になるイメージです。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
スタイル上のことで修正してほしいところはありますが、
OK としておきます。
レビューありがとうございます。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
動作確認してませんが多分大丈夫だと思います。
レビューありがとうございます。 |
…xcluds_to_grep_replace 除外ファイル・除外フォルダの指定をGrep置換でも使えるようにする
PR の目的
除外ファイル・除外フォルダの指定をGrep置換でも使えるようにする
カテゴリ
PR の背景
sakura-editor/management-forum#75 (comment)
↓
sakura-editor/management-forum#78 (comment)
↓
反応なし。
まじめに対処を入れるとレビューが難しくなるので、対症療法で最低限の変更を入れる方法をとってみることにしました。【3/12削除】~~【3/12追加ここから】~~
レビュー対応の結果、まじめに対処を入れた場合とほぼ同等の修正内容となりました。
レビューは難しいと思いますが、できれば対応を入れたいと考えています。
~~【3/12追加ここまで】~~
当座のポイントは、
Grep置換をコマンドライン経由で実行する場合に
-GFILE
に除外情報が渡らない、に対処することです。
PR のメリット
難しいことは一切してないので、誰でもレビューできると思われます。
PR のデメリット (トレードオフとかあれば)
Grep結果リストに 除外フォルダ・除外ファイルを正しく表示できていない件(Grep結果の対象リスト表示の気になる点 #1134) については対処を入れていません。【3/12削除】PR の影響範囲
関連チケット
#743
参考資料