Comby Search is a convenience wrapper around Comby to provide the code searching functionality.
Because Comby by default provided the code rewrite function and does not have a pretty output when doing -match-only
. Comby Search
wrapped around Comby and parse the -match-only
output to make it easier to search and see the result.
And why using Comby? See here for more details: https://github.com/comby-tools/comby#isnt-a-regex-approach-like-sed-good-enough
But TL;DR: Comby provides a better search comparing to Regex. It handles whitespaces automatically (if you ever tried search multilines of codes in Regex, you'll know), context aware (for example, it will not match commented code),...
Comby Search rely on these tools, you should have them installed first:
- Comby (https://github.com/comby-tools/comby)
- Ripgrep (https://github.com/BurntSushi/ripgrep)
You can install via cargo
with:
cargo install comby-search
Or compile it from source.
Usage: cb [OPTIONS] <QUERY>
Arguments:
<QUERY> Your code search query
Options:
-f, --filter <PATTERN> File filter pattern, for example: '*.ts,!*.spec.ts'
-l, --line-margin <MARGIN> Number of lines to display before and after the matched search result
-h, --help Print help
To start a new search, run the command below. See Comby's Documentation for more information about the search syntax.
$ cb '<search query>'
For example:
$ cb 'struct :[A] { :[B] }'
You can also limit the scope of the search to some specific files with:
$ cb -f '*.ts,*.java,!*.js' 'struct :[A] { :[B] }'
By default, the matched result will be displayed with a margin of 3 lines before and after, you can change this with the --line-margin
or -l
option:
$cb -l 10 'foo'
Here are some example search with cb
.
- Find all arrow functions in TSX files
$ cb -f '*.tsx,*.jsx' 'const :[1] = (:[2]) => { :[3] }'
- Is there any call to the
superFoo
function with an empty string as argument?
$ cb 'superFoo(:[2] "" :[3])'
- Find all for loop in all Java files, but not in test files
$ cb -f '!*Test.java' 'for ([:1]) { :[2] }'
- Find all Rust functions that return a String
$ cb -f '*.rs' 'fn :[1] (:[2]) -> String'
- Find Rust traits (can you tell the different?)
$ cb 'trait :[1] { fn :[2](:[3]); }'
# and
$ cb 'trait :[1] { fn :[2](:[3]) -> :[4]; }'