Búsqueda de proyectos recursivos de Emacs.
project textmate (8)
Estoy cambiando a Emacs desde TextMate. Una característica de TextMate que realmente me gustaría tener en Emacs es el cuadro de búsqueda "Buscar en el proyecto" que usa la coincidencia aproximada. Emacs tiene algo así con ido , pero ido no busca de forma recursiva a través de directorios secundarios. Busca solo dentro de un directorio.
¿Hay alguna forma de darle a la raíz un directorio raíz y buscar todo lo que hay debajo?
Actualizar:
Las siguientes preguntas corresponden a find-file-in-project.el de la respuesta de Michał Marczyk.
Si algo en este mensaje parece obvio es porque he usado Emacs durante menos de una semana. :-)
Como lo entiendo, las variables de proyecto local me permiten definir cosas en un archivo de proyecto .emacs que guardo en la raíz de mi proyecto.
¿Cómo dirijo el archivo de búsqueda en el proyecto a la raíz de mi proyecto?
No estoy familiarizado con la sintaxis de expresiones regulares en Emacs Lisp. El valor predeterminado para ffip-regexp es:
".*//.//(rb//|js//|css//|yml//|yaml//|rhtml//|erb//|html//|el//)"
Supongo que puedo cambiar las extensiones a las apropiadas para mi proyecto.
¿Podrías explicar las opciones de ffip-find? Desde el archivo:
(defvar ffip-find-options "" "Opciones adicionales para pasar a` find ''cuando se usa find-file-in-project.
Use esto para excluir partes de su proyecto: / "- no -regex //". vendedor. // "/" ")
¿Qué significa esto exactamente y cómo lo uso para excluir archivos / directorios?
¿Podrías compartir un ejemplo de archivo .emacs-project?
Para una velocidad pura y sin adulteración, recomiendo una combinación de la herramienta de línea de comandos The Silver Searcher (también conocida como ''ag'') con ag.el La función interactiva de ag-project
hará una estimación informada de la raíz de su proyecto si está utilizando git, hg o svn y busca en todo el proyecto.
Puede obtener el efecto que desee utilizando GNU Global o IDUtils. No son específicos de Emacs, pero tienen scripts de Emacs que integran ese efecto. (No sé mucho sobre ellos yo mismo).
También puede optar por utilizar CEDET y el sistema de proyectos EDE. EDE es probablemente un poco pesado, pero tiene una forma de marcar la parte superior de un proyecto. Si también mantiene los archivos de índice de GNU Global o IDUtils con su proyecto, EDE puede usarlo para encontrar un archivo por nombre en cualquier lugar, o puede usar `semantic-symref ''para encontrar referencias a los símbolos en sus archivos de origen. CEDET está en http://cedet.sf.net
Sorprendido, nadie mencionó github.com/defunkt/textmate.el (ahora tengo que hacerlo funcionar en Windows ...)
Vea estos enlaces para obtener información sobre cómo Icicles puede ayudar aquí:
- encuentre archivos en cualquier lugar , haciendo coincidir cualquier parte de su nombre (incluidas las partes del directorio)
- projects : crear, organizar, gestionar, buscarlos.
La coincidencia de finalización de carámbanos puede ser subcadena, expresión regular, difusa (varios tipos) o combinaciones de estos. También puede combinar patrones simples, intersectando las coincidencias o complementando (restando) un subconjunto de ellas
Yo uso Mx rgrep para esto. Omite automáticamente muchas cosas que no desea, como directorios .svn.
eproject tiene eproject-grep
, que hace exactamente lo que quieres.
Con la definición de proyecto correcta, solo buscará archivos de proyecto; ignorará el control de versiones, creará artefactos, generará archivos, lo que sea. El único inconveniente es que requiere un comando grep en su sistema; esta dependencia será eliminada pronto.
FileCache también puede ser una opción. Sin embargo, tendría que agregar el directorio de su proyecto manualmente con el file-cache-add-directory-recursively
.
(Se actualizó principalmente para incluir instrucciones de configuración reales para su uso con el archivo Find-file-in-project.el mencionado más abajo de la distribución RINARI. La respuesta original se dejó intacta; los nuevos bits aparecen después de la segunda regla horizontal).
Eche un vistazo a la página TextMate de EmacsWiki. Lo más prometedor que mencionan es probablemente este script de Emacs Lisp , que proporciona una búsqueda recursiva en un "directorio de proyectos" guiado por algunas variables. Ese archivo comienza con una extensa sección de comentarios que describe cómo usarlo.
Lo que lo hace particularmente prometedor es el siguiente bit:
;; If `ido-mode'' is enabled, the menu will use `ido-completing-read''
;; instead of `completing-read''.
Tenga en cuenta que no lo he utilizado yo mismo ... ¡Aunque puedo intentarlo ahora que lo he encontrado! :-)
HTH.
(Por cierto, ese script es parte de - para citar la descripción de GitHub - "Rinari no es un IDE de Rails (es un modo menor de Emacs para Rails)". Si está realizando algún desarrollo de Rails, es posible que desee Echa un vistazo a todo el asunto.
Antes de continuar, configura ido En serio, es imprescindible tenerlo por sí solo y mejorará su experiencia con find-file-in-project. Vea este video de Stuart Halloway (que ya mencioné en un comentario sobre esta respuesta) para saber por qué necesita usarlo. Además, Stu demuestra cuán flexible es la idola al emular a su manera la facilidad de búsqueda de archivos del proyecto TextMate; Si su función se adapta a sus necesidades, no lea más.
Ok, así que aquí está cómo configurar el archivo de find-file-in-project.el
de RINARI find-file-in-project.el
:
Obtenga
find-file-in-project.el
yproject-local-variables.el
de la distribución RINARI y colóquelos en un lugar donde Emacs pueda encontrarlos (lo que significa que en uno de los directorios en la variableload-path
; puede usar(add-to-list ''load-path "/path/to/some/directory")
para agregar nuevos directorios a ella.Agregue
(require ''find-file-in-project)
a su archivo.emacs
. También agregue lo siguiente para que la secuenciaCx CMf
elCx CMf
búsqueda de archivo en el proyecto:(global-set-key (kbd "Cx CMf") ''find-file-in-project)
.Cree un archivo llamado
.emacs-project
en el directorio raíz de su proyecto. Como mínimo, debe contener algo como esto:(setl ffip-regexp ".*//.//(clj//|py//)$")
. Esto lo hará para que solo los archivos cuyos nombres y enclj
opy
se busquen; por favor, ajuste la expresión regular para satisfacer sus necesidades. (Tenga en cuenta que esta expresión regular se pasará a la utilidad defind
Unix y debería usar la sintaxis de expresión regular preferida defind
. Todavía tiene que duplicar cada barra diagonal inversa en expresiones regulares como es habitual en Emacs; si también tiene que colocar barras diagonales inversas antes de los parens / tuberías (|
) si desea utilizar su significado de expresión regular "mágica" depende de las expectativas de sufind
. El ejemplo dado anteriormente funciona para mí en una caja de Ubuntu. Busque información adicional sobre expresiones regulares en caso de duda.) (Nota: este párrafo se ha revisado en la última edición para corregir la sintaxis de expresiones regulares de la confusión y la escritura.Cx CMf
distancia.
Hay una serie de posibles personalizaciones; en particular, puede usar (setl ffip-find-options "...")
para pasar opciones adicionales al comando de find
Unix, que es a lo que se find-file-in-project.el
bajo el capó.
Si parece que las cosas no funcionan, compruebe y (setl ffip-regex ...)
revisar su ortografía: hice algo como (setl ffip-regex ...)
una vez (note la falta de la ''p'' final en el nombre de la variable) y al principio estaba bastante desconcertado para descubrir que no se encontraban archivos.