% comment lines begin with the percent symbol and are ignored by
% LaTeX and TeX.  LaTeX commands begin with a back-slash.
\documentstyle[11pt,a4]{article}

\author{Eduardo Cerme\~no GTQ \\  Asociaci\'on para el Fomento del Software Libre \\  UAM \\ }
\title{Entornos de desarrollo universitarios : Emacs}
\begin{document}     % this begins the actual document body
\maketitle           % this actually creates the title block
\begin{abstract}
Esta ponencia trata sobre GNU Emacs (Emacs en adelante), la implementaci\'on de Emacs realizada por 
GNU. La licencia del programa es GPL lo que nos permite la libre distribuci\'on,
copia y modificaci\'on del mismo. Se puede adquirir gratuitamente en la web 
www.gnu.org tanto para plataformas Unix (Linux) como para Windows NT, Windows 95,
y MS-DOS. Estas caracter\'isticas nos interesan mucho porque permiten que sea una
herramienta muy interesante para el desarrollo en las Universidades. No es el objetivo
de esta ponencia hablar de software libre en general pero como Emacs lo es y 
ello aporta beneficios vamos a comentarlos.
  

Al ser gratuito el coste de adquisici\'on es nulo. Como podemos copiarlo
y distribuirlo libremente se puede generalizar su uso sin ning\'un coste 
econ\'omico. La posibilidad de modificarlo puede ser \'util en ciertos ambientes
de investigaci\'on. Finalmente su alta disponibilidad facilita el intercambio de documentos
entre distintas plataformas y la adaptaci\'on de los usuarios a un nuevo entorno.
Es genial poder usar Emacs all\'a donde vayas Windows o Linux.

La definici\'on m\'as com\'un de Emacs es :
'advanced, self-documenting, customizable extensible real-time display editor' 
La parte de real-time display no es muy interesante puesto que se refiere a que todo 
lo que se inserte aparece en pantalla de forma casi immediata. El resto de caracter\'isticas
de la definici\'on nos van a resultar muy \'utiles para mostrar las aplicaciones de Emacs.

\end{abstract}

\section{Emacs: Editor configurable (customizable)}

Emacs ofrece la posibilidad de modificar sus keymaps. El keymap o mapa de teclas
es lo que caracteriza a un editor. Emacs por ejemplo utiliza las siguientes combinaciones
de teclas para cortar y pegar ctrl-space ctrl-w (para cortar) y ctrl-y (para pegar).

Emacs posee distintos tipos de keymaps. El principal se denomina global y afecta a todos los 
modos de edici\'on. Para cada modo denominado 'major' existe otro keymap que define las caracter\'isticas
propias del modo y finalmente para los modos 'minor' tenemos m\'as keymaps que definen las teclas
especiales de esos modos. Solo necesitamos tener una idea aproximada de lo que son los modos en Emacs, y 
espero que seg\'un avancemos esta idea se concrete poco a poco. Las definiciones global se pueden ver como
la base de la pir\'amide sobre la que se basa todo el resto y sin la cual no existiria nada. Un poco como 
el sistema operativo para un ordenador. Los major modes se sobreponen al global de forma que aportan novedades,
es decir nuevas utilidades y en caso de conflicto tienen mayor prioridad porque consideramos que estamos adaptando
nuestro editor a nuestras necesidades concretas que ya no son tan generales. Finalmente los minor modes son una capa
superior que con la misma l\'ogica afinan m\'as el editor.

Podemos modificar cualquiera de estos keymaps de forma sencilla mediante los comandos :
M-x global-set-key
o
M-x local-set-key

Estas modificaciones incluyen tanto la redefinici\'on de teclas como la definici\'on de nuevas
secuencias de teclas que ejecuten nuevas acciones. 

Otra forma interesante de configurar Emacs es redefiniendo sus 'variables'. Estas variables
determinan de muchas formas el comportamiento del editor puesto que definen valores clave para Emacs.
Por ejemplo ¿cuando se realiza el wrapping en Emacs?. Pues el valor que determina esto se encuentra en la variable
'fill-column' que podemos cambiar a nuestro gusto con el comando M-x set-variable. (Para m\'as detalles consultar
el manual on-line sobre la variable que se quiera modificar tecleando C-h v).

Estos son los conceptos b\'asicos sobre la configuraci\'on del editor. Deber\'ia empezar a quedar claro
que en Emacs podemos acceder a casi todo. Esto se debe a que la mayor parte del c\'odigo est\'a escrito en LISP
y nos permite crear nuevos comandos y modificar los ya existentes en una misma sesi\'on, de forma interactiva.

Una pequeña nota sobre la asignaci\'on de teclas. Conviene utilizar las combinaciones de tipo ctrl-c seguido por una 
letra porque este rango esta reservado a este fin. De otra forma podr\'ian surgir conflictos.

\section{Emacs: Auto-ayuda (self-documenting)}
Hasta ahora hemos mostrado una diminuta parte de las posibilidades de Emacs, sin embargo puede parecer 
que el n\'umero de comandos que entrar\'an en juego va a ser muy grande. La verdad es que conocer diez o veinte 
comandos o secuencias de teclas suele bastar para la mayor parte de la actividades habituales. Pero para poder
aprovechar de forma real y efectiva la potencia de Emacs tiene que existir un mecanismo de ayuda que nos permita 
aprender nuevas funciones a medida que las vayamos necesitando, o que simplemente nos recuerde como se utilizaba
tal o tal funci\'on.

Si no recordamos la secuencia de teclas que realiza una funci\'on siempre podemos probar a teclear M-x y 
una parte del nombre que creemos pueda haber sido elegido para nombrar la funci\'on deseada. Por ejemplo
si queremos hacer algo tan sencillo como borrar un car\'acter y no recordamos que hay que pulsar ctl-d, podemos 
teclear M-x delete y desp\'ues una o dos veces el tabulador. Se abrir\'a una ventana nueva (entiendase como ventana
una 'window' de Emacs es decir una subdivisi\'on del 'frame' que es el objeto que se abre al iniciar Emacs) con posibles 
soluciones. Para nuestro ejemplo habremos acertado puesto que no hay muchas y entre ellas se encuentra delete-char. 
Si solo hubiera una soluci\'on el hecho de pulsar el tabulador hubiera completado autom\'aticamente el nombre de la
funci\'on.
Adem\'as del enorme juego que proporciona el tabulador Emacs posee una importante ayuda. Vamos a describir de forma 
muy breve una serie de comandos de ayuda de forma que nos hagamos una idea de como funcionan pero sin entrar en detalle.

C-h a topic RET
Busca los comandos que tengan coincidencias con el topic
C-h i d m emacs RET i topic RET
Busca el topic en los indices del manual on-line de Emacs. Mostrando el primero por pantalla.
C-h F
Muestra la secci\'on FAQ de Emacs donde se pueden realizar b\'usquedas como si se tratase de un documento normal 
de Emacs.
C-h c seguido por una serie de teclas nos indica a que funci\'on est\'an asociadas las teclas.

Siempre es interesante teclear C-h ? para ver el resto de \'opciones que ofrece la ayuda de Emacs.

\section{Emacs: Editor avanzado}
Hemos presenatdo un editor altamente configurable y con una potente ayuda, ahora vamos a mostrar que 
detr\'as de la sobria pantalla de Emacs se esconde un editor muy potento lleno de funcionalidades.
No hemos podido evitar hablar de las 'windows' de Emacs. De forma breve vamos a describir una sesi\'on 
t\'ipica de Emacs. Abrir el editor con la forma deseada (emacs -nw si no se desea activar el entorno 
gr\'afico y queremos trabajar desde consola), una vez abierto abrir tantos archivos como queramos y 
al terminar cerraremos Emacs. Como se indica anteriormente el objeto que abre Emacs al arrancar se denomina
'frame'. Esto es independiente de si estamos en un entorno gr\'afico o no puesto que si lo estamos se abrir\'a
la cl\'asica ventanita de programa y sino el programa se ejecutar\'a en consola. Esa es la \'unica diferenc\'ia
que vamos a notar al editar, a excepci\'on de las funciones que aporta el rat\'on en entornos gr\'aficos.

Una vez tengamos nuestro 'frame' podemos abrir tantos buffers como queramos. En general un buffer corresponde
a un archivo pero tambi\'en se crean buffers para mostrar todo tipo de ayuda, subprocesos...En cualquier momento
podemos cambiar de buffer tecleando ctrl-x b o accediendo al men\'u Buffers (con la tecla F-10 o con el rat\'on).
Al terminar con un buffer no tenemos m\'as que 'matarlo' tecleando ctrl-x k. De esta forma en una \'unica sesi\'on 
podemos tener multitud de archivos y abiertos. Adem\'as podemos tener m\'ultiples 'windows' de Emacs. Esto son 
divisiones del 'frame' que nos permite visualizar de forma simut\'anea varios buffers. N\'otese que esto se puede 
realizar en consola sin ning\'un problema.

Las tareas b\'asicas de un editor son insertar y borrar. Un editor avanzado debe incluir m\'as funciones.
Emacs ofrece multitud de ellas, desde las m\'as comunes como copiar, pegar, cortar, buscar, reeemplazar, macros,
mover bloques, a funciones m\'as complejas y espec\'ificas como son los modos para lenguajes de programaci\'on.

\subsection{Programaci\'on en C}
Al cargar un archivo con extensi\'on .c se carga autom\'aticamente el modo C.
Este modo conoce la estructura de los programas C y asigna un color diferente para diferenciar 
cometarios, instrucciones de precompilador, cadenas de caracteres, palabras reservadas ....
El tabulador sangra el texto de forma que alinea los bloques condicionales y bucles de repetici\'on.
Si el sangrado es incorrecto muy probablemente podemos deducir que las llaves o par\'entesis no est\'an 
balanceadas de forma correcta. Al cerrar una llave el cursor nos indica la apertura, y si \'esta no 
se encuentra en la pantalla, el minibuffer nos indica el contenido de la l\'inea donde se abri\'o la
llave.

El modo C tambi\'en provee comandos para comentar regiones enteras de forma autom\'atica y saltar las
condiciones de precompilador entre otras. Para compilar podemos utilzar el comando M-x compile que por defecto
ejecuta make -k. Este comando esta determinado por la variable compile-command que podemos modificar como hemos
señalado en la parte de configuraci\'on.
Al compilar se abre un buffer *compilation* donde se nos indican los posibles errores que hayan surgido.
Si pulsamos ctrl-c ctrl-c encima de una de las lineas de error el cursor se posicionar\'a en la
posici\'on donde se detect\'o el error.

El proceso de correcci\'on de fallos o bugs se lleva a cabo con el comando M-x gdb que ejecuta dicho 
debugger. Se abre un buffer *gud-nombredelejecutable* donde podemos ejecutar los distintos comandos de debugger
como har\'iamos normalemente. Pero adem\'as en el buffer donde editamos el programa C aparece un indicator
que señala el punto de ejecuci\'on donde nos encontramos. De hecho se pueden ejecutar comandos en este buffer
como por ejemplo ctr-x SPC que inserta un breakpoint. La interacci\'on entre los dos buffers facilita de forma 
importante la tarea de debuggeo.

\subsection{Programaci\'on en Java}
La edici\'on de programas en Java es bastante parecida a la de C, sin embargo existe un proyecto llamado
JDEE que proporciona herramientas muy poderosas para el desarrollo de programas Java en Emacs. 
Por ejemplo tenemos a nuestra disposici\'on un comando que genera documentaci\'on lista para JavaDoc de forma
autom\'atica. Al detectar una palabra reservada de Java intenta completarla y en algunos casos como por ejemplo
if, for... nos pone los par\'entesis, las llaves y un comentario al final. Como \'estas existen diversas ayudas
para la edici\'on que naturalmente pordemos desactivar y modificar a nuestro gusto.

Un punto que merece la pena destacar es el men\'u que muestra los m\'etodos de un objeto. Si tecleamos
ctrl-c ctrl-v ctrl-. despu\'es de teclear un punto, aparecer\'a un men\'u con todos los m\'etodos del objeto.
Si adem\'as del punto hemos escrito el inicio del m\'etodo nos restringir\'a el tamaño del men\'u y en el 
mejor de los casos nos completar\'a con el m\'etodo deseado, que indica entre par\'entesis los tipos de los
argumentos que requiere.

La generaci\'on de c\'odigo se ve mejorada por los wizards y templates. Los wizards son:

Import Wizard \\ Method Override Wizard \\ Interface Wizard \\ Delegate Wizard \\ Abstract Class Wizard \\ Get/Set Wizard

Y los templates generan ; \\
Get/Set Pair, Liesteners, Println u otros definidos por el propio usuario.

La compilaci\'on de los .java se lleva a cabo con el comando activado por las teclas ctrl-c ctrl-v ctrl-c. Al igual 
que en la compilaci\'on de C surge un nuevo buffer que nos informa del resultado de la compilaci\'on. Si esta ha sido o no correcta y donde se han producido los errores. Pulsando ctrl-c ctrl-c pasaremos al buffer de edici\'on al punto exacto
donde se produjo el error.

Para ejecutar una aplicaci\'on Java podemos teclear ctrl-c ctrl-v ctrl-r desde el archivo que contenga la clase main.
Todas estas acciones est\'an gobernadas por variables que podemos definir de forma que los path, y comandos de ejecuci\'onsean exactamente los que queremos. La modificaci\'on de estas variables de realiza como indicamos en la parte de configuraci\'on y el nombre de las mismas se indica en la documentaci\'on de JDEE que se puede consultar en su web: http://jdee.sunsite.dk.

\subsection{Programaci\'on en COMMON-LISP}
Hemos dicho antes que Emacs est\'a escrito en LISP, concretamente en una versi\'on llamada emacs-lisp. Si lo que queremos
es editar common-lisp Emacs nos ofrece las comodidades habituales, indentaci\'on, colores etc... pero adem\'as podemos
utilizar emacs junto con una aplicaci\'on llamada CLISP que es libre.

Basta con añadir unas l\'ineas a nuestro archivo .emacs (del qeu hablaremos m\'as tarde) para tener todas las funcionalidades de CLISP en Emacs. Abrimos dos buffers en uno editaremos nuestro c\'odigo LISP y en el otro tecleamos M-x run-lisp.
Esto cargar\'a el proceso con CLISP y podremos utilizarlo directamente para evaluar expresiones que insertemos o bien, para evaluar expresiones del buffer de edici\'on con c\'odigo LISP.

Los siguientes comandos son los m\'as utilizados para la evaluzaci\'on :
ctrl-c ctrl-e evalua el c\'odigo situado bajo el cursor \\
ctrl-c ctrl-r evalua una regi\'on
ctrl-c ctrl-l evalua todo un archivo.
Para m\'as informaci\'on sobre el uso de CLISP consulte el manual de la web: http://clisp.cons.org/.

\subsection{Edici\'on en VHDL}
Este lenguaje se utiliza para la creaci\'on de hardware. Al abrir un archivo VHDL Emacs carga el modo VHDL
que nos permite editar de forma muy c\'omoda  por su sangrado, colores, y generaci\'on autom\'atica de c\'odigo, entre otras utilidades. El gran pero que he encontrado ha sido la dificultad de encontrar un simulador de VHDL en Linux, pese
a que hay varios proyectos abiertos a d\'ia de hoy no he probado ninguno de forma satisfactor\'ia de forma que espero
poder completar esta secci\'on en un futuro.

\subsection{Mucho m\'as...}
Estos son solo algunos ejemplos con los que tengo m\'as experiencia. Existen muchos m\'as modos de edici\'on de Emacs
que sin duda facilitan la tarea de programadores y usuarios. Este documento ha sido escrito en Emacs, que entre otras cosas facilita la creaci\'on de documentos Latex.

Para terminar con las posibilidades que ofrece Emacs como entorno de desarrollo vamos a señalar la speedbar y los ctags.
La speedbar (o barra r\'apida) se ejecuta tecleando M-x speedbar (entre otras formas). Se crea un nuevo 'frame' en el que
se incluye toda la informaci\'on del directorio. No vamos a describir en detalle el speedbar porque depende del modo
en el que se encuentre Emacs. Por ejemplo en Java resulta especialmente \'util porque para cada subdirectorio (package)
del proyecto incluye un men\'u que podemos desplegar y acceder a sus clases. Adem\'as de las clases se incluyen sus m\'etodos de forma que podmeos saltar de un archivo a otro de forma r\'apida y sencilla.

La limitaci\'on del speedbar es seguir una funci\'on. Es decir si conocemos la funci\'on podemos acceder rapidamente
a su c\'odigo haciendo click en el speedbar pero si no sabemos donde se haya la funci\'on tendremos que buscarla entre
todos los men\'us y esto puede ser largo. Para ello existen las Ctags (o tambi\'en las etags que son propias de Emacs) que nos permiten un r\'apido acceso 
a toda la informaci\'on que necesitemos. No vamos a profundizar mucho en su uso pues puede resultar complejo. A nivel 
b\'asico basta con generar un archivo TAG ejecutando ctags en un directorio. Cuando tengamos el fichero desde Emacs tenemos a nuestra disposici\'on los siguientes comandos :\\
\verb|M-x visit-tags-table <RET> FILE <RET>|\\
Selecciona el fichero TAG\\
\verb|M-. [TAG] <RET>|\\
Busca la primera definici\'on de TAG\\
\verb|M-*|\\
Regresa a la invocaci\'on previa de "M-.".\\
\verb|C-u M-.|\\
Busca una nueva definici\'on del \'ultimo tag.

Ctags est\'a licenciado bajo la GPL y se puede adquirir gratuitamente en la web: http://ctags.sourceforge.net/
donde adem\'as se puede consultar m\'as informaci\'on.

Otra utilidad interesante de Emacs para programadores es su integraci\'on para trabajar con CVS. En el men\'u 
Tools, bajo el ep\'igrafe PCL-CVS encontramos 'Check-out module' que nos pedi\'a el nombre del proyecto y la carpeta
donde deseemos que se copien de forma temporal los archivos. Para actualizar la versi\'on del servidor
es suficiente con acceder a trav\'es del men\'u a 'check in/out' o pulsar ctrl-x v v, nos pedir\'a si queremos realizar
alg\'un comentario y para terminar pulsaremos ctrl-c ctrl-c. Conviene navegar un poco por los men\'us para comprobar
las utilidades de CVS que nos ofrece Emacs.

\section{Emacs: Editor extensible}
En alguna ocasi\'on hemos mencionado el fichero .emacs propio de cada usuario. Este fichero se utiliza para 
poder personalizar Emacs de forma que se adapte a las necesidades del usuario. En \'el podemos incluir toda
la configuraci\'on que deseemos puesto que al cargar, Emacs comprueba si existe un .emacs y carga su contenido.
Sirva como ejemplo las configiuraciones que indicamos en el primer apartado. Si quisieramos que estuvieran presentes
cada vez que iniciamos Emacs, tendriamos que añadir l\'ineas como estas a nuestro fichero .emacs:\\
\begin{verbatim}
(global-set-key [right] 'forward-char)
(global-set-key "\C-z" 'shell)
\end{verbatim}

La informaci\'on de este archivo esta escrita en LISP, sin embargo en muchas ocasiones no es necesario conocer este 
lenguaje puesto que basta con copiar y pegar ciertas l\'ineas para obtener los resultados deseados. Por ejemplo para que funcione JDEE tenemos que indicar (require 'jde'). Con esto es suficiente para que cargue la informaci\'on de JDEE. 
Para que funcione CLISP al teclear M-x run-lisp hay que incluir una l\'inea de la forma: (setq inferior-lisp-program ``/usr/bin/clisp'').

Esta \'ultima l\'inea asigna a la variable inferior-lisp-program el valor del path donde se encuentra CLISP. Si 
aprendemos un poco de LISP r\'apidamente podremos modificar de forma incre\'iable Emacs. Incluso podremos crear
archivos con programas y utilidades nuevas y añadirlas a Emacs simplemente añadiendo a nuestro .emacs algo del tipo
(load-library ``pathdelarchivoconcodgolisp.el''). De esta forma podemos ampliar las capacidades de Emacs para que realice
todo lo que se nos ocurra. Sirvan de ejemplo las siguientes utilidades de Emacs: \\
* ejecutar una shell \\
* jugar al tetris : M-x tetris \\
* navegar por internet http://www.cs.indiana.edu/elisp/w3/docs.html \\
* leer el correo con Rmail \\
* reproducir mp3 \\
* emulaciones ,de Vi por ejemplo ;-)  \\
* mensajer\'ia instant\'anea (AIM, MSN)

y todo lo que se nos ocurra y se pueda programar.


\section{Conclusi\'on}
Emacs fue creado en laborat\'orios de Inteligencia Artificial, y por ello posee unas propiedades \'unicas.
Puede no resultar muy intuitivo en un principio pero las ventajas que ofrece merecen en muchos casos la pena.
En el entorno Universitario Emacs puede ser adaptado f\'acilmente a las tareas desarrolladas en la docencia, utilizando
siempre software libre y de una calidad que dificilmente podemos encontrar en herramientas propietarias. Por ejemplo
el caso del CLISP es mucho m\'as potente que el programa alternativo que se ofrece en mi escuela: Allegro.

Con un poco de esfuerzo inicial para empezar a dominar este editor podemos beneficiarnos de no tener que aprender a usar
una aplicaci\'on distinta para cada tarea que intentemos desarrollar, tener la seguridad que vamos a tener un entorno de 
desarrollo conocido puesto que Emacs existe en la mayor parte de las platarformas y unas posibilidades de personalizaci\'on dificilmente igualables.


\section{Enlaces: Emacs en la red}
* Gnu Emacs Manual: \\
- http://www.gnu.org/manual/emacs/index.html  \\
* Gnu Emacs Manual Top:\\ 
- http://astreo.ii.uam.es/\%7Ephaya/emacs/Top.html \\
- http://math-www.uio.no/doc/gnu/emacs/top.html   \\
* Tutoriales y otros manuale: \\
- http://jeremy.zawodny.com/emacs/emacs.html \\
- http://seamons.com/emacs/ \\
* Emacs Lisp:\\
- manual: http://www.gnu.org/manual/emacs-lisp-intro/emacs-lisp-intro.html\\
- decenas de programas elisp : http://www.anc.ed.ac.uk/~stephen/emacs/ell.html \\
* Personalizaci\'on de Emacs:\\
- varios:    http://www.emacswiki.org/cgi-bin/wiki \\
- navegador: http://www.cs.indiana.edu/elisp/w3/docs.html \\
- JDE: http://jdee.sunsite.dk/ \\      
* Xemacs: \\
- http://www.xemacs.org/ \\




\section{Licencia}
Este documento es propiedad de Eduardo Cerme\~no y su licencia es GPL (consultar www.gnu.org  para m\'as detalles).


\end{document}
