Solution 1 (meilleure solution):
Installer l'avocat ( https://github.com/abo-abo/swiper/blob/master/counsel.el )
Alors M-x counsel-git-grep
.
Aucune configuration requise (git connaît la racine du projet et les fichiers à exclure). Les deux git grep
et counsel
est efficace.
Le projet doit être géré par git.
l'avocat requiert le mode lierre.
Solution 2:
Cette solution utilise grep et fonctionne sur n'importe quel projet. Elle est inférieure à la Solution 1 car elle est plus lente et nécessite une configuration manuelle. Il est également basé sur le mode lierre.
(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))))))))
Vous devez créer .dir-locals.el pour l'installation simple-project-root
, voir https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html pour les détails techniques
Le code de la solution 2 n'est qu'un prototype. Ma véritable implémentation est beaucoup plus complexe. Voir counsel-etags-grep
dans https://github.com/redguardtoo/counsel-etags/blob/master/counsel-etags.el
Sommaire:
Ce sont les deux meilleures solutions que je connaisse.
S'il existe d'autres meilleures solutions, elles doivent au moins résoudre les problèmes ci-dessous pour être prêtes pour la production,
comment obtenir le mot clé à grep (par exemple, obtenir le mot clé de la région sélectionnée)
échapper au mot-clé
s'il existe un programme grep plus efficace, nous devrions l'utiliser (ripgrep, the_silver_searcher / ag, ... etc), ou bien utiliser le grep par défaut
la fenêtre des candidats doit utiliser toute la largeur de l'écran et les utilisateurs peuvent filtrer les candidats de manière interactive (c'est pourquoi les gens utilisent du lierre ou du casque)
nous devons montrer le chemin relatif dans la fenêtre candidate
capable de réutiliser le résultat grepped précédent. Le résultat précédent doit donc être enregistré. Vous pouvez utiliser ivy-resume
depuis ivy
ou helm-resume
depuishelm
Lorsque vous enregistrez le résultat précédent, le contexte du résultat précédent doit également être enregistré. Par exemple, dans le code de la Solution 2. default-directory
est le contexte. Voir https://github.com/abo-abo/swiper/issues/591 pour plus de détails.
L'expression régulière étendue doit être utilisée car elle est plus simple et est déjà utilisée par counsel-git-grep
the_silver_searcher / ag.
helm-projectile-grep
commande (si vous avez installé un projectile de barre) ouprojectile-grep
?