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-grepcomando (si tienes instalado el proyectil helm) oprojectile-grep?helmo quéprojectilees, pero si es una herramienta recomendada, la instalaría y la aprendería.projectile-grep. Además, le recomiendo que instale elhelmpaquete. No me puedo imaginar ejecutar emacs sinhelmyhelm-projectile. También puede ser interesante en elhelm-agpaquete (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 grepno hace lo que necesita. Te permite dar una línea de comando arbitraria, a veces la usofindallí 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-diredtambién, ya que OP mencionó "resultados presentados como un búfer directo o ..."find-grep-dired, siéntase libre de agregarlo a la respuesta.rgrephace 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-erroryprevious-errorse puede utilizar para navegar por el conjunto de resultados. EncuentroM-g M-nyM-g M-pel más conveniente de los enlaces estándar.find-grep-diredno me da un búfer con enlaces de referencias cruzadas.rgreplo hace por mí y esa última sugerencia sobrenext-errorprevious-errores 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-diredpor 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 grepycounseles 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-grepen 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-resumedesdeivyohelm-resumedesdehelmCuando 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-directoryes 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-grepthe_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 mantenidogitpara esto).Necesita instalar ag (el buscador plateado) y
counselproporciona el comandocounsel-agque 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á
agpara 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
ripgrepinstalado, se puede reemplazarcounsel-agconcounsel-rgla función anterior y va igual de bien :)fuente
projectile-project-rootutilizable 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.ely lasgrep.elbibliotecas 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 tengagrepinstalada la utilidad. La variablegrep-programse puede ajustar para apuntar a una ubicación particular de lagreputilidad si el valor predeterminado no es suficiente.fuente
multiple-cursorsywgrep. 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?rgreplleva 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.