インデント構造のテキスト ファイルを検索するための機能的なツール。
マット・ブルーベックの「鬼」からインスピレーションを得た作品。その鬼はコンパクトで美しいですが、特徴的ではありません。
ogrep — Python で書かれたこのツールの移植版も参照してください (実際には、Python が最初でした)。
ogrep
grep
によく似ており、どちらも一致を検索し、そのコンテキストを表示できます。ただし、 grep
のコンテキストは「一致の前後 N 行」であり、 ogrep
の場合は「一致した行より上のインデントが低い行」です。
説明しましょう。このツールは主に GN ビルド ファイルを操作するときに使用するため、例として大きな BUILD.gn ファイルを使用します。通常のタスクは、ソース ファイル名を検索し、どのターゲットにどのような条件でこのファイルが含まれているかを理解することです。
「arena.cc」ファイルに関する言及を探してみましょう。
# grep arena.cc BUILD.gn
"base/arena.cc",
さて、ファイルはここにありますが、ターゲットがわかりません。コンテキストを聞いてみましょう。
# grep -C2 arena.cc BUILD.gn
"base/address_tracker_linux.cc",
"base/address_tracker_linux.h",
"base/arena.cc",
"base/arena.h",
"base/backoff_entry.cc",
いいえ、それほど役に立ちません。 ogrep
試してみましょう:
ogrep arena.cc BUILD.gn
102: component("net") {
385: if (!is_nacl) {
386: sources += [
409: "base/arena.cc",
これは便利ですね!そのファイルが「!is_nacl」条件で「net」ターゲットに含まれていることがすぐにわかります。
ogrep
色を使用できるため、さらに優れています。次の図を参照してください。
まだインストールしていない場合は、Rust と Cargo をインストールします。
cargo install ogrep
Homebrewをインストールしてから、
brew install kriomant/ogrep-rs/ogrep-rs
申し訳ありませんが、まだですが、現在取り組んでいます。とりあえずはカーゴを使用してください。
利用可能なオプションが多数あり、 --help
を指定して実行するとリストが表示されます。
このツールは、厳密なインデント ベースのファイル (Python ソースなど) や GN ビルド ファイルだけでなく、幅広いテキスト ファイルにも役立ちます。これは、インデントに基づいていないファイルでも通常は便宜上フォーマットされているためです。
C 関連のハックもいくつか組み込まれています。
簡単な機能リストは次のとおりです。
パターンはデフォルトでは固定テキストですが、 -e
を使用して任意の正規表現を使用できます。
通常の-w
(単語全体に一致) および-i
(大文字と小文字を区別しない検索) が使用できます。
このツールは、一致の間にいくつかの空白行を保持します。これは、関連する一致のグループを視覚的に分離するのに役立つため、 --no-breaks
使用して無効にすることができます。
場合によっては、一致した行の間に他の行があったかどうかを確認すると便利です。そのためには--ellipsis
使用してください。
otool
外部ツールと統合する場合、 --print-filename
オプションが便利です。これは、一致するものが見つかった場合にファイル名を出力するように指示します。
デフォルトでは、「if-else」分岐は特別に扱われます。if 分岐は保持されるため、「else」分岐で一致が見つかった場合でも条件がわかります。
従来のコンテキスト (一致したコンテキストの前後に N 行の先頭行および/または末尾行を表示) も、 --context/-C
、 --before-context/-B
、および--after-context/-A
オプションでサポートされます。
# ./ogrep filename_util_icu BUILD.gn
102: component("net") {
2106: if (!is_nacl) {
2210: if (use_platform_icu_alternatives) {
2222: } else {
2228: sources += [
2229: "base/filename_util_icu.cc",
これは--no-smart-branches
で無効にできます。
--no-ignore-preprocessor
が指定されるまで、デフォルトでプリプロセッサ命令を無視します。プリプロセッサ命令 (並列コンテキスト) のよりインテリジェントな処理が計画されています。
otool
単一ファイルのみを検索することを目的としています。また、多くのファイルの検索に使用するにはそれほど高速ではありません。ただし、次のように他の検索ツールと統合できます。
grep -l cache_used -r . --include='*.cc' | xargs -n1 ogrep --print-filename cache_used
git grep
サポートogrep
はgit grep
との統合が組み込まれています。 -g
オプションが指定されている場合、2 番目の引数がパス指定としてgit grep
に渡されます。関連するすべてのオプション ( -w
、 -i
など) もgit grep
に自動的に渡され、 --print-filename
が強制されます。
ogrep -g cache_used '*.cc'