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
e counsel
é 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.
(defvar simple-project-root "~/.emacs.d")
(defun simple-grep ()
(interactive)
(unless (featurep 'ivy)
(require 'ivy))
(let* ((default-directory (file-name-as-directory simple-project-root))
(keyword (read-string "Keyword:")))
(ivy-read (format "Grep at %s:" simple-project-root)
(split-string (shell-command-to-string (format "grep -rsnI %s ." keyword)) "\n" t)
:action (lambda (val)
(let* ((lst (split-string val ":"))
(linenum (string-to-number (cadr lst))))
;; open file
(find-file (car lst))
;; goto line if line number exists
(when (and linenum (> linenum 0))
(goto-char (point-min))
(forward-line (1- linenum))))))))
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écnicos
O 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.el
Resumo:
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
de ivy
ou helm-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.
helm-projectile-grep
comando (se você tem o projétil de leme instalado) ouprojectile-grep
?