Wie suche ich in Suchergebnissen?

8

Wenn ich C-ssuchen kann. Wie soll ich eine Funktion ausführen, an C-rdie ich mich beispielsweise binden kann , um in den Ergebnissen einer vordefinierten Suchabfrage zu suchen?

Wie der Inhalt des Fensters wäre:

function xyz(a, b)
  return a + b
end

Ich kann C-M-smit function.*als Abfrage und das Ergebnis wird sein function xyz(a, b).

Ich möchte eine Funktion haben, mit der ich eine Abfrage eingeben und in diesen Ergebnissen suchen kann (die automatisch hinter meinen Augen generiert werden).

AKTUALISIEREN

Vielen Dank für die Lösungen. occur, helm-occurFunktioniert auch sehr gut, aber ich habe Antwort Jordon Biondo akzeptiert , weil er den Code zur Verfügung gestellt brauchte ich meine Frage vollständig zu beantworten.

lukas.pukenis
quelle
Ich bin etwas verwirrt über Ihr Ziel: Es hört sich so an, als ob Sie eine Lua-spezifische Funktion für implementieren möchten helm-swoop, aber Ihre Frage (und insbesondere der Titel) ist diesbezüglich nicht sehr klar. Vielleicht habe ich Ihre Frage einfach nicht verstanden, weil ich mit dem Ruder nicht vertraut bin.
Paprika
@ Paprika siehe aktualisierte Frage :)
lukas.pukenis
ist das nicht genau das, was helm-swoop schon macht?
Jordon Biondo
@JordonBiondo Ich kann die Funktion in der Helm-Sturzflug-Liste sehen. Aber imenuhat super für mich funktioniert! Außer ich suche nach einer generischen Lösung für meine Frage
lukas.pukenis
Ich frage mich nur, ob Sie in Betracht gezogen haben, dass "Cx c i" den Befehl "helm-semantic-or-imenu" ausführt, da Sie bereits helm verwenden.
Rimero

Antworten:

5

Der einfache Ansatz wäre, nur rgrep zu verwenden.

Verwenden M-xrgrepund spezifizieren Sie die Suche nach "Funktion" in der aktuellen Datei im aktuellen Verzeichnis. Sie können dies in einem Befehl zusammenfassen, damit Sie die Optionen nicht jedes Mal wie folgt angeben müssen:

(defun rgrep-lua-functions ()
  "run `rgrep` searching for 'function' in the current file."
  (interactive)
  (rgrep "function" (file-name-nondirectory (buffer-file-name)) "."))

Dies ergibt einen durchsuchbaren Puffer mit den Funktionssignaturen und Sie können zu den Definitionen springen, wenn Sie möchten.

Jordon Biondo
quelle
grep, rgrep, occurUnd dergleichen Suche nur Zeile für Zeile . Das heißt, die Suchkontexte sind einzelne Zeilen. Ich dachte, das OP würde nach Funktionsdefinitionen suchen. Aber da diese Antwort akzeptiert wurde, ist die gestellte Frage wohl nicht wirklich das, was gewünscht wurde.
Drew
In der Frage gibt er an, dass er Zeilen wie function xyz(a, b)diese haben möchte , wenn Ihre Lua richtig formatiert ist, genau das, was Sie bekommen.
Jordon Biondo
Es ist mir nicht klar. Ja, er sagt, er wäre zufrieden, wenn solche Zeilen gefunden würden, um durchsucht zu werden. In seinem Beispiel zeigt er jedoch die gesamte Funktionsdefinition als den " Inhalt des Fensters ", den er durchsuchen möchte. Einzeilige Kontexte bieten Ihnen keinen solchen zu durchsuchenden Inhalt (ob in einem "Fenster" oder auf andere Weise). Sie präsentieren Ihnen nur die eine Zeile : function xyz(a, b).
Drew
7

Würde occurfür dich arbeiten?

M-x occuroder M-s odann Ihre Abfrage eingeben werden Sie mit einer Liste von Linien bieten diese regexp übereinstimmen. Sie können dann C-sinnerhalb des Occur-Puffers suchen, um Ihre Suche innerhalb der übereinstimmenden Zeilen zu verfeinern.

Jonathan Leech-Pepin
quelle
Hoppla. Ich habe so lange meine Antwort aufgeschrieben, dass ich nicht bemerkt habe, dass mich jemand hart geschlagen hat.
Nispio
4

Emacs hat einen Befehl namens occur, der für diese Art von Aufgabe sehr gut geeignet ist. Wenn Sie Helm installiert haben, können Sie helm-occurstattdessen verwenden.


Auftreten

Der occurBefehl ist Teil von Vanilla Emacs und M-s ostandardmäßig gebunden . Occur fordert Sie zur Eingabe eines regulären Ausdrucks auf, nach dem gesucht werden soll, und öffnet dann ein neues Fenster, in dem alle Zeilen im aktuellen Puffer angezeigt werden, die eine Übereinstimmung enthalten. Der resultierende *Occur*Puffer kann mit isearch( C-s) durchsucht werden .

  • M-s o function RET um alle Zeilen anzuzeigen, die mit "Funktion" übereinstimmen
  • C-x oum den Fokus auf den *Occur*Puffer zu verschieben
  • C-s um eine Suche in den Suchergebnissen zu starten

Helm auftreten

Wenn Sie einen Helm installiert haben, können helm-occurSie etwas Ähnliches tun. In diesem Fall kann der *Helm Occur*Puffer nicht direkt mit durchsucht werden C-s. In Helm können Sie nach mehreren Suchbegriffen suchen, indem Sie sie durch ein Leerzeichen trennen.

  • M-x helm-occur RET um ein Helm Occur-Fenster zu öffnen
  • function um alle Zeilen anzuzeigen, die "Funktion" enthalten
  • SPC foo um die Ergebnisse auf Zeilen zu beschränken, die auch foo enthalten

Wenn Sie in einem dieser Modi die Übereinstimmung im aufgetretenen Puffer auswählen und die Eingabetaste drücken, gelangen Sie zu dieser Zeile im Code.

Nispio
quelle
3

Wenn Sie Bibliothek Eiszapfen verwenden , können Sie so etwas leicht tun. Was Sie verlangen (wenn ich es richtig verstehe), ist, nur in bestimmten Suchkontexten zu suchen .

Wie in diesem Fall möchten Sie beispielsweise nur innerhalb von Funktionsdefinitionen suchen - die Suchkontexte sind Funktionsdefinitionen. In Lisp wären dies Dinge wie defuns.

Icicles verfügt über mehrere vordefinierte Icicles- Suchbefehle für die Suche nach Definitionen wie diesen. Diese werden gemeinsam als Icicles Imenu-Befehle bezeichnet .

Um nur Befehlsdefinitionen zu durchsuchen, können Sie den Befehl verwenden icicle-imenu-command-full. Verwenden Sie den Befehl, um nur nicht interaktive Funktionsdefinitionen zu durchsuchen icicle-imenu-non-interactive-function-full.

Über die Suche nach Definitionen hinaus können Sie problemlos alle Arten von zu durchsuchenden Kontexten definieren. Der einfachste Weg ist die Bereitstellung eines regulären Ausdrucks. Der Befehl icicle-searchfordert Sie zur Eingabe des regexp definierenden regulären Ausdrucks auf. Alternativ können Sie eine Funktion verwenden, um die Suchkontexte zu definieren.

Andere Möglichkeiten sind:

  • Durchsuchen des Textes verschiedener Arten von DINGEN (z. B. Sexps, Sätze, Listen, Zeichenfolgen, Kommentare, XML-Elemente usw.), dh Ignorieren anderer Texte außerhalb der DINGE.

  • Durchsuchen von Textzonen, die Text- oder Überlagerungseigenschaften zugewiesen haben, dh Ignorieren von anderem Text.


HINWEIS:

Andere hier erwähnte Antworten occurund ähnliches ( helm-occur) bieten eine begrenzte Art der Kontextsuche: Die Suchkontexte sind nur die Zeilen eines Puffers.

Das ist viel begrenzter als beispielsweise das Suchen innerhalb ganzer Funktionsdefinitionen, was Sie meiner Meinung nach verlangen. Mit Icicles können Sie mit Befehl icicle-occur(gebunden an C-c ') innerhalb von Zeilen als Suchkontexte suchen.

Drew
quelle
1

Mit Isearch + :

  1. C-M-s .+function.+, um nach ganzen Zeilen zu suchen, die enthalten function.

  2. C-z .gefolgt von einem regulären Ausdruck für etwas, nach dem Sie in den enthaltenen Zeilen suchen möchten function.

(Optional) Wiederholen Sie # 2 mit anderen Mustern (regulären Ausdrücken), um in derselben Zeile übereinzustimmen. Die Übereinstimmungen können in beliebiger Reihenfolge innerhalb der Linie erfolgen.

Anstelle von Schritt 1 können Sie mit beginnen C-M-s .+ C-z . function. Der Punkt ist, nach ganzen Linien zu suchen, die functionzusammen mit anderen Mustern enthalten, die Sie mögen.

So C-z .funktioniert es: Sie werden aufgefordert, ein passendes Inline-Muster anzugeben (z function. B. ). Es umhüllt das mit .*auf jeder Seite, um ein Volllinienmuster zu erhalten (z .*function.*. B. ). Es wird ein Filterprädikat hinzugefügt, das erfordert, dass Ihre aktuelle Suchzeichenfolge ( .+) auch mit diesem Muster übereinstimmt (z .*function.*. B. ).

Weitere Informationen finden Sie unter Dynamische Suchfilterung .

Drew
quelle