Appel efficace de plusieurs variantes de la commande grep
Le contexte
J'exécute généralement les variantes suivantes de la grepcommande
grep --color -RHIn ''(recherche dans le répertoire de travail courant)grep --color -RHIn --include='*.org' '' ~/repos/dotfiles/emacs(recherche dans tous les fichiers Org présents dans un répertoire contenant les configurations des autres utilisateurs Emacs)grep --color -RHIn --include='init.el' ~/repos/dotfiles/emacs(recherche dans tous lesinit.elfichiers situés dans le répertoire mentionné ci-dessus)grep --color -RHIn --include='*.org' --include='*.el' '' ~/repos/dotfiles/emacs(recherche dans tous les fichiers.elet.orgfichiers situés dans le répertoire mentionné ci-dessus)
Chaque fois que je veux utiliser l'une de ces variantes, j'appuie sur M-x grepet je les saisis manuellement.
Je cherche des moyens qui peuvent m'aider à éviter de saisir manuellement ces variantes chaque fois que je veux exécuter l'une de celles-ci
Contexte supplémentaire
J'ai essayé ce qui suit
(let ((grep-command "grep --color -RHIn ''")) (call-interactively grep))
(let ((grep-command "grep --color -RHIn --include='*.org' '' ~/repos/dotfiles/emacs")) (call-interactively grep))
...
Le problème avec ceci est que call-interactivelyconsidère la valeur globale de la variable grep-commandau lieu de celle fournie par let. Si cela fonctionnait, alors je n'aurais qu'à faire
; Variant 1
(global-set-key (kbd "C-x g 1")
(let ((grep-command "grep --color -RHIn ''")) (call-interactively grep)))
; Variant 2
(global-set-key (kbd "C-x g 2")
(let ((grep-command "grep --color -RHIn --include='*.org' ''")) (call-interactively grep)))
(... more variants)
La question
Connaissez-vous un meilleur moyen d'automatiser cela pour ne pas avoir à saisir manuellement l'une des grepvariantes? Existe-t-il un package qui afficherait quelque chose comme un menu qui montrerait un élément de menu avec une description pour chaque variante de sorte que lorsqu'un élément est sélectionné, grepest exécuté avec la variante correspondante de l'élément sélectionné?
Si vous n'avez aucune idée, j'apprécierais vraiment que vous expliquiez comment je peux faire une commande ( (call-interactively 'grep), dans ce scénario) pour considérer la valeur d'une variable fournie par let.
Réponses
L'OP peut être intéressé par la hydrabibliothèque d'Abo-Abo:
https://github.com/abo-abo/hydra
Voici un exemple personnalisé qui ne repose pas sur la hydrasélection parmi les choix prédéfinis. La lettre cau début de la interactivedéclaration est un code interactif:https://www.gnu.org/software/emacs/manual/html_node/elisp/Interactive-Codes.htmlIl peut y avoir une meilleure façon d'obtenir une ligne de commande par défaut préféré que le premier choix dans le mini - tampon qui n'implique pas laisser contraignant grep-host-defaults-alistà nil, mais cela semble fonctionner:
;;; Needed so that `pick-a-grep' works correctly the first time it is tried;
;;; otherwise, the let-bound `grep-command' gets ignored the first time around.
(require 'grep)
(defun pick-a-grep (choice)
"Choices for selecting from pre-defined `grep-command'."
(interactive "c[3] is one too many. | [D]o you like eggs?")
(cond
((eq choice ?3)
(let ((grep-host-defaults-alist nil)
(grep-command "grep --color -RHIn ''"))
(call-interactively 'grep)))
((eq choice ?D)
(let ((grep-host-defaults-alist nil)
(grep-command "grep --color -RHIn --include='*.org' '' ~/repos/dotfiles/emacs"))
(call-interactively 'grep)))
(t
(message "You did not select any of the expected choices."))))
Comme suggéré dans la réponse de @lawlist, vous pouvez accomplir cela avec le package hydra .
(require 'grep)
(global-set-key (kbd "C-. g")
(defhydra hydra-grep-variants (:color blue)
"
_r_: Search recursively
_co_: Search configurations (*.org)
_ce_: Search configurations (*.el)
_cm_: Search configurations (*.org, *.el)
"
("r" (let ((grep-host-defaults-alist nil)
(grep-command "grep --color -RHIn '' ."))
(call-interactively 'grep)))
("co" (let ((grep-host-defaults-alist nil)
(grep-command "grep --color -RHIn --include='*.org' '' ~/SourceCode/dotfiles/emacs"))
(call-interactively 'grep)))
("ce" (let ((grep-host-defaults-alist nil)
(grep-find-command (concat "find " path/configs " -type f -name '*.el' ! -path '*/elpa/*' -exec grep --color -HIn '' {} +")))
(call-interactively 'find-grep)))
("cm" (let ((grep-host-defaults-alist nil)
(grep-find-command (concat "find " path/configs " -type f \\( -name '*.org' -o -name '*.el' \\) ! -path '*/elpa/*' -exec grep --color -HIn '' {} +")))
(call-interactively 'find-grep)))))
Appuyez simplement sur C-. C-g {key}pour choisir une grepvariante.