Estoy usando Emacs durante bastante tiempo y todavía de alguna manera no entiendo cuál es la mejor manera de grep (recursivamente) para una cadena dentro de un directorio (proyecto) y obtener los resultados presentados como un búfer directo o en algunos más manera útil Por favor iluminame.
14
helm-projectile-grep
comando (si tienes instalado el proyectil helm) oprojectile-grep
?helm
o quéprojectile
es, pero si es una herramienta recomendada, la instalaría y la aprendería.projectile-grep
. Además, le recomiendo que instale elhelm
paquete. No me puedo imaginar ejecutar emacs sinhelm
yhelm-projectile
. También puede ser interesante en elhelm-ag
paquete (que proporciona una interfaz de timón para el buscador de plata en emacs, que supuestamente es más rápido que grep o ack).M-x grep
no hace lo que necesita. Te permite dar una línea de comando arbitraria, a veces la usofind
allí cuando necesito la recursividad.Respuestas:
Bueno, como la pregunta original no menciona
rgrep
, seguiré y lo señalaré aquí. Esta es la opción más simple ya integrada en Emacs, y he encontrado que es más que suficiente para la mayoría de las cosas.De la documentación,
La búsqueda se limita a los nombres de archivo que coinciden con el patrón de shell FILES.
Así, por ejemplo, para buscar todos los archivos pitón debajo de mi directorio principal para los usos de
some_function
, yo diría que es consome_function
,*.py
,~/
como los argumentos. Los resultados se muestran en un nuevo búfer.fuente
find-grep-dired
también, ya que OP mencionó "resultados presentados como un búfer directo o ..."find-grep-dired
, siéntase libre de agregarlo a la respuesta.rgrep
hace un buen trabajo al apuntar a la búsqueda que no hubo diferencias significativas de velocidad entre ellos. (Quiero decir que rgrep era marginalmente más rápido en algunos casos, pero no lo recuerdo con certeza.)next-error
yprevious-error
se puede utilizar para navegar por el conjunto de resultados. EncuentroM-g M-n
yM-g M-p
el más conveniente de los enlaces estándar.find-grep-dired
no me da un búfer con enlaces de referencias cruzadas.rgrep
lo hace por mí y esa última sugerencia sobrenext-error
previous-error
es fantástica! Mi única objeción es que todos los resultados de ejecución de comandos desordenados al comienzo del búfer.Felizmente uso
M-x find-grep-dired
por años. Devuelve los resultados como un búfer dired, que podría usar.fuente
find-ls-option
) y, después de todo, termina con algo bastante detallado porque no funciona sin tener la fecha antes del nombre de archivo!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
ycounsel
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.
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écnicosEl 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.elResumen:
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
desdeivy
ohelm-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.fuente
Me gustaría agregar otra solución a la solución de @chen bin que también usa
counsel
(pero no necesita tener un proyecto mantenidogit
para esto).Necesita instalar ag (el buscador plateado) y
counsel
proporciona el comandocounsel-ag
que busca en el directorio actual la cadena ingresada.Si desea buscar dentro de un proyecto (no solo el directorio de trabajo actual), agregue esto a su
.emacs
: -Esta función se usará
ag
para buscar recursivamente el directorio raíz del proyecto.Editar : la función anterior se predetermina al símbolo en el punto de búsqueda. Si no le gusta ese comportamiento, reemplácelo
(thing-at-point 'symbol)
connil
. Y si quieres los resultados de búsqueda en su propio búfer, presionaC-c C-oEdit2 : si has
ripgrep
instalado, se puede reemplazarcounsel-ag
concounsel-rg
la función anterior y va igual de bien :)fuente
projectile-project-root
utilizable para encontrar la raíz del proyecto Rails?rag/...
?rag/
prefijo y eso las hace fáciles de encontrar enM-x
:)Aquí hay un ejemplo de una función grep personalizada que greps recursivamente el contenido del archivo (usando una expresión regular para el término de búsqueda) en un directorio y sus subdirectorios, y muestra los resultados con líneas de contexto antes y después. El incorporado
compile.el
y lasgrep.el
bibliotecas proporcionan varios métodos para saltar a la ubicación en el archivo que contiene los resultados de búsqueda. No es necesario instalar nada más para que este ejemplo funcione: todo lo que se necesita es una versión completa de Emacs y una computadora que tengagrep
instalada la utilidad. La variablegrep-program
se puede ajustar para apuntar a una ubicación particular de lagrep
utilidad si el valor predeterminado no es suficiente.fuente
multiple-cursors
ywgrep
. Hace que la modificación de múltiples archivos de una sola vez sea muy fácil. Sin embargo, dichas bibliotecas tendrían que instalarse si se desean esas características.rgrep
?rgrep
lleva mucho tiempo personalizarla según mis criterios de búsqueda de expresiones regulares preferidos, y elegí codificar todo en una función personalizada (que uso varias veces al día). Si desea escribir una respuesta alternativa que describa cómo personalizarlargrep
, sería útil para otros lectores del foro en el futuro.