crep is a command-line tool designed for searching code using Tree-sitter queries. Unlike traditional grep, which operates on text lines, crep understands the structure of your code, allowing for more precise semantic searching.

Important

crep was built for fun and is not intended for real use. I made it to learn Tree-sitter and how searching over files works.

Features

Prerequisites

To build crep, you need:

Installation

git clone https://github.com/mitjafelicijan/crep.git
cd crep
make all

Usage

./crep [-c|--case-sensitive] [-l|--levenshtein <dist>] [-d|--depth <level>] <search_term> [path]

Environment Variables

Examples

Search for all functions containing "init" in the current directory:

./crep init .

Search for functions containing "parse" in a specific file:

./crep parse main.c

Run with debug logging enabled:

DEBUG=1 ./crep init .

Search for "main" allowing for 2 typos (e.g. "mian"):

./crep -l 2 "mian" main.c

How It Works

crep works by:

  1. Identifying supported files based on extension.
  2. Parsing the files using language-specific Tree-sitter grammars.
  3. Executing a structural query to find function/method definitions, including return types and parameters.
  4. Matching the identifier against the provided search term.
  5. Displaying the results with added semantic context.

Supported Languages

Language Extensions
C .c, .h
C++ .cpp, .hpp
CUDA .cu, .cuh
GLSL .glsl
Go .go
JavaScript .js
Kotlin .kt
Lua .lua
Odin .odin
PHP .php
Python .py
Rust .rs
Tcl .tcl
Zig .zig

Running Tests

To run the test suite:

make tests

Additional resources