2012-05-16 16 views
5

He intentado hacer funcionar mi configuración de Emacs para el desarrollo de Java. Es bastante bueno: tengo el modo malabar funcionando y tengo GNU Global trabajando para la navegación de etiquetas. Lo único que no puedo hacer es obtener semántica para usar gnu global correctamente. Ninguna de mis importaciones se encuentra.Configuración de Emacs 23.4, CEDET 1.1 y SemanticDB para usar GNU Global en Windows

En primer lugar, este es un proyecto de varios módulos de Maven con todas las fuentes extraídas de la carpeta del proyecto raíz de nivel superior. Todos los otros proyectos están debajo de este en el árbol de directorios. Hay una única base de datos GTAGS en esta carpeta raíz que cubre todo.

cosas que funcionan:

  • M-x gtags-find-tag RET symbol RET funciona bien, por lo que la base de datos es buena y global puede encontrarlo.
  • M-x cedet-gnu-global-version-check funciona e informa que mi versión es buena.
  • M-x cedet-gnu-global-expand-filename funciona
  • M-x semanticdb-find-test-translate-path muestra una "GNU global de búsqueda de tabla", cuando en un buffer de Java
  • tengo la carpeta de origen JDK configurar como un sistema incluyo carpeta, por lo que las importaciones de núcleo de Java se analizan correctamente.

Mi config java es el siguiente (inicialización CEDET es anterior en el archivo):

(add-local-load-path "malabar/lisp") 

(require 'malabar-mode) 
(setq malabar-groovy-lib-dir (concat emacs-local-site-lisp "malabar/lib")) 
(add-to-list 'auto-mode-alist '("\\.java\\'" . malabar-mode)) 

;; enable semanticdb support for gnu global 
(when (cedet-gnu-global-version-check t) 
    (semanticdb-enable-gnu-global-databases 'java-mode)) 

(add-hook 'java-mode-hook 
    (lambda() 
    (gtags-mode 1))) 

(add-hook 'java-mode-hook 'flymake-mode-on) 

(defun my-java-flymake-init() 
    (list "javac" (list (flymake-init-create-temp-buffer-copy 
        'flymake-create-temp-with-folder-structure)))) 

(add-to-list 'flymake-allowed-file-name-masks 
     '("\\.java$" my-java-flymake-init flymake-simple-cleanup)) 

(add-hook 'java-mode-hook 
     '(lambda() 
     (semantic-add-system-include (getenv "JAVA_HOME") 'java-mode))) 
+0

Por favor, mira a mi [respuesta a la pregunta similares] [1] - que describe cómo utilizar javap + Semántica [1]: http://stackoverflow.com/questions/4173737/how- to-include-standard-jdk-library-in-emacs-semantic/10510736 # 10510736 –

+1

Gracias, pero ya lo he visto y lo he configurado. El problema es que Semántica no sabe dónde están los otros archivos fuente. Como está en un submódulo Maven anidado, los archivos fuente estarán en la carpeta de algún otro proyecto.Si no he construido ese proyecto, ni siquiera habrá archivos de clase para que javap los procese. En algunos casos, los archivos de clase están en un contenedor en algún lugar de mi repositorio Maven local. El uso de la base de datos global de GNU permitirá al menos que SemanticDB encuentre y analice los archivos desconocidos de los otros proyectos de submódulos utilizando la base de datos de etiquetas. – DuckPuppy

+0

Pruebe la versión más reciente de CEDET (de bzr): se extendió para que funcione con Maven, además de que se realizaron algunas correcciones relacionadas con Java, por lo que obtendrá nombres completados también para bibliotecas de terceros –

Respuesta

3

La respuesta está relacionada con cómo sus proyectos se crean, y si está utilizando EDE. EDE es Emacs Development Envornment (juega en IDE) y es cómo CEDET rastrea qué archivos pertenecen a tu proyecto. Ese limitador está relacionado con el rendimiento (buscando menos cosas) y evitando que las configuraciones de un proyecto sangren en otro.

Desafortunadamente, Maven todavía no es compatible con CEDET/EDE. Sin embargo, puede simplemente etiquetar la raíz de su proyecto, y supongo que ede-cpp-root (generalmente utilizado para proyectos de C++) puede ser suficiente. Probablemente deberíamos hacer una versión java de eso.

De todos modos, EDE se puede configurar para usar GNU Global para encontrar archivos rápidamente (consulte el manual de soporte GNU Global con EDE y Semántica) pero su archivo GTAGS debe estar en la raíz del proyecto.

Si está en el proyecto-1 y espera saltar a los archivos del proyecto-2, y GTAGS es la raíz del proyecto-1, no funcionará. Tendría que mover su archivo GTAGS y su proyecto EDE a un directorio padre común.

En su configuración actual, si todo está ya bajo un directorio común con GTAGS, entonces es más probable que solo necesite configurar un proyecto EDE para colgar la función de búsqueda de archivos GTAGS.

Hay hilos en el archivo de la lista de correo cedet-devel de un par de personas que han tenido cierto éxito en esto.

+0

Entonces, un proyecto de EDE sería requerido para que SemanticDB use la base de datos GNU Global? Pensé que habilitar el soporte global de GNU para SemanticDB simplemente usaría la estrategia de búsqueda global predeterminada de GNU para encontrar los archivos de etiquetas y usarlos. – DuckPuppy

+0

Si su archivo fuente está en el mismo directorio que un archivo GTAGS, se puede utilizar para buscar otras etiquetas. Si desea utilizar GTAGS para buscar la ubicación de los archivos (como los archivos de inclusión) que forman parte de EDE, no de SemanticDB. SemanticDB confía en EDE para encontrar archivos para que puedan ser indexados y buscar símbolos. – Eric

+0

Tengo que preguntar, entonces, ¿cuál es el propósito de semanticdb-enable-gnu-global-databases? – DuckPuppy