Sep 21 2009

ECB (Emacs Code Browser)

Tag: basicoverdrive @ 1:39 pm

ECB (Emacs Code Browser) es una feature para Emacs que muestra un número de ventanas informacionales que generan una vista general así como facilitan la navegación de código fuente. Para utilizar ECB es requerido tener instalado y configurado CEDET (explicado en el artículo anterior) y al menos emacs 21 o superior. Además de ello, ECB se puede combinar (de manera perfectamente compatible) con el paquete JDEE (Java Development Environment for Emacs).

Las ventanas informacionales que puede mostrar ECB son:

  • ECB-Directorioes: Un árbol de directorios.
  • ECB-Sources: Lista de ficheros del directorio actual (con soporte completo de VC (Version Control)).
  • ECB-Methods: Lista de funciones, clases, métodos del fichero actual (usando CEDET-Semantic, Imenu, Etags, etc… para obtener un listado sobre el lenguaje actual).
  • ECB-History: Historial de ficheros visitados.
  • ECB-Analyse: Ventana ECB Auto-updated para Semantic-analyzer.
  • ECB-Symboldef: Ventana para mostrar la documentación del símbolo actual.

Además de ello incluye:

  • Un speedbar.
  • La salida (output) de la compilación (Compilation-window).

ECB tiene en cuenta comandos como C-x 1 para seguir manteniendo la información visible con el manejo y modificación de ventanas. Lo que primero debemos hacer es decargar ECB de la web oficial:

http://ecb.sourceforge.net/

Hecho esto, tan sólo debemos descomprimir ECB con tar xvf ecb-version.tar y añadir ciertas líneas a nuestro .emacs:

(add-to-list ‘load-path «~/ecb-2.40») ;; Add ECB-install-directory to the load-path

(load-file «~/ecb-2.40/ecb.el») ;; Add to load-path

(require ‘ecb) ;; Load ECB (ECB-options available after this step)

(require ‘ecb-autoloads) ;; Load ECB after starting it (fast loading but ECB-* and semantic-options available after ECB)

Al final el conjunto de ventanas suele quedar así:

Por último decir que se puede obtener un mayor control de las ventanas fundamentales, pero para no extenderme más en el artículo mostraré el camino para quién quiera profundizar.


Sep 21 2009

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.