Solución 1 (mejor solución):
Instalar consejo ( https://github.com/abo-abo/swiper/blob/master/counsel.el )
Entonces M-x counsel-git-grep
.
No se necesita configuración (git conoce la raíz del proyecto y los archivos a excluir). Ambos git grep
y counsel
es eficiente.
El proyecto debe ser gestionado por git.
El consejo requiere el modo hiedra.
Solución 2:
Esta solución utiliza grep y funciona en cualquier proyecto. Es inferior a la Solución 1 porque es más lenta y necesita una configuración manual. También se basa en el modo de hiedra.
(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))))))))
Necesita crear .dir-locals.el para configurar simple-project-root
, consulte https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html para obtener detalles técnicos
El código en la solución 2 es solo un prototipo. Mi implementación real es mucho más compleja. Ver counsel-etags-grep
en https://github.com/redguardtoo/counsel-etags/blob/master/counsel-etags.el
Resumen:
Esas son las dos mejores soluciones que conozco.
Si existen otras soluciones mejores, necesitan al menos resolver los siguientes problemas para estar listos para la producción,
cómo obtener la palabra clave para grep (por ejemplo, obtener la palabra clave de la región seleccionada)
escapar de la palabra clave
si existe un programa grep más eficiente, deberíamos usarlo (ripgrep, the_silver_searcher / ag, ... etc), o bien recurrir al grep predeterminado
la ventana candidata debe usar el ancho completo de la pantalla y los usuarios pueden filtrar candidatos de forma interactiva (es por eso que las personas usan hiedra o timón)
debemos mostrar la ruta relativa en la ventana candidata
capaz de reutilizar el resultado anterior de grepped. Por lo tanto, el resultado anterior debe guardarse. Puedes usar ivy-resume
desde ivy
o helm-resume
desdehelm
Cuando guarde el resultado grepizado anterior, también se debe guardar el contexto del resultado anterior. Por ejemplo, en el código de la Solución 2. default-directory
es el contexto. Consulte https://github.com/abo-abo/swiper/issues/591 para obtener más detalles.
La expresión regular extendida se debe usar porque es más simple y ya la usa counsel-git-grep
the_silver_searcher / ag.
helm-projectile-grep
comando (si tienes instalado el proyectil helm) oprojectile-grep
?