{"id":62,"date":"2009-09-21T11:58:41","date_gmt":"2009-09-21T09:58:41","guid":{"rendered":"http:\/\/www.blackhats.es\/wordpress\/?p=62"},"modified":"2022-08-20T18:26:12","modified_gmt":"2022-08-20T16:26:12","slug":"cedet-collection-of-emacs-development-environment-tools-en-macos","status":"publish","type":"post","link":"https:\/\/www.blackhats.es\/wordpress\/?p=62","title":{"rendered":"CEDET (Collection of Emacs Development Environment Tools)"},"content":{"rendered":"<p><strong>CEDET <\/strong>(Collection of Emacs Development Environment Tools) tiene como objetivo el crear un entorno avanzado de desarrollo en emacs mediante un conjunto de herramientas.<\/p>\n<p>CEDET provee de un sistema de manejo de proyectos, construcci\u00f3n de <strong>Makefiles<\/strong>, un gran sistema de <strong>autocompletion<\/strong>, <strong>auto ayuda<\/strong> sobre los prototipos de m\u00e9todos y propiedades de objetos, adem\u00e1s de analiza d\u00f3nde est\u00e1n referenciados los s\u00edmbolos mediante el uso de <strong>Gnu global<\/strong>, <strong>IDs<\/strong>, <strong>Cscope<\/strong>, <strong>find\/grep<\/strong>, etc. Adem\u00e1s de la generaci\u00f3n de c\u00f3digo con un <strong>sistema de plantillas<\/strong> (templates) independiente del lenguaje. Tambi\u00e9n implementa la <strong>generaci\u00f3n de comentarios<\/strong> de c\u00f3digo mediante <strong>texinfo<\/strong>, creando documentos con estilo <strong>doxygen<\/strong>. Adem\u00e1s de ello, CEDET permite crear <strong>diagramas UML<\/strong> de manera manual o bien autom\u00e1tica analizando el c\u00f3digo fuente mediante la utilidad <strong>COGRE<\/strong>. Por \u00faltimo CEDET permite el uso de b\u00fasqueda y visualizaci\u00f3n avanzada de c\u00f3digo mediante herramientas como <strong>ECB <\/strong>(Emacs Code Browser) explicado en el siguiente art\u00edculo.<\/p>\n<p>Basicamente <strong>CEDET <\/strong>se divide en distintas partes:<\/p>\n<ul>\n<li><strong>EDE <\/strong>(Emacs Development Environment): que cubre el sistema de manejo de proyectos.<\/li>\n<li><strong>Semantic<\/strong>: infrastructura para parsear basado en el an\u00e1lisis de texto.<\/li>\n<li><strong>SRecode<\/strong>: sistema de manejo de plantillas (templates).<\/li>\n<li><strong>COGRE <\/strong>(Connected Graph Editor): Es una libreria base para edici\u00f3n y manipulaci\u00f3n de gr\u00e1ficos conectados.<\/li>\n<li><strong>Speedbar<\/strong>: Permite crear marcos especializados en el listado de directorios.<\/li>\n<li><strong>EIEIO <\/strong>(Enhanced Implementation of Emacs Interpreted Objects): implementa el control de la metodolog\u00eda de desarrollo orientado a objetos siguiendo el standard CLOS (Common Lisp Object System).<\/li>\n<li>Otras herramientas:\n<ul>\n<li><strong>inversion<\/strong>: sistema de nivel de versiones de paquetes.<\/li>\n<li><strong>mode-local<\/strong>: paquete para manejar funciones y variables.<\/li>\n<li><strong>working<\/strong>: un busy meter.<\/li>\n<li><strong>cedet-autogen<\/strong>: generadores de autocarga para EIEIO y Semantic.<\/li>\n<li><strong>ezimage<\/strong>: Forma para declarar y mostrar im\u00e1genes de todas las versiones.<\/li>\n<li><strong>pulse<\/strong>: overlay color pulsing.<\/li>\n<li><strong>pprint<\/strong>: pretty printer para valores de elisp.<\/li>\n<li><strong>data-debug<\/strong>: navegador de estructuras de datos con su depurador.<\/li>\n<li><strong>cedet-files<\/strong>: para el manejo de directorios y ficheros.<\/li>\n<li><strong>cedet-global<\/strong>: referencia de s\u00e1mbolos mediante Gnu\/Global.<\/li>\n<li><strong>cedet-idutils<\/strong>: referencia de s\u00edmbolos mediante idutils.<\/li>\n<li><strong>cedet-cscope<\/strong>: referencia de s\u00edmbolos mediante cscope.<\/li>\n<li><strong>checkdoc<\/strong>: checkea el estilo de la documentaci\u00f3n y comentarios.<\/li>\n<li><strong>C-parse<\/strong>: para parseo de ficheros en C, Semantic es la utilidad que lo substituye.<\/li>\n<li><strong>X11 lib calls<\/strong> for emacs: Interfaz de red binaria para X windows.<\/li>\n<li><strong>XWEM<\/strong>: Window Manager Written in Emacs.<\/li>\n<li><strong>Hangman<\/strong>: un juego.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Para instalarlo en MacOS, primero debemos descargar CEDET de:<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"http:\/\/sourceforge.net\/projects\/cedet\/files\/\" target=\"_blank\" rel=\"noopener\">http:\/\/sourceforge.net\/projects\/cedet\/files\/<\/a><\/p>\n<p>Una vez hecho esto descomprimiremos <strong>CEDET <\/strong>con <strong>tar xvf cedet-version.tar<\/strong>. Despu\u00e9s de ello entraremos en el directorio creado y ejecutaremos:<\/p>\n<pre style=\"padding-left: 30px;\">emacs -Q -l cedet-build.el -f cedet-build<\/pre>\n<div><span>Esto compilar\u00e1 <strong>CEDET <\/strong>dentro de emacs usando su interprete lisp. Una vez hecho esto a\u00f1adiremos a nuestro <strong>.emacs<\/strong> (n\u00f3tese que las rutas pueden variar dependiendo de d\u00f3nde se haya descomprimido <strong>CEDET<\/strong>):<\/span><\/div>\n<div>\n<pre style=\"padding-left: 30px;\"><span style=\"color: #ff6600;\"><em>(load-file \"~\/cedet-1.0pre6\/common\/cedet.el\")\r\n(global-ede-mode 1)                      ; Enable the Project management system\r\n(semantic-load-enable-code-helpers)      ; Enable prototype help and smart completion\r\n(global-srecode-minor-mode 1)            ; Enable template insertion menu<\/em><\/span><\/pre>\n<div>Y ejecutaremos Emacs. Si todo funciona bien podemos a\u00f1adir ciertas l\u00edneas interesantes en nuestro <strong>.emacs<\/strong> para <strong>CEDET <\/strong>tales como:<\/div>\n<pre style=\"padding-left: 30px;\"><span style=\"color: #ff6600;\"><em>;; Author CEDET conf\r\n(semantic-load-enable-excessive-code-helpers)\r\n(semantic-load-enable-semantic-debugging-helpers)\r\n\r\n(setq senator-minor-mode-name \"SN\")\r\n(setq semantic-imenu-auto-rebuild-directory-indexes nil)\r\n(global-srecode-minor-mode 1)\r\n(global-semantic-mru-bookmark-mode 1)\r\n\r\n(require 'semantic-decorate-include)\r\n\r\n;; GCC setup\r\n(require 'semantic-gcc)\r\n\r\n;; Smart completions\r\n(require 'semantic-ia)\r\n\r\n(setq-mode-local c-mode semanticdb-find-default-throttle\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0'(project unloaded system recursive))\r\n\r\n(setq-mode-local c++-mode semanticdb-find-default-throttle\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0'(project unloaded system recursive))\r\n\r\n(setq-mode-local erlang-mode semanticdb-find-default-throttle\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0'(project unloaded system recursive))\r\n\r\n(require 'eassist)\r\n\r\n;; Customisation of modes\r\n(defun my-cedet-hook ()\r\n\u00a0(local-set-key [(control return)] 'semantic-ia-complete-symbol-menu)\r\n\u00a0(local-set-key \"\\C-c?\" 'semantic-ia-complete-symbol)\r\n\u00a0(local-set-key \"\\C-c&gt;\" 'semantic-complete-analyze-inline)\r\n\u00a0(local-set-key \"\\C-c=\" 'semantic-decoration-include-visit)\r\n\u00a0(local-set-key \"\\C-cj\" 'semantic-ia-fast-jump)\r\n\u00a0(local-set-key \"\\C-cq\" 'semantic-ia-show-doc)\r\n\u00a0(local-set-key \"\\C-cs\" 'semantic-ia-show-summary)\r\n\u00a0(local-set-key \"\\C-cp\" 'semantic-analyze-proto-impl-toggle)\r\n\u00a0)\r\n\r\n;;(add-hook 'semantic-init-hooks 'my-cedet-hook)\r\n(add-hook 'c-mode-common-hook 'my-cedet-hook)\r\n(add-hook 'lisp-mode-hook 'my-cedet-hook)\r\n(add-hook 'emacs-lisp-mode-hook 'my-cedet-hook)\r\n;; (add-hook 'erlang-mode-hook 'my-cedet-hook)\r\n\r\n(defun my-c-mode-cedet-hook ()\r\n\u00a0(local-set-key \".\" 'semantic-complete-self-insert)\r\n\u00a0(local-set-key \"&gt;\" 'semantic-complete-self-insert)\r\n\u00a0(local-set-key \"\\C-ct\" 'eassist-switch-h-cpp)\r\n\u00a0(local-set-key \"\\C-xt\" 'eassist-switch-h-cpp)\r\n\u00a0(local-set-key \"\\C-ce\" 'eassist-list-methods)\r\n\u00a0(local-set-key \"\\C-c\\C-r\" 'semantic-symref)\r\n\u00a0)\r\n\r\n(add-hook 'c-mode-common-hook 'my-c-mode-cedet-hook)\r\n\r\n;; Hooks, specific for semantic\r\n(defun my-semantic-hook ()\r\n;; (semantic-tag-folding-mode 1)\r\n(imenu-add-to-menubar \"TAGS\")\r\n)\r\n\r\n(add-hook 'semantic-init-hooks 'my-semantic-hook)\r\n\r\n(custom-set-variables\r\n\u00a0'(semantic-idle-scheduler-idle-time 3)\r\n\u00a0'(semantic-self-insert-show-completion-function (lambda nil\r\n(semantic-ia-complete-symbol-menu (point))))\r\n\u00a0'(global-semantic-tag-folding-mode t nil (semantic-util-modes)))\r\n;(global-semantic-folding-mode 1)\r\n(global-semantic-tag-folding-mode 1)\r\n\r\n;; PROBLEM WITH MACOS AND BELOW LINES (all related with semanticdb-*)\r\n;; GNU global support\r\n;;(require 'semanticdb-global)\r\n;;(semanticdb-enable-gnu-global-databases 'c-mode)\r\n;;(semanticdb-enable-gnu-global-databases 'c++-mode)\r\n;;(semantic-add-system-include \"~\/exp\/include\" 'c++-mode)\r\n;;(semantic-add-system-include \"~\/exp\/include\" 'c-mode)\r\n\r\n;;; EDE customization\r\n(require 'semantic-lex-spp)\r\n(global-ede-mode t)\r\n\r\n;; PROBLEM WITH MACOS BELOW LINES (possible path problem - boost)\r\n;; cpp-tests project definition\r\n;; (setq cpp-tests-project\r\n;; \u00a0 \u00a0 \u00a0 (ede-cpp-root-project \"cpp-tests\" :file\"~\/projects\/lang-exp\/cpp\/CMakeLists.txt\"\r\n;; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 :system-include-path '(\"\/home\/ott\/exp\/include\"\r\n;; \"\/home\/ott\/exp\/include\/boost-1_38\")\r\n;; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 :local-variables '(\r\n;; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0(compile-command .\"cd ~\/projects\/lang-exp\/cpp\/; make -j2\")\r\n;; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0)\r\n;; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ))\r\n\r\n;; (setq squid-gsb-project\r\n;; \u00a0 \u00a0 \u00a0 (ede-cpp-root-project \"squid-gsb\" :file \"~\/projects\/squid-gsb\/README\"\r\n;; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 :system-include-path\r\n;;                               '(\"\/home\/ott\/exp\/include\"\"\/home\/ott\/exp\/include\/boost1_38\")\r\n;; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 :local-variables '(\r\n;; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 (compile-command .\"cd ~\/projects\/squid-gsb\/Debug\/; make -j2\")\r\n;; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0)\r\n;; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ))\r\n\r\n;; My functions for EDE\r\n(defun my-ede-get-local-var (fname var)\r\n\u00a0\"fetch given variable var from :local-variables of project of file fname\"\r\n\u00a0(let* ((current-dir (file-name-directory fname))\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0(prj (ede-current-project current-dir)))\r\n\u00a0\u00a0 (when prj\r\n\u00a0\u00a0 \u00a0 (let* ((ov (oref prj local-variables))\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 (lst (assoc var ov)))\r\n\u00a0\u00a0 \u00a0 \u00a0 (when lst\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0 (cdr lst))))))\r\n\r\n;; Setup compile package\r\n;; TODO: allow to specify function as compile-command\r\n(require 'compile)\r\n(setq compilation-disable-input nil)\r\n(setq compilation-scroll-output t)\r\n(setq mode-compile-always-save-buffer-p t)\r\n\r\n(defun My-Compile ()\r\n\u00a0\"Saves all unsaved buffers, and runs 'compile'.\"\r\n\u00a0(interactive)\r\n\u00a0(save-some-buffers t)\r\n\u00a0(compile (or (my-ede-get-local-var (buffer-file-name\r\n (current-buffer)) 'compile-command)\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0compile-command)))\r\n(global-set-key [f9] 'My-Compile)<\/em><\/span><\/pre>\n<\/div>\n<p>A partir de la versi\u00f3n 24 de Emacs, <strong>CEDET <\/strong>estar\u00e1 integrado dentro del propio paquete principal, por lo que no ser\u00e1n necesarios estos pasos y se impulsar\u00e1 el desarrollo de dicha utilidad.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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\u00f3n de Makefiles, un gran sistema de autocompletion, auto ayuda sobre los prototipos de m\u00e9todos y propiedades de objetos, adem\u00e1s de analiza [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[97,99,98,100,104,8,56,101,103,102],"class_list":["post-62","post","type-post","status-publish","format-standard","hentry","category-basic","tag-cedet","tag-cogre","tag-ecb","tag-ede","tag-eieio","tag-emacs","tag-macos","tag-semantic","tag-speedbar","tag-srecode"],"_links":{"self":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/62"}],"collection":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=62"}],"version-history":[{"count":1,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/62\/revisions"}],"predecessor-version":[{"id":781,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/62\/revisions\/781"}],"wp:attachment":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=62"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=62"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=62"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}