Code finden, den man nur beschreiben kann
Was du davon hast
Dein Agent muss den Namen einer Funktion nicht kennen, um sie zu finden. Er beschreibt, was der Code tut, und greppy liefert die passenden Definitionen mit Datei und Zeile. Unter jedem Treffer steht ein Satz, wozu er da ist, der Agent wählt also den richtigen, bevor er eine Zeile liest. Die Beschreibung darf deutsch sein, auch wenn der Code englisch ist.
Vorher und nachher
Die Frage an serde: Woher weiß der Deserializer, wie viele Elemente er erwarten soll?
Ohne greppy
grep braucht ein Wort, das im Code steht. Der Agent rät Formulierungen aus Kommentaren und liest an der vielversprechendsten Stelle nach.
$ grep -rniE 'how many|number of elements' --include='*.rs' .
./serde_core/src/de/mod.rs:238: /// The `len` argument is the number of elements encountered. The sequence
./serde_core/src/de/mod.rs:1129: /// knows how many values there are without looking at the serialized data.
./serde_core/src/de/mod.rs:1776: /// Returns the number of elements remaining in the sequence, if known.
./serde_core/src/de/value.rs:1035: // First argument is the number of elements in the data, second
…
./serde/src/private/de.rs:2761: // argument is the number of elements expected by the Deserialize.
$ sed -n 1774,1780p serde_core/src/de/mod.rs
}
/// Returns the number of elements remaining in the sequence, if known.
#[inline]
fn size_hint(&self) -> Option<usize> {
None
}
Mit greppy
$ greppy search "wie viele Elemente der Deserializer erwarten soll"
serde/src/private/de.rs:1582 SeqDeserializer::size_hint — returns a size hint computed from the iterator bounds
serde/src/private/de.rs:1764 MapDeserializer::size_hint — returns a size hint computed from the iterator bounds
serde/src/private/de.rs:2541 SeqRefDeserializer::size_hint — returns a size hint computed from the iterator bounds
serde/src/private/de.rs:2710 MapRefDeserializer::size_hint — returns a size hint computed from the iterator bounds
serde_core/src/de/value.rs:1434 MapDeserializer::size_hint — returns a size hint computed from the value's iter
serde_core/src/de/value.rs:1103 SeqDeserializer::size_hint — returns a size hint computed from the value's iter
serde_core/src/de/mod.rs:1778 SeqAccess::size_hint — returns None unconditionally
serde_core/src/de/mod.rs:1937 MapAccess::size_hint — returns None unconditionally
| ohne greppy | mit greppy | |
|---|---|---|
| Aufrufe | 2 | 1 |
| Zeichen Ausgabe | 3.535 | 850 |
| Token | 791 | 198 |
So funktioniert es
Beim Indizieren berechnet greppy für jede Definition ein Embedding mit Googles EmbeddingGemma. search bettet deine Beschreibung genauso ein und liefert die Definitionen, deren Bedeutung am nächsten liegt, acht pro Anfrage. Die Sätze hinter den Treffern schreibt ein von uns per Destillation trainiertes Qwen3.5-0.8B aus dem Quelltext. Beide Modelle rechnen lokal auf deiner GPU, Index und Embeddings bleiben auf deinem Rechner. Für Namen und Text stehen search-symbol und search-pattern bereit, plus verbindet Text-, Namens-, Bedeutungs- und Graph-Signale zu einer Rangliste.
Die Befehle
| Befehl | was er tut |
|---|---|
greppy search "…" |
Definitionen, die tun, was die Beschreibung sagt, jede mit einem Satz zu ihrem Zweck |
greppy search-symbol NAME |
Definitionen, deren Name NAME enthält; ohne Treffer folgen ähnliche Namen |
greppy search-pattern REGEX |
jede Quellzeile, auf die der reguläre Ausdruck passt, mit der Definition, in der sie steht |
greppy plus QUERY |
eine Rangliste aus Text-, Symbol-, Bedeutungs- und Graph-Signalen als grep-artige Zeilen |
Mehr in der Doku
- Suchen: alle Suchbefehle, Flags und Beispiele
- So funktioniert greppy: Index, Embeddings und die lokalen Modelle