Funktionen

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