2010-08-19 24 views
6

Estoy trabajando en un gran proyecto de C++. Estoy trabajando con emacs durante los últimos seis meses. He intentado configurar CEDET para poder navegar fácilmente pero he encontrado algunos problemas.Características de navegación del código fuente de Emacs

1.- A veces la semántica no encuentra algunos símbolos y otras veces no ... No sé claramente qué archivos son índices semánticos. He intentado utilizar EDE (siguiendo las instrucciones en este documento http://alexott.net/en/writings/emacs-devenv/EmacsCedet.html), pero he encontrado algunos problemas también ...

  • Tengo varias versiones (Releases) del mismo proyecto, cada uno en su propia carpeta. ¿Cómo puedo decirle a emacs con qué proyecto estoy trabajando?
  • ¿Cómo puedo decirle a ede dónde buscar mis archivos de encabezado? ¿Puedo especificar solo un directorio raíz y la semántica buscará archivos de encabezado en todos los subdirectorios?

2.- Estuve trabajando con vim + cscope hace algún tiempo y recuerdo que había una forma de volver a navegar en la pila de símbolos (Ctrl-t). ¿Hay algo como esto en emacs?

P.D.> Algunos datos para hacer la pregunta más clara.

Tengo varias versiones del mismo proyecto. Cada uno tiene su propio directorio raíz. Cada proyecto tiene múltiples módulos cada uno dentro de un subdirectorio. Hay un archivo de encabezados en cada módulo.

/home/user/ 
      | 
      \Release-001 
      |   | 
      |   \makefile 
      |   \ Module-001 
      |   |   | 
      |   |   \makefile 
      |   |   \subdir-001 
      |   |   |   \header-001.h 
      |   |   |   \header-002.h 
      |   |   \subdir-002 
      |   |   |   \header-003.h 
      |   \ Module-002 
      |   |   | 
      |   |   \makefile 
      |   |   \subdir-003 
      |   |   |   \header-004.h 
      |   |   |   \header-005.h 
      |   |   \subdir-004 
      |   |   |   \header-006.h 
      | 
      \Release-002 
      |   | 
      |   \makefile 
      |   \ Module-001 
      |   |   | 
      |   |   \makefile 
      |   |   \subdir-001 
      |   |   |   \header-001.h 
      |   |   |   \header-002.h 
      |   |   \subdir-002 
      |   |   |   \header-003.h 
      |   \ Module-002 
      |   |   | 
      |   |   \makefile 
      |   |   \subdir-003 
      |   |   |   \header-004.h 
      |   |   |   \header-005.h 
      |   |   \subdir-004 
      |   |   |   \header-006.h 

Esta es la configuración acerca de EDE que tengo en mi .emacs

;; Cedet load commands 
(add-to-list 'load-path "~/emacs-dir/cedet/cedet") 
(load-file "~/emacs-dir/cedet/cedet/common/cedet.el") 

;; EDE: activating mode. 
(global-ede-mode t) 

;; Projects definition 
(ede-cpp-root-project "Release-001" 
        :name "Release-001" 
        :file "~/Release-001/makefile" 
        :include-path '("/" 
            ) 
        :system-include-path '("~/exp/include") 
        :spp-table '(("SUSE9" . "") 
           ) 
) 
(ede-cpp-root-project "Release-002" 
        :name "Release-002" 
        :file "~/Release-002/makefile" 
        :include-path '("/" 
            ) 
        :system-include-path '("~/exp/include") 
        :spp-table '(("SUSE9" . "") 
           ) 
) 

Sólo para hacerle saber ... Estoy trabajando con la versión de consola (-nw) de emacs.

+0

¿Qué problemas encontraste con EDE? –

+0

He editado la pregunta para agregar información nueva. Gracias por su interés. – thamurath

Respuesta

2

Su configuración es básicamente correcta, a excepción de: include-path para sus proyectos.

Si un archivo fuente dada dice:

#include "Module-001/subdir-002/header-003.h" 

entonces está bien. Si la inclusión dice:

#include "subdir-002/header-003.h" 

entonces su: include-ruta debe tener

:include-path '("/Module-001") 

en ella.

En cuanto a qué cosas tiene índice semántico, indexará su archivo actual, y todo lo que puede encontrar. Use el modo de decoración semántica para ver qué encabezados ha encontrado EDE para determinar si su configuración es precisa.

También indexará todos los archivos en el mismo directorio que está editando, pero solo en tiempo de inactividad, por lo que si no permite que Emacs permanezca inactivo, no lo hará.

Puede acelerar las operaciones de indexación si utiliza CScope como sugiere Bozhidar. A continuación, puede habilitar el soporte de CScope tanto en EDE como en la base de datos semántica. Sin embargo, la inclusión del soporte CScope en Semantic DB es reciente, por lo que necesitaría la versión CVS de CEDET. Eso aseguraría que todo estuviera indexado.

Para navegar hacia atrás, investigue la ayuda para semántica-mru-bookmark-mode. Esto rastrea su progreso a través de sus archivos en una ubicación determinada que es bastante útil y siempre funciona.

+0

Gracias por su respuesta. El problema es que los archivos de encabezado se extienden por todo el proyecto. Cada módulo tiene subcarpetas y los encabezados están dentro de estas subcarpetas, así que especifique todas las rutas donde los encabezados serían un infierno. - ¿Hay alguna manera de decirle a Semmantic que busque encabezados en todos los subdirectorios en una ruta raíz? - Lectura de la documentación de EDE He encontrado que "en lugar de especificar rutas como listas, también puede proporcionar la función, que realizará una búsqueda de incluir archivos en su proyecto". Lamentablemente, no sé elisp. Cualquier lugar donde puedo encontrar un ejemplo? Gracias! – thamurath

+1

El propósito de la ruta de inclusión es hacer que la búsqueda de ruta sea más rápida al enfocarla hacia abajo. Si no hay ningún beneficio para eso, entonces su mejor opción es usar CScope. Una vez que CScope está habilitado como una función de localización de EDE (consulte la variable ede-locate-setup-options), es como tener todo como una ruta de inclusión para todos los archivos. Probablemente haya algunas advertencias pero no he probado este truco para saberlo con certeza. – Eric

0

He utilizado en el pasado el Emacs Code Browser cuando trabajo en proyectos C++ y lo encontré muy satisfactorio: además de grandes archivos y navegación de estructura de código, obtiene una excelente integración VCS (diferentes iconos según el estado actual de un archivo en el proyecto). Junto con ECB utilicé cscope para Emacs, ya que mencionó en vim, probablemente también quiera usarlo en Emacs.

Alternativamente, si quieres una solución más simple, puedes echarle un vistazo al Emacs Nav. También es compatible con algunas cosas extravagantes y no tiene dependencia de semántica y barra de velocidad: solo tendrá que usar etags/ctags para indexar su proyecto.

Cuestiones relacionadas