Qual é a maneira mais fácil de pesquisar todos os arquivos úteis em um único projeto?

28

Qual é a maneira mais fácil de procurar uma regexp em todo o conteúdo, todos os arquivos do projeto atual, ignorando arquivos que não são úteis?

Arquivos inúteis são coisas como arquivos compilados, bibliotecas importadas, arquivos de controle de versão etc.

Estou ciente rgrep, mas ele apenas pesquisa tudo. Existe um pacote que procure 'inteligentemente' e conheça várias linguagens de programação diferentes, para que eu não precise configurá-lo para cada projeto individual?

Malabarba
fonte
O seu comentário "ele apenas pesquisa tudo" rgrepé um pouco confuso, pois exclui todos os arquivos que correspondem aos critérios de "arquivos inúteis" por padrão.
phils

Respostas:

32

A pesquisa baseada em projetos no Emacs pode ser feita usando projéteis .

Permite a configuração por projeto de arquivos ignorar (em um <projectroot>\.projectilearquivo) ou especificar subdiretórios para monitorar e ignorar todos os outros.

Pode funcionar grep, ack(requer ack-and-a-half.el) e ag( ag.el) em arquivos dentro do projeto definido (seja baseado no .projectilearquivo ou por encontrar um arquivo VC suportado para definir uma raiz do projeto).

Comandos úteis

(No que diz respeito à pesquisa em arquivos úteis)

Conforme Leiame do Projétil

  • C-c p s g :: Execute grepnos arquivos do projeto.
  • C-c p s a :: Executa ackno projeto. Requer a presença de confirmação e meia.
  • C-c p s s :: Executa agno projeto. Requer a presença de ag.el.
  • C-c p f :: Exibe uma lista de todos os arquivos do projeto.
  • C-c p d :: Exibe uma lista de todos os diretórios do projeto.
  • C-c p a :: Alterne entre arquivos com o mesmo nome, mas com extensão diferente no projeto.
  • C-c p o:: Executa multi-occurem todos os buffers do projeto atualmente abertos.

Eles atuarão apenas em arquivos definidos como parte do projeto (ou encontrados quando o cache for gerado / regenerado).

Jonathan Leech-Pepin
fonte
Obrigado, qual é o comando do projétil que eu posso usar para isso?
Malabarba
Editou-o para incluir um subconjunto dos comandos (aqueles que lidam com pesquisa, arquivo de localização e direção). A lista completa está no leia-me do pacote.
Jonathan Leech-Pepin
13

A pesquisa em todo o projeto de apenas arquivos relevantes pode ser feita usando o agaka the_silver_searcher .

Por que ag?

  • Ele ignora padrões de arquivos do seu .gitignore, .hgignore, svn:ignore. Você pode optar por suas pesquisas NÃO usar a lista de ignorados nas listas de ignorados do controle de versão usando a -Uopção
  • Se houver arquivos no repositório de origem que você não deseja pesquisar, basta adicionar os padrões deles a um .agignorearquivo.
    • Um .agignorearquivo global pode ser colocado no seu $HOMEe, em seguida, você pode colocar mais .agignorearquivos específicos do projeto nas raízes do seu projeto.

Configurando age emacs

  • Instale agaka the_silver_searcher no seu sistema.
  • Configure o .agignorearquivo. Eu prefiro ter apenas um .agignorearquivo global no meu $HOME.
  • Instale o agpacote (disponível no Melpa).
  • Você pode usar a função ag-projectou ag-project-regexp(que acompanha o agpacote) para fazer pesquisas de arquivos em todo o projeto.
    • Por padrão, essas funções usam a raiz do repositório VCS como o diretório para pesquisar. Você pode substituir isso configurando ou personalizando o ag-project-root-function.
    • Mesmo que o seu projeto não seja controlado por git, você pode marcar uma raiz do projeto para as pesquisas baseadas em ag-project/ ag-project-regexpcolocando uma .gitpasta vazia na raiz do projeto. Você não precisa personalizar ag-project-root-function.
Kaushal Modi
fonte
4

Se o seu projeto usa o Git, você só precisa de counsel https://github.com/abo-abo/swiper

  • counsel-git encontrar arquivo

  • counsel-git-grep grep

A única dependência é git

O grepping de texto é mais rápido que o pesquisador prateado (ag)

O conselho também fornece outras ferramentas poderosas. Por exemplo, após a execução counsel-git-grep, você pode pressionar C-c C-oe C-x C-qentrar wgrep-modepara substituir facilmente o texto no escopo do projeto.

Existe um artigo https://sam217pa.github.io/2016/09/11/nuclear-power-editing-via-ivy-and-ag/ que explica detalhes. Esse artigo usa counsel-ag(outro comando incorporado ao conselho), mas cousnel-git-grepusa exatamente o mesmo fluxo de trabalho.

Chen Bin
fonte
Mas como é que o grepping de texto é mais rápido que o ag? Você poderia por favor elaborar?
denis631 24/10
1
agtambém é um programa grep, como git-grep. Não sei dizer qual é mais rápido. Veja github.com/BurntSushi/ripgrep, que compara o desempenho de programas grep populares (incluindo age git-grep)
chen bin
1

A primeira resposta é linda, mas deixa de fora alguns detalhes críticos sobre as versões modernas do Emacs. Eu sou o próprio Emacs, então outros recém-chegados podem não estar cientes disso. Dado que seu objetivo é procurar texto DENTRO de um arquivo em um PROJETO, primeiro instale o Projectile usando o repositório MELPA.

Isso instala o pacote em .emacs.d e adiciona algumas configurações básicas ao .emacs no diretório $ USER (supondo que você tenha criado o arquivo .emacs), como exigir o Projectile na instalação do Emacs.

No entanto, você ainda precisa habilitá-lo e associar prefixos de mapa de teclas, para poder invocá-lo no mini buffer.

A resposta aceita menciona o seguinte comando:

C-c p s g

Isso não funcionará, a menos que você configure o Projectile com esse prefixo de mapa de teclas. Mas eu o configurei para usar Cc Cp como o comando do Project em .emacs:

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

Agora, considerando isso, sou capaz de realizar pesquisas de texto em arquivos em um projeto usando grep:

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

Para dividir, C-c C-pinvocará o projétil e s gexecutará a pesquisa grep. Você obterá uma saída bonita como essa, supondo que sua pesquisa seja visit_contacte você esteja pesquisando o rspec do Ruby em um projeto:

./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
fonte