Comment rechercher dans les résultats de recherche

8

Quand je C-spourrai chercher. Comment dois-je faire une fonction que je pourrais lier par exemple à C-rlaquelle me permettrait de rechercher dans les résultats d'une requête de recherche prédéfinie?

Comme le contenu de la fenêtre serait:

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

Je peux C-M-savec function.*une requête et le résultat sera function xyz(a, b).

Je veux avoir une fonction où je pourrais entrer une requête et rechercher dans ces résultats (qui seraient générés automatiquement derrière mes yeux).

MISE À JOUR

Merci à tous pour les solutions. occur, helm-occurfonctionne également très bien, mais j'ai accepté la réponse de Jordon Biondo car il a fourni le code dont j'avais besoin pour répondre pleinement à ma question.

lukas.pukenis
la source
Je suis un peu confus quant à votre objectif: il semble que vous souhaitiez implémenter une fonctionnalité spécifique à Lua helm-swoop, mais votre question (et surtout le titre) n'est pas très claire à ce sujet. Peut-être que je n'ai tout simplement pas compris votre question parce que je ne connais pas la barre.
paprika
@paprika voir la question mise à jour :)
lukas.pukenis
N'est-ce pas exactement ce que fait déjà Helm-Swoop?
Jordon Biondo
@JordonBiondo Je peux voir la fonction dans la liste helm-swoop. Mais imenua très bien fonctionné pour moi! Sauf que je recherche une solution générique à ma question
lukas.pukenis
Je me demande simplement si vous avez envisagé que "Cx c i" exécute la commande "helm-semantic-or-imenu", car vous utilisez déjà helm.
rimero

Réponses:

5

L'approche simple serait d'utiliser simplement rgrep.

utiliser M-xrgrepet spécifier la recherche de "fonction" dans le fichier courant dans le répertoire courant. Vous pouvez envelopper cela dans une commande afin que vous n'ayez pas à spécifier les options à chaque fois comme ceci:

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

Cela produira un tampon de recherche avec les signatures de fonction et vous pouvez passer aux définitions si vous le souhaitez.

Jordon Biondo
la source
grep, rgrep, occurEt la recherche comme seule ligne par ligne . Autrement dit, les contextes de recherche sont des lignes simples. Je pensais que l'OP demandait de rechercher des définitions de fonctions. Mais puisque cette réponse a été acceptée, je suppose que la question telle qu'elle est posée n'est pas vraiment ce que l'on voulait.
Drew
dans la question, il précise qu'il veut des lignes comme function xyz(a, b)lesquelles, si votre lua est correctement formaté, c'est exactement ce que vous obtiendrez.
Jordon Biondo
Ce n'est pas clair pour moi. Oui, il dit qu'il serait satisfait si de telles lignes étaient trouvées, à rechercher. Mais dans son exemple, il montre toute la définition de la fonction comme le " contenu de la fenêtre " qu'il voudrait pouvoir rechercher. Contextes monolignes ne pas vous présenter ce contenu à rechercher (que ce soit dans une « fenêtre » ou autre). Ils vous présentent avec seulement une ligne: function xyz(a, b).
Drew
7

Fonctionnerait occurpour vous?

M-x occurou M-s oalors entrer votre requête vous fournira une liste de lignes correspondant à cette expression rationnelle. Vous pouvez ensuite utiliser C-spour rechercher dans le tampon Occur pour affiner votre recherche dans les lignes correspondantes.

Jonathan Leech-Pepin
la source
Oops. J'ai passé tellement de temps à rédiger ma réponse que je n'ai pas remarqué que quelqu'un me battait au poing.
nispio
4

Emacs a une commande appelée occurqui est très bien adaptée à ce type de tâche. Si Helm est installé, vous pouvez l'utiliser à la helm-occurplace.


Se produire

La occurcommande fait partie d'emacs vanilla et est liée M-s opar défaut. Occur vous demandera une expression rationnelle à rechercher, puis il ouvrira une nouvelle fenêtre affichant toutes les lignes du tampon actuel qui contiennent une correspondance. Le *Occur*tampon résultant peut être recherché à l'aide de isearch( C-s).

  • M-s o function RET pour afficher toutes les lignes correspondant à la "fonction"
  • C-x opour déplacer le focus vers le *Occur*tampon
  • C-s pour lancer une recherche dans les résultats de la recherche

Helm Occur

Si vous avez installé Helm, vous pouvez utiliser helm-occurquelque chose de similaire. Dans ce cas, le *Helm Occur*tampon ne sera pas directement consultable avec C-s. Dans Helm, vous pouvez rechercher plusieurs termes de recherche simplement en les séparant par un espace.

  • M-x helm-occur RET ouvrir une fenêtre Helm Occur
  • function pour afficher toutes les lignes contenant "fonction"
  • SPC foo pour affiner les résultats aux lignes contenant également foo

Dans l'un ou l'autre de ces modes, la sélection de la correspondance dans le tampon d'occurrence et l'appui sur Entrée vous feront sauter à cette ligne du code.

nispio
la source
3

Si vous utilisez la bibliothèque Icicles, vous pouvez facilement faire ce genre de chose. Ce que vous demandez (si je comprends bien), c'est de rechercher uniquement dans certains contextes de recherche .

Par exemple, comme dans ce cas, vous souhaiterez peut-être rechercher uniquement dans les définitions de fonction - les contextes de recherche sont des définitions de fonction. Dans Lisp, ce serait des choses comme l' defunart.

Icicles a plusieurs commandes de recherche Icicles prédéfinies pour rechercher des définitions comme celle-ci. Celles-ci sont collectivement appelées commandes Icicles Imenu .

Pour rechercher uniquement les définitions de commandes, vous pouvez utiliser la commande icicle-imenu-command-full. Pour rechercher uniquement des définitions de fonctions non interactives, utilisez la commande icicle-imenu-non-interactive-function-full.

Au-delà de la recherche de définitions, vous pouvez facilement définir tout type de contexte à rechercher. La manière la plus simple est de fournir une expression rationnelle. La commande icicle-searchvous invite à indiquer l'expression rationnelle de définition du contexte de recherche. Vous pouvez également utiliser une fonction pour définir les contextes de recherche.

D'autres possibilités incluent:

  • Rechercher le texte de différents types de choses (par exemple, sexps, phrases, listes, chaînes, commentaires, éléments XML, ...), c'est-à-dire ignorer tout autre texte en dehors des choses.

  • Recherche de zones de texte qui ont donné des propriétés de texte ou de superposition, c'est-à-dire en ignorant un autre texte.


REMARQUE:

D'autres réponses ici mentionnées occuret similaires ( helm-occur) fournissent un type limité de recherche de contexte: les contextes de recherche ne sont que les lignes d'un tampon.

C'est beaucoup plus limité que, disons, la recherche dans des définitions de fonctions entières, ce que je pense que vous demandez. Avec Icicles , la commande icicle-occur(liée à C-c ') vous permet de rechercher dans les lignes en tant que contextes de recherche.

A dessiné
la source
1

Avec Isearch + :

  1. C-M-s .+function.+, pour rechercher des lignes entières qui contiennent function.

  2. C-z .suivi d'une expression régulière pour quelque chose que vous souhaitez rechercher dans les lignes qui contiennent function.

(Facultatif) Répétez # 2 avec d'autres motifs (regexps) pour faire correspondre la même ligne. Les matchs peuvent être dans n'importe quel ordre dans la ligne.

Au lieu de l'étape # 1, vous pouvez commencer par C-M-s .+ C-z . function. Le but est de rechercher des lignes entières qui contiennent functionainsi que tous les autres motifs que vous aimez.

Fonctionnement C-z .: il vous invite à indiquer un modèle en ligne correspondant (par exemple function). Il enveloppe cela avec .*de chaque côté, pour obtenir un motif de ligne complète (par exemple .*function.*). Il ajoute un prédicat de filtre qui nécessite que votre chaîne de recherche actuelle ( .+) corresponde également à ce modèle (par exemple .*function.*).

Voir Filtrage dynamique Isearch pour plus d'informations.

A dessiné
la source