Chiamata efficiente di più varianti del comando grep
Il contesto
Di solito eseguo le seguenti varianti del grepcomando
grep --color -RHIn ''(cerca nella directory di lavoro corrente)grep --color -RHIn --include='*.org' '' ~/repos/dotfiles/emacs(cerca in tutti i file Org presenti in una directory che contiene le configurazioni di altri utenti Emacs)grep --color -RHIn --include='init.el' ~/repos/dotfiles/emacs(cerca in tutti iinit.elfile che si trovano nella directory sopra menzionata)grep --color -RHIn --include='*.org' --include='*.el' '' ~/repos/dotfiles/emacs(cerca in tutti i file.ele.orgfile che si trovano nella directory sopra menzionata)
Ogni volta che desidero utilizzare una di queste varianti, premo M-x grepe le digito manualmente.
Sto cercando modi che possano aiutarmi a evitare di digitare manualmente quelle varianti ogni volta che voglio eseguire una di queste
Contesto aggiuntivo
Ho provato quanto segue
(let ((grep-command "grep --color -RHIn ''")) (call-interactively grep))
(let ((grep-command "grep --color -RHIn --include='*.org' '' ~/repos/dotfiles/emacs")) (call-interactively grep))
...
Il problema con questo è che call-interactivelyconsidera il valore globale della variabile grep-commandinvece di quello fornito da let. Se funzionasse, avrei solo bisogno di farlo
; 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 domanda
Conosci un modo migliore per automatizzarlo in modo da non dover digitare manualmente nessuna delle grepvarianti? Esiste un pacchetto che visualizzerebbe qualcosa di simile a un menu che mostrerebbe una voce di menu con una descrizione per ciascuna variante in modo tale che quando viene selezionata una voce, grepviene eseguita con la variante corrispondente della voce selezionata?
Se non hai idea, ti sarei davvero grato se potessi spiegare come posso fare un comando ( (call-interactively 'grep), in questo scenario) per considerare il valore di una variabile fornita da let.
Risposte
L'OP potrebbe essere interessato alla hydralibreria di Abo-Abo:
https://github.com/abo-abo/hydra
Di seguito è riportato un esempio personalizzato su cui non si basa la hydraselezione tra scelte predefinite. La lettera call'inizio della interactivedichiarazione è un codice interattivo:https://www.gnu.org/software/emacs/manual/html_node/elisp/Interactive-Codes.htmlPotrebbe esserci un modo migliore per ottenere una riga di comando predefinita preferita come prima scelta nel minibuffer che non prevede l'associazione let grep-host-defaults-alista nil, ma sembra funzionare:
;;; 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."))))
Come suggerito nella risposta di @lawlist, puoi farlo con il pacchetto 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)))))
Basta premere C-. C-g {key}per scegliere una grepvariante.