Come faccio a cercare nei risultati di ricerca


8

Quando C-sposso cercare. Come devo fare una funzione che potrei legare per esempio a C-rcui mi permetterebbe di cercare nei risultati di una query di ricerca predefinita?

Come il contenuto della finestra sarebbe:

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

Posso C-M-scon function.*una domanda e il risultato sarà function xyz(a, b).

Voglio avere una funzione in cui posso inserire una query e cercare quei risultati (che verrebbero generati automaticamente dietro i miei occhi).

AGGIORNARE

Grazie a tutti per le soluzioni. occur, helm-occurfunziona anche molto bene, ma ho accettato la risposta di Jordon Biondo perché mi ha fornito il codice di cui avevo bisogno per rispondere pienamente alla mia domanda.


Sono un po 'confuso riguardo al tuo obiettivo: sembra che tu voglia implementare alcune funzionalità specifiche di Lua helm-swoop, ma la tua domanda (e soprattutto il titolo) non è molto chiara su questo. Forse non ho ricevuto la tua domanda perché non ho familiarità con il timone.
paprika,

@paprika vedi domanda aggiornata :)
lukas.pukenis

non è esattamente quello che fa già helm-swoop?
Jordon Biondo,

@JordonBiondo Riesco a vedere la funzione nell'elenco helm-swoop. Ma ha imenufunzionato benissimo per me! Tranne che cerco una soluzione generica alla mia domanda
lukas.pukenis,

Mi chiedo solo se hai considerato "Cx c i" esegue il comando "helm-semantic-or-imenu", poiché stai già utilizzando helm.
rimero,

Risposte:


5

L'approccio semplice sarebbe usare solo rgrep.

utilizzare M-xrgrepe specificare la ricerca di "funzione" nel file corrente nella directory corrente. Puoi racchiuderlo in un comando in modo da non dover specificare le opzioni ogni volta in questo modo:

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

Questo produrrà un buffer di ricerca con le firme di funzione e puoi saltare alle definizioni se vuoi.


grep, rgrep, occur, E simili cercare solo riga per riga . Cioè, i contesti di ricerca sono linee singole. Pensavo che l'OP chiedesse di cercare le definizioni delle funzioni. Ma poiché questa risposta è stata accettata, immagino che la domanda posta non sia realmente ciò che si voleva.
Ha

nella domanda specifica che vuole linee come quelle function xyz(a, b), se il tuo lua è formattato correttamente è esattamente quello che otterrai.
Jordon Biondo,

Non mi è chiaro. Sì, dice che sarebbe soddisfatto se tali linee fossero trovate, da cercare. Ma nel suo esempio mostra l' intera definizione della funzione come " contenuto della finestra " che vorrebbe poter cercare. I contesti a riga singola non presentano tali contenuti da cercare (in una "finestra" o in altro modo). Essi si presentano con il solo una riga: function xyz(a, b).
Ha

7

Funzionerebbe occurper te?

M-x occuroppure M-s oinserendo la query verrà fornito un elenco di righe corrispondenti a quella regexp. È quindi possibile utilizzare C-sper cercare all'interno del buffer Occur per affinare la ricerca all'interno delle righe corrispondenti.


Ops. Ho trascorso così tanto tempo a scrivere la mia risposta che non ho notato che qualcuno mi ha battuto sul pugno.
nispio,

4

Emacs ha un comando chiamato occurche si adatta molto bene a questo tipo di attività. Se hai Helm installato, puoi helm-occurinvece usarlo .


Si verificano

Il occurcomando fa parte di emacs vaniglia ed è associato per M-s oimpostazione predefinita. Occur ti chiederà una regexp da cercare, quindi si aprirà una nuova finestra che mostra tutte le linee nel buffer corrente che contengono una corrispondenza. Il *Occur*buffer risultante è ricercabile utilizzando isearch( C-s).

  • M-s o function RET per mostrare tutte le righe corrispondenti a "funzione"
  • C-x oper spostare lo stato *Occur*attivo sul buffer
  • C-s per avviare una ricerca all'interno dei risultati della ricerca

Helm Occur

Se hai installato il timone, puoi usare helm-occurqualcosa di simile. In questo caso, il *Helm Occur*buffer non sarà direttamente ricercabile con C-s. In Helm puoi cercare più termini di ricerca semplicemente separandoli con uno spazio.

  • M-x helm-occur RET per aprire una finestra Helm Occur
  • function per mostrare tutte le righe che contengono "funzione"
  • SPC foo restringere i risultati a righe contenenti anche pippo

In una di queste modalità, selezionando la corrispondenza nel buffer si verifica e premendo Invio si salterà a quella riga nel codice.


3

Se usi la libreria Icicles , puoi facilmente fare questo tipo di cose. Quello che stai chiedendo (se ho capito bene), è cercare solo all'interno di determinati contesti di ricerca .

Ad esempio, come in questo caso, potresti voler cercare solo all'interno delle definizioni delle funzioni - i contesti di ricerca sono definizioni delle funzioni. In Lisp, questo sarebbe cose come defuns.

Icicles ha diversi comandi di ricerca Icicles predefiniti per la ricerca di definizioni come questa. Questi sono collettivamente chiamati comandi Imicu di Icicles .

Per cercare solo le definizioni dei comandi, è possibile utilizzare il comando icicle-imenu-command-full. Per cercare solo le definizioni di funzioni non interattive, utilizzare il comando icicle-imenu-non-interactive-function-full.

Oltre a cercare le definizioni, puoi facilmente definire qualsiasi tipo di contesto da cercare. Il modo più semplice è fornire una regexp. Il comando icicle-searchrichiede la regexp che definisce il contesto di ricerca. In alternativa, è possibile utilizzare una funzione per definire i contesti di ricerca.

Altre possibilità includono:

  • Ricerca nel testo di diversi tipi di COSE (es. Sexp, frasi, liste, stringhe, commenti, elementi XML, ...), ovvero ignorando altro testo al di fuori delle COSE.

  • Ricerca di zone di testo che hanno dato proprietà di testo o overlay, ovvero ignorando altro testo.


NOTA:

Altre risposte qui che menzionano occure simili ( helm-occur) forniscono un tipo limitato di ricerca di contesto: i contesti di ricerca sono solo le righe di un buffer.

Questo è molto più limitato che, diciamo, la ricerca all'interno di definizioni di funzioni complete, che è ciò che penso tu stia chiedendo. Con Icicles , il comando icicle-occur(associato a C-c ') consente di cercare all'interno di linee come contesti di ricerca.


1

Con Isearch + :

  1. C-M-s .+function.+, per cercare intere righe che contengono function.

  2. C-z .seguito da una regexp per qualcosa che vuoi cercare nelle righe che contengono function.

(Opzionale) Ripeti # 2 con altri motivi (regexps) per abbinare sulla stessa riga. Le partite possono essere in qualsiasi ordine all'interno della linea.

Invece del passaggio n. 1, puoi iniziare con C-M-s .+ C-z . function. Il punto è cercare intere linee che contengono functioninsieme a qualsiasi altro modello che ti piace.

Come C-z .funziona: richiede la corrispondenza di un modello in linea (ad es function.). Lo avvolge con .*su ogni lato, per ottenere un modello a linea intera (ad es .*function.*.). Aggiunge un predicato di filtro che richiede che la stringa di ricerca corrente ( .+) corrisponda anche a quel modello (ad es .*function.*.).

Vedere Filtro dinamico Isearch per ulteriori informazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.