#code #search #code-search #comby

app comby-search

Structural Code Search using Comby

5 releases

0.2.1 Mar 16, 2023
0.2.0 Mar 14, 2023
0.1.2 Mar 14, 2023
0.1.1 Mar 14, 2023
0.1.0 Mar 13, 2023

#192 in Development tools

34 downloads per month


72 lines

Comby Search

Comby Search is a convenience wrapper around Comby to provide the code searching functionality.

Why Comby Search? Why Comby?

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:


You can install via cargo with:

cargo install comby-search

Or compile it from source.


Usage: cb [OPTIONS] <QUERY>

  <QUERY>  Your code search query

  -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.

  1. Find all arrow functions in TSX files
$ cb -f '*.tsx,*.jsx' 'const :[1] = (:[2]) => { :[3] }'
  1. Is there any call to the superFoo function with an empty string as argument?
$ cb 'superFoo(:[2] "" :[3])'
  1. Find all for loop in all Java files, but not in test files
$ cb -f '!*Test.java' 'for ([:1]) { :[2] }'
  1. Find all Rust functions that return a String
$ cb -f '*.rs' 'fn :[1] (:[2]) -> String'
  1. Find Rust traits (can you tell the different?)
$ cb 'trait :[1] { fn :[2](:[3]); }'

# and

$ cb 'trait :[1] { fn :[2](:[3]) -> :[4]; }'


~124K SLoC