Estou usando o Emacs há algum tempo e ainda assim, de alguma forma, não consigo entender qual é a melhor maneira de (recursivamente) grep para uma string em um diretório (project) e obter os resultados apresentados como um buffer direcionado ou em alguns outros maneira útil. Por favor me esclareça.
14
helm-projectile-grep
comando (se você tem o projétil de leme instalado) ouprojectile-grep
?helm
ouprojectile
é, mas, se for uma ferramenta recomendada, eu instalaria e aprenderia.projectile-grep
. Além disso, eu recomendo que você instale ohelm
pacote. Não consigo imaginar rodar o emacs semhelm
ehelm-projectile
. Você também pode ser interessante nohelm-ag
pacote (que fornece uma interface de leme para o pesquisador prateado no emacs, que é supostamente mais rápido que o grep ou o ack).M-x grep
não faz o que você precisa. Vamos dar uma linha de comando arbitrária, às vezes eu usofind
lá quando preciso da recursão.Respostas:
Bem, como a pergunta original não menciona
rgrep
, vou adiante e aponto aqui. Esta é a opção mais simples já incorporada ao Emacs, e eu achei que era mais do que suficiente para a maioria das coisas.A partir da documentação,
A pesquisa é limitada a nomes de arquivos que correspondem ao padrão de shell FILES.
Assim, por exemplo, para pesquisar todos os arquivos python sob o meu diretório home para usos de
some_function
, gostaria de chamá-lo comsome_function
,*.py
,~/
como os argumentos. Os resultados são exibidos em um novo buffer.fonte
find-grep-dired
também desde OP mencionou "os resultados apresentados como um buffer dired ou ..."find-grep-dired
me usei , fique à vontade para adicioná-lo à resposta.rgrep
faz um trabalho tão bom em direcionar a pesquisa que não houve diferenças significativas de velocidade entre elas. (Eu quero dizer que rgrep foi fracionada mais rápido em alguns casos, mas não me lembro com certeza.)next-error
eprevious-error
pode ser usado para navegar pelo conjunto de resultados. AchoM-g M-n
eM-g M-p
a mais conveniente das ligações padrão.find-grep-dired
não me fornece um buffer com links de referência cruzada.rgrep
faz isso por mim e essa última sugestãonext-error
previous-error
é fantástica! Minha única reclamação é que toda a execução de comandos confusos é gerada no início do buffer.Eu felizmente uso
M-x find-grep-dired
por anos. Ele retorna os resultados como um buffer direcionado, que você pode usar.fonte
find-ls-option
) e, afinal, você acaba com algo bastante detalhado, porque não funciona sem ter a data anterior ao nome do arquivo!Solução 1 (melhor solução):
Conselho de instalação ( https://github.com/abo-abo/swiper/blob/master/counsel.el )
Então
M-x counsel-git-grep
.Nenhuma configuração é necessária (o git conhece a raiz e os arquivos do projeto a serem excluídos). Ambos
git grep
ecounsel
é eficiente.O projeto precisa ser gerenciado pelo git.
conselho exige o modo de hera.
Solução 2:
Esta solução usa grep e funciona em qualquer projeto. É inferior à Solução 1 porque é mais lenta e precisa de configuração manual. Também é baseado no modo ivy.
Você precisa criar .dir-locals.el para configurar
simple-project-root
, consulte https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html para obter detalhes técnicosO código na solução 2 é apenas um protótipo. Minha implementação real é muito mais complexa. Veja
counsel-etags-grep
em https://github.com/redguardtoo/counsel-etags/blob/master/counsel-etags.elResumo:
Essas são as duas melhores soluções que conheço.
Se existirem outras soluções melhores, elas precisam pelo menos resolver os problemas abaixo para estarem prontas para a produção,
como obter a palavra-chave grep (por exemplo, obter palavra-chave da região selecionada)
escapar da palavra-chave
se existir um programa grep mais eficiente, devemos usá-lo (ripgrep, the_silver_searcher / ag, ... etc), ou então usar o grep padrão
a janela do candidato deve usar a largura total da tela e os usuários podem filtrar os candidatos interativamente (é por isso que as pessoas usam a hera ou o leme)
devemos mostrar o caminho relativo na janela do candidato
capaz de reutilizar o resultado grepped anterior. Portanto, o resultado anterior deve ser salvo. Você pode usar
ivy-resume
deivy
ouhelm-resume
dehelm
Quando você salva o resultado anterior recebido, o contexto do resultado anterior também deve ser salvo. Por exemplo, no código da Solução 2.
default-directory
é o contexto. Consulte https://github.com/abo-abo/swiper/issues/591 para obter mais detalhes.Expressão regular estendida deve ser usada porque é mais simples e já é usada por
counsel-git-grep
the_silver_searcher / ag.fonte
Gostaria de adicionar outra solução à solução do @chen bin, que também usa
counsel
(mas você não precisa ter um projeto mantidogit
para isso).Você precisa instalar o ag (o pesquisador prateado) e
counsel
fornece o comandocounsel-ag
que pesquisa o diretório atual pela string inserida.Se você deseja pesquisar em um projeto (não apenas no diretório de trabalho atual), adicione-o ao seu
.emacs
: -Esta função será usada
ag
para pesquisar recursivamente o diretório raiz do projeto.Editar : a função acima é padronizada com o símbolo no ponto de pesquisa. Se você não gostar desse comportamento, substitua
(thing-at-point 'symbol)
pornil
. E se você quiser que os resultados da pesquisa sejam impressos em bufferC-c C-oEdit2 : se você
ripgrep
instalou, você pode substituícounsel-ag
-locounsel-rg
pela função acima e ela também ficará boa :)fonte
projectile-project-root
possível encontrar a raiz do projeto Rails?rag/...
?rag/
prefixo e que os torna fácil de encontrar sobM-x
:)Aqui está um exemplo de uma função grep personalizada que recebe recursivamente o conteúdo do arquivo (usando uma regexp para o termo de pesquisa) em um diretório e seus subdiretórios e exibe os resultados com linhas de contexto antes e depois. As bibliotecas internas
compile.el
egrep.el
fornecem vários métodos para ir para o local no arquivo que contém os resultados da pesquisa. Não é necessário instalar mais nada para este exemplo funcionar - tudo o que é necessário é uma versão completa do Emacs e um computador com ogrep
utilitário instalado. A variávelgrep-program
pode ser ajustada para apontar para um local específico dogrep
utilitário, se o padrão não for suficiente.fonte
multiple-cursors
ewgrep
. Faz a modificação de vários arquivos de uma só vez. Essas bibliotecas, no entanto, precisariam ser instaladas se esses recursos forem desejados.rgrep
?rgrep
consome tempo para personalizar meus critérios de pesquisa de regex preferidos e escolhi codificar tudo em uma função personalizada (que uso várias vezes ao dia). Se você gostaria de escrever uma resposta alternativa que descreva como personalizarrgrep
, isso seria útil para outros leitores do fórum no futuro.