¿Cómo busco en los resultados de búsqueda?

8

Cuando C-spuedo buscar. ¿Cómo debo hacer una función que pueda vincular, por ejemplo C-r, que me permita buscar en los resultados de alguna consulta de búsqueda predefinida?

El contenido similar de la ventana sería:

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

Puedo C-M-scon function.*una consulta y el resultado será function xyz(a, b).

Quiero tener una función en la que pueda ingresar una consulta y buscar esos resultados (que se generarían detrás de mis ojos automáticamente).

ACTUALIZAR

Gracias a todos por las soluciones. occur, helm-occurtambién funciona muy bien, pero acepté la respuesta de Jordon Biondo porque proporcionó el código que necesitaba para responder mi pregunta por completo.

lukas.pukenis
fuente
Estoy un poco confundido acerca de su objetivo: parece que desea implementar alguna función específica de Lua helm-swoop, pero su pregunta (y especialmente el título) no es muy clara al respecto. Tal vez no recibí tu pregunta porque no estoy familiarizado con el timón.
pimentón
@paprika ver pregunta actualizada :)
lukas.pukenis
¿No es esto exactamente lo que Helm-Swoop ya hace?
Jordon Biondo
@JordonBiondo Puedo ver la función en la lista helm-swoop. ¡Pero imenufuncionó muy bien para mí! Excepto que busco una solución genérica para mi pregunta
lukas.pukenis
Me pregunto si has considerado "Cx c i" ejecuta el comando "helm-semantic-or-imenu", ya que ya estás usando helm.
rimero

Respuestas:

5

El enfoque simple sería simplemente usar rgrep.

use M-xrgrepy especifique la búsqueda de "función" en el archivo actual en el directorio actual. Puede resumir esto en un comando para no tener que especificar las opciones cada vez de esta manera:

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

Esto generará un búfer de búsqueda con las firmas de funciones y puede saltar a las definiciones si lo desea.

Jordon Biondo
fuente
grep, rgrep, occur, Y similares búsqueda sólo línea por línea . Es decir, los contextos de búsqueda son líneas simples. Pensé que el OP estaba pidiendo buscar definiciones de funciones. Pero dado que esta respuesta fue aceptada, supongo que la pregunta planteada no es realmente lo que se quería.
Dibujó
en la pregunta que especifica que quiere líneas como esa function xyz(a, b), si su lua está formateada correctamente es exactamente lo que obtendrá.
Jordon Biondo
No me queda claro. Sí, él dice que estaría satisfecho si se encontraran tales líneas, para ser buscadas. Pero en su ejemplo, muestra la definición completa de la función como el " contenido de la ventana " que le gustaría poder buscar. Los contextos de una sola línea no le presentan dicho contenido para buscar (ya sea en una "ventana" o de otra manera). Te regalan solamente la una sola línea: function xyz(a, b).
Dibujó
7

¿ occurFuncionaría para ti?

M-x occuro M-s oluego ingresar su consulta le proporcionará una lista de líneas que coinciden con la expresión regular. Luego puede usar C-spara buscar dentro del búfer Occur para refinar su búsqueda dentro de las líneas coincidentes.

Jonathan Leech-Pepin
fuente
Ups Pasé tanto tiempo escribiendo mi respuesta que no me di cuenta de que alguien me había golpeado.
nispio
4

Emacs tiene un comando llamado occurque se adapta muy bien a este tipo de tarea. Si tiene instalado Helm, puede usarlo helm-occuren su lugar.


Ocurrir

El occurcomando es parte de vanilla emacs y está vinculado M-s ode forma predeterminada. Occur le pedirá una expresión regular para buscar, y luego abrirá una nueva ventana que muestra todas las líneas en el búfer actual que contienen una coincidencia. El *Occur*búfer resultante se puede buscar usando isearch( C-s).

  • M-s o function RET para mostrar todas las líneas que coinciden con "función"
  • C-x opara mover el foco al *Occur*búfer
  • C-s para comenzar una búsqueda dentro de los resultados de búsqueda

Ocurre el timón

Si tiene instalado el timón, puede helm-occurhacer algo similar. En este caso, *Helm Occur*no se podrá buscar directamente en el búfer C-s. En Helm, puede buscar varios términos de búsqueda simplemente separándolos con un espacio.

  • M-x helm-occur RET abrir una ventana de Helm Occur
  • function para mostrar todas las líneas que contienen "función"
  • SPC foo para reducir los resultados a líneas que también contienen foo

En cualquiera de estos modos, al seleccionar la coincidencia en el búfer de ocurrencia y presionar Intro, saltará a esa línea en el código.

nispio
fuente
3

Si usa la biblioteca Icicles , puede hacer este tipo de cosas fácilmente. Lo que está pidiendo (si lo entiendo correctamente) es buscar solo dentro de ciertos contextos de búsqueda .

Por ejemplo, como en este caso, es posible que desee buscar solo dentro de las definiciones de funciones : los contextos de búsqueda son definiciones de funciones. En Lisp, esto sería cosas como defuns.

Icicles tiene varios comandos de búsqueda de Icicles predefinidos para buscar definiciones como esta. Estos se denominan colectivamente comandos Icicles Imenu .

Para buscar solo definiciones de comandos, puede usar el comando icicle-imenu-command-full. Para buscar solo definiciones de funciones no interactivas, use el comando icicle-imenu-non-interactive-function-full.

Más allá de la búsqueda de definiciones, puede definir fácilmente cualquier tipo de contexto para buscar. La forma más simple es proporcionar una expresión regular. El comando le icicle-searchsolicita la expresión regular de búsqueda que define el contexto. Alternativamente, puede usar una función para definir los contextos de búsqueda.

Otras posibilidades incluyen:

  • Buscar el texto de diferentes tipos de COSAS (p. Ej., Sexps, oraciones, listas, cadenas, comentarios, elementos XML, ...), es decir, ignorar otro texto fuera de las COSAS.

  • Buscar zonas de texto que tienen propiedades de texto o superposición, es decir, ignorar otro texto.


NOTA:

Otras respuestas aquí que mencionan occury similares ( helm-occur) proporcionan un tipo limitado de búsqueda de contexto: los contextos de búsqueda son solo las líneas de un búfer.

Eso es mucho más limitado que, por ejemplo, buscar dentro de las definiciones de funciones completas, que es lo que creo que está pidiendo. Con Icicles , el comando icicle-occur(vinculado a C-c ') le permite buscar dentro de líneas como contextos de búsqueda.

Dibujó
fuente
1

Con Isearch + :

  1. C-M-s .+function.+, para buscar líneas completas que contengan function.

  2. C-z .seguido de una expresión regular de algo que desea buscar en las líneas que contienen function.

(Opcional) Repita el n. ° 2 con otros patrones (expresiones regulares) para que coincidan en la misma línea. Las coincidencias pueden estar en cualquier orden dentro de la línea.

En lugar del paso 1, puede comenzar con C-M-s .+ C-z . function. El objetivo es buscar líneas enteras que contengan functionjunto con cualquier otro patrón que desee.

Cómo C-z .funciona: le solicita un patrón en línea que coincida (p function. Ej .). Envuelve eso con .*cada lado, para obtener un patrón de línea completa (por ejemplo .*function.*). Agrega un predicado de filtro que requiere que su cadena de búsqueda actual ( .+) también coincida con ese patrón (por ejemplo .*function.*).

Consulte Filtrado dinámico de Isearch para obtener más información.

Dibujó
fuente