¿Cuál es la forma más fácil de buscar todos los archivos útiles dentro de un solo proyecto?

28

¿Cuál es la forma más fácil de buscar una expresión regular en todos los contenidos de todos los archivos del proyecto actual, omitiendo los archivos que no son útiles?

Los archivos inútiles son cosas como archivos compilados, bibliotecas importadas, archivos de control de versiones, etc.

Soy consciente rgrep, pero solo busca todo. ¿Existe un paquete que busque 'inteligentemente' y conozca varios lenguajes de programación diferentes, por lo que no tendría que configurarlo para cada proyecto individual?

Malabarba
fuente
Su comentario de "solo busca todo" rgrepes un poco confuso, dado que excluye todos los archivos que coinciden con sus criterios de "archivos inútiles" de forma predeterminada.
phils

Respuestas:

32

La búsqueda basada en proyectos dentro de Emacs se puede hacer usando proyectiles .

Permite la configuración por proyecto de archivos de ignorar (en un <projectroot>\.projectilearchivo), o especificar subdirectorios para monitorear e ignorar todos los demás.

Puede funcionar grep, ack(requiere ack-and-a-half.el) y ag( ag.el) en los archivos dentro del proyecto definido (ya sea basado en el .projectilearchivo o mediante la búsqueda de un archivo VC apoyado para definir una raíz del proyecto).

Comandos útiles

(Con respecto a la búsqueda a través de archivos útiles)

Según el Léame del proyectil

  • C-c p s g :: Ejecutar grepen los archivos del proyecto.
  • C-c p s a :: Se ejecuta acken el proyecto. Requiere la presencia de ack-and-a-half.
  • C-c p s s :: Se ejecuta agen el proyecto. Requiere la presencia de ag.el.
  • C-c p f :: Mostrar una lista de todos los archivos en el proyecto.
  • C-c p d :: Mostrar una lista de todos los directorios en el proyecto.
  • C-c p a :: Cambiar entre archivos con el mismo nombre pero diferente extensión en el proyecto.
  • C-c p o:: Se ejecuta multi-occuren todos los buffers de proyecto actualmente abiertos.

Estos solo actuarán en archivos definidos como parte del proyecto (o encontrados cuando el caché se genera / regenera).

Jonathan Leech-Pepin
fuente
Gracias, ¿cuál es el comando de proyectil que puedo usar para esto?
Malabarba
Lo editó para incluir un subconjunto de los comandos (aquellos relacionados con la búsqueda, find-file y dired). La lista completa está en el paquete Léame.
Jonathan Leech-Pepin
13

La búsqueda de todo el proyecto de solo archivos relevantes se puede hacer usando agaka the_silver_searcher .

¿Por qué ag?

  • No tiene en cuenta los patrones de archivos desde tu .gitignore, .hgignore, svn:ignore. Puede elegir que sus búsquedas NO utilicen la lista de ignorados de las listas de ignorados de control de versiones mediante el -Uinterruptor.
  • Si hay archivos en su repositorio fuente que no desea buscar, simplemente agregue sus patrones a un .agignorearchivo.
    • Se .agignorepuede poner un archivo global en su $HOMEy luego puede poner más .agignorearchivos específicos del proyecto en las raíces de su proyecto.

Configuración agy emacs

  • Instale agaka the_silver_searcher en su sistema.
  • Configura el .agignorearchivo. Prefiero tener solo un .agignorearchivo global en mi $HOME.
  • Instale el agpaquete (disponible en Melpa).
  • Luego puede usar la función ag-projecto ag-project-regexp(que viene con el agpaquete) para realizar búsquedas de archivos en todo el proyecto.
    • De manera predeterminada, estas funciones usan la raíz del repositorio de VCS como el directorio para buscar. Puede anular esto configurando o personalizando ag-project-root-function.
    • Incluso si su proyecto no está controlado por git, puede marcar una raíz del proyecto para las búsquedas basadas en ag-project/ ag-project-regexpcolocando una .gitcarpeta vacía en la raíz del proyecto. Entonces no tienes que personalizar ag-project-root-function.
Kaushal Modi
fuente
4

Si su proyecto usa Git, solo necesita counsel https://github.com/abo-abo/swiper

  • counsel-git para encontrar el archivo

  • counsel-git-grep grep

La única dependencia es git

El agrupamiento de texto es más rápido que el buscador plateado (ag)

Counsel también proporciona otras herramientas poderosas. Por ejemplo, después de ejecutar counsel-git-grep, puede presionar C-c C-oy C-x C-qpara wgrep-modereemplazar fácilmente el texto en el alcance del proyecto.

Hay un artículo https://sam217pa.github.io/2016/09/11/nuclear-power-editing-via-ivy-and-ag/ que explica los detalles. Ese artículo usa counsel-ag(otro comando integrado en el consejo) pero cousnel-git-grepusa exactamente el mismo flujo de trabajo.

Chen Bin
fuente
Pero, ¿por qué el agrupamiento de texto es más rápido que ag? ¿Podrías por favor elaborar?
denis631
1
agTambién es un programa grep, como git-grep. No puedo decir cuál es más rápido. Consulte github.com/BurntSushi/ripgrep que compara el rendimiento de los programas grep populares (incluidos agy git-grep)
chen bin
1

La primera respuesta es hermosa, pero deja de lado algunos detalles críticos sobre las versiones modernas de Emacs. Yo mismo conozco a Emacs, por lo que otros recién llegados podrían no ser conscientes de esto. Dado que su objetivo es buscar texto DENTRO de un archivo en un PROYECTO, primero debe instalar Projectile utilizando el repositorio MELPA.

Esto instala el paquete en .emacs.d y agrega alguna configuración básica a .emacs en su directorio $ USER (suponiendo que haya creado el archivo .emacs), como requerir Projectile en su instalación de Emacs.

Sin embargo, aún necesita habilitarlo y asociar prefijos de mapa de teclas, por lo que puede invocarlo en el mini buffer.

La respuesta aceptada menciona el siguiente comando:

C-c p s g

Esto no funcionará, a menos que configure Projectile con este prefijo de mapa de teclas. Pero lo configuré para usar Cc Cp como comando para Project en .emacs:

(projectile-mode +1)
(define-key projectile-mode-map (kbd "C-c C-p") 'projectile-command-map)

Ahora dado esto, puedo realizar búsquedas de texto en archivos en un proyecto usando grep:

C-c C-p f # switch to a project first
C-c C-p s g # perform grep search in project

Para desglosarlo, C-c C-pinvocará Proyectil y s grealizará la búsqueda grep. Obtendrá un resultado hermoso como este, suponiendo que su búsqueda sea visit_contacty está buscando Ruby rspec en un proyecto:

./spec/support/capybara_classification_code_helper.rb:21:  def visit_contact
./spec/features/admin_edits_classification_code_role_dynamic_field_spec.rb:8:    visit_contact
./spec/features/admin_edits_classification_code_role_dynamic_field_spec.rb:33:    visit_contact
./spec/features/user_views_global_filters_from_line_item_spec.rb:9:      visit_contact
Donato
fuente