Sep 21

CEDET (Collection of Emacs Development Environment Tools)

Tag: basicoverdrive @ 11:58 am

CEDET (Collection of Emacs Development Environment Tools) tiene como objetivo el crear un entorno avanzado de desarrollo en emacs mediante un conjunto de herramientas.

CEDET provee de un sistema de manejo de proyectos, construcción de Makefiles, un gran sistema de autocompletion, auto ayuda sobre los prototipos de métodos y propiedades de objetos, además de analiza dónde están referenciados los símbolos mediante el uso de Gnu global, IDs, Cscope, find/grep, etc. Además de la generación de código con un sistema de plantillas (templates) independiente del lenguaje. También implementa la generación de comentarios de código mediante texinfo, creando documentos con estilo doxygen. Además de ello, CEDET permite crear diagramas UML de manera manual o bien automática analizando el código fuente mediante la utilidad COGRE. Por último CEDET permite el uso de búsqueda y visualización avanzada de código mediante herramientas como ECB (Emacs Code Browser) explicado en el siguiente artículo.

Basicamente CEDET se divide en distintas partes:

  • EDE (Emacs Development Environment): que cubre el sistema de manejo de proyectos.
  • Semantic: infrastructura para parsear basado en el análisis de texto.
  • SRecode: sistema de manejo de plantillas (templates).
  • COGRE (Connected Graph Editor): Es una libreria base para edición y manipulación de gráficos conectados.
  • Speedbar: Permite crear marcos especializados en el listado de directorios.
  • EIEIO (Enhanced Implementation of Emacs Interpreted Objects): implementa el control de la metodología de desarrollo orientado a objetos siguiendo el standard CLOS (Common Lisp Object System).
  • Otras herramientas:
    • inversion: sistema de nivel de versiones de paquetes.
    • mode-local: paquete para manejar funciones y variables.
    • working: un busy meter.
    • cedet-autogen: generadores de autocarga para EIEIO y Semantic.
    • ezimage: Forma para declarar y mostrar imágenes de todas las versiones.
    • pulse: overlay color pulsing.
    • pprint: pretty printer para valores de elisp.
    • data-debug: navegador de estructuras de datos con su depurador.
    • cedet-files: para el manejo de directorios y ficheros.
    • cedet-global: referencia de sámbolos mediante Gnu/Global.
    • cedet-idutils: referencia de símbolos mediante idutils.
    • cedet-cscope: referencia de símbolos mediante cscope.
    • checkdoc: checkea el estilo de la documentación y comentarios.
    • C-parse: para parseo de ficheros en C, Semantic es la utilidad que lo substituye.
    • X11 lib calls for emacs: Interfaz de red binaria para X windows.
    • XWEM: Window Manager Written in Emacs.
    • Hangman: un juego.

Para instalarlo en MacOS, primero debemos descargar CEDET de:

http://sourceforge.net/projects/cedet/files/

Una vez hecho esto descomprimiremos CEDET con tar xvf cedet-version.tar. Después de ello entraremos en el directorio creado y ejecutaremos:

emacs -Q -l cedet-build.el -f cedet-build
Esto compilará CEDET dentro de emacs usando su interprete lisp. Una vez hecho esto añadiremos a nuestro .emacs (nótese que las rutas pueden variar dependiendo de dónde se haya descomprimido CEDET):
(load-file "~/cedet-1.0pre6/common/cedet.el")
(global-ede-mode 1)                      ; Enable the Project management system
(semantic-load-enable-code-helpers)      ; Enable prototype help and smart completion
(global-srecode-minor-mode 1)            ; Enable template insertion menu
Y ejecutaremos Emacs. Si todo funciona bien podemos añadir ciertas líneas interesantes en nuestro .emacs para CEDET tales como:
;; Author CEDET conf
(semantic-load-enable-excessive-code-helpers)
(semantic-load-enable-semantic-debugging-helpers)

(setq senator-minor-mode-name "SN")
(setq semantic-imenu-auto-rebuild-directory-indexes nil)
(global-srecode-minor-mode 1)
(global-semantic-mru-bookmark-mode 1)

(require 'semantic-decorate-include)

;; GCC setup
(require 'semantic-gcc)

;; Smart completions
(require 'semantic-ia)

(setq-mode-local c-mode semanticdb-find-default-throttle
                '(project unloaded system recursive))

(setq-mode-local c++-mode semanticdb-find-default-throttle
                '(project unloaded system recursive))

(setq-mode-local erlang-mode semanticdb-find-default-throttle
                '(project unloaded system recursive))

(require 'eassist)

;; Customisation of modes
(defun my-cedet-hook ()
 (local-set-key [(control return)] 'semantic-ia-complete-symbol-menu)
 (local-set-key "\C-c?" 'semantic-ia-complete-symbol)
 (local-set-key "\C-c>" 'semantic-complete-analyze-inline)
 (local-set-key "\C-c=" 'semantic-decoration-include-visit)
 (local-set-key "\C-cj" 'semantic-ia-fast-jump)
 (local-set-key "\C-cq" 'semantic-ia-show-doc)
 (local-set-key "\C-cs" 'semantic-ia-show-summary)
 (local-set-key "\C-cp" 'semantic-analyze-proto-impl-toggle)
 )

;;(add-hook 'semantic-init-hooks 'my-cedet-hook)
(add-hook 'c-mode-common-hook 'my-cedet-hook)
(add-hook 'lisp-mode-hook 'my-cedet-hook)
(add-hook 'emacs-lisp-mode-hook 'my-cedet-hook)
;; (add-hook 'erlang-mode-hook 'my-cedet-hook)

(defun my-c-mode-cedet-hook ()
 (local-set-key "." 'semantic-complete-self-insert)
 (local-set-key ">" 'semantic-complete-self-insert)
 (local-set-key "\C-ct" 'eassist-switch-h-cpp)
 (local-set-key "\C-xt" 'eassist-switch-h-cpp)
 (local-set-key "\C-ce" 'eassist-list-methods)
 (local-set-key "\C-c\C-r" 'semantic-symref)
 )

(add-hook 'c-mode-common-hook 'my-c-mode-cedet-hook)

;; Hooks, specific for semantic
(defun my-semantic-hook ()
;; (semantic-tag-folding-mode 1)
(imenu-add-to-menubar "TAGS")
)

(add-hook 'semantic-init-hooks 'my-semantic-hook)

(custom-set-variables
 '(semantic-idle-scheduler-idle-time 3)
 '(semantic-self-insert-show-completion-function (lambda nil
(semantic-ia-complete-symbol-menu (point))))
 '(global-semantic-tag-folding-mode t nil (semantic-util-modes)))
;(global-semantic-folding-mode 1)
(global-semantic-tag-folding-mode 1)

;; PROBLEM WITH MACOS AND BELOW LINES (all related with semanticdb-*)
;; GNU global support
;;(require 'semanticdb-global)
;;(semanticdb-enable-gnu-global-databases 'c-mode)
;;(semanticdb-enable-gnu-global-databases 'c++-mode)
;;(semantic-add-system-include "~/exp/include" 'c++-mode)
;;(semantic-add-system-include "~/exp/include" 'c-mode)

;;; EDE customization
(require 'semantic-lex-spp)
(global-ede-mode t)

;; PROBLEM WITH MACOS BELOW LINES (possible path problem - boost)
;; cpp-tests project definition
;; (setq cpp-tests-project
;;       (ede-cpp-root-project "cpp-tests" :file"~/projects/lang-exp/cpp/CMakeLists.txt"
;;                             :system-include-path '("/home/ott/exp/include"
;; "/home/ott/exp/include/boost-1_38")
;;                             :local-variables '(
;;                                                (compile-command ."cd ~/projects/lang-exp/cpp/; make -j2")
;;                                                )
;;                             ))

;; (setq squid-gsb-project
;;       (ede-cpp-root-project "squid-gsb" :file "~/projects/squid-gsb/README"
;;                             :system-include-path
;;                               '("/home/ott/exp/include""/home/ott/exp/include/boost1_38")
;;                             :local-variables '(
;;                               (compile-command ."cd ~/projects/squid-gsb/Debug/; make -j2")
;;                                                )
;;                             ))

;; My functions for EDE
(defun my-ede-get-local-var (fname var)
 "fetch given variable var from :local-variables of project of file fname"
 (let* ((current-dir (file-name-directory fname))
        (prj (ede-current-project current-dir)))
   (when prj
     (let* ((ov (oref prj local-variables))
           (lst (assoc var ov)))
       (when lst
         (cdr lst))))))

;; Setup compile package
;; TODO: allow to specify function as compile-command
(require 'compile)
(setq compilation-disable-input nil)
(setq compilation-scroll-output t)
(setq mode-compile-always-save-buffer-p t)

(defun My-Compile ()
 "Saves all unsaved buffers, and runs 'compile'."
 (interactive)
 (save-some-buffers t)
 (compile (or (my-ede-get-local-var (buffer-file-name
 (current-buffer)) 'compile-command)
              compile-command)))
(global-set-key [f9] 'My-Compile)

A partir de la versión 24 de Emacs, CEDET estará integrado dentro del propio paquete principal, por lo que no serán necesarios estos pasos y se impulsará el desarrollo de dicha utilidad.

2 Responses to “CEDET (Collection of Emacs Development Environment Tools)”

  1. GNU/Emacs » Emacs TAGS, ETAGS, GNU/make, Automake y Autoconf says:

    […] anteriores el usar el c-mode, con los keystrokes habituales y más útiles. También comentamos el uso de CEDET como un conjunto de utilidades destinadas a este fin. Aquí comentaremos el uso de algunas […]

  2. GNU/Emacs » JDEE (Java Development Environment for Emacs) says:

    […] la instalación de CEDET ya la hemos explicado en artículos anteriores, pasaremos a explicar como instalar la biblioteca ELisp, Elib (aquí se puede ver la documentación […]

Leave a Reply

You must be logged in to post a comment.