Oct 29 2009

iswitchb

Tag: basicoverdrive @ 10:51 pm

Iswitchb significa «Interactive Switch Buffer» que es un modo interactivo que facilita manejo de múltiples buffers. Para activarlo debemos añadir a nuestro .emacs las siguientes líneas:

;;============================================================
;; iswitchb mode
;;============================================================
(require ‘iswitchb)
(iswitchb-mode)

Aunque también podemos agregar excepciones para que ignore algunos buffers que puede no interesarnos, éstas son las excepciones típicas, aunque todo dependerá de cada uno, y ésta es una decisión que debe tomar el usuario final:

;;============================================================
;; iswitchb ignores
;;============================================================
(add-to-list ‘iswitchb-buffer-ignore «^ «)
(add-to-list ‘iswitchb-buffer-ignore «*Messages*»)
(add-to-list ‘iswitchb-buffer-ignore «*ECB»)
(add-to-list ‘iswitchb-buffer-ignore «*Buffer»)
(add-to-list ‘iswitchb-buffer-ignore «*Completions»)
(add-to-list ‘iswitchb-buffer-ignore «*ftp «)
(add-to-list ‘iswitchb-buffer-ignore «*bsh»)
(add-to-list ‘iswitchb-buffer-ignore «*jde-log»)
(add-to-list ‘iswitchb-buffer-ignore «^[tT][aA][gG][sS]$»)

Cuando pulsemos «C-x b» para cambiar de buffer, aparecerá un listado de bufferes abiertos a los cuales podemos acceder, por defecto accederemos al buffer que aparece en primer lugar y resaltado de un color distinto. Si queremos acceder a dicho buffer tan sólo debemos pulsar ENTER como lo hacíamos de manera habitual. Si por el contrario lo que queremos es acceder a otro buffer de la lista, podemos pulsar C-s para ir al siguiente buffer o C-r para ir al buffer anterior, y repetir este proceso tantas veces como necesitemos.

Cuando pulsamos «C-x b» para cambiar de buffer, existe otra forma de acceder a un buffer sin necesidad de recorrer dicha lista si es demasiado extensa por ejemplo. Podemos escribir parte del nombre del buffer al cual queramos acceder, por lo que iswitchb ignorará aquellos buffers que no contengan el patrón buscado, acelerando así el proceso y acortando la lista tanto como se pueda, lo cual acelerará el proceso bastante.

También es posible usar las teclas de flecha (comunmente conocidas como arrow keys) en lugar de C-s y C-r que puede resultar un poco incomodo para los que no estén acostumbrados. Para ello deberemos añadir las siguientes líneas en nuestro .emacs:

(defun iswitchb-local-keys ()
(mapc (lambda (K)
(let* ((key (car K)) (fun (cdr K)))
(define-key iswitchb-mode-map (edmacro-parse-keys key) fun)))
‘((«<right>» . iswitchb-next-match)
(«<left>» . iswitchb-prev-match)
(«<up>» . ignore )
(«<down>» . ignore ))))

(add-hook ‘iswitchb-define-mode-map-hook ‘iswitchb-local-keys)

Existe la posibilidad de combinar iswitchb con icicles y otras opciones, para poder acceder a los menus de manera cíclica, la cual no considero fundamental, debido a que dichos listados pueden ser demasiado largos y puede ser una odisea tener que ir moviéndose elemento por elemento hasta acceder al item deseado, a excepción de si se filtra escribiendo parte de la cadena


Oct 29 2009

JDEE (Java Development Environment for Emacs)

Tag: basicoverdrive @ 8:21 pm

JDEE (Java Development Environment for Emacs) es un add-on que permite a Emacs comprender el sistema de creación, edición, debugging y documentación del lenguaje Java. Es necesario tener CEDET instalado (explicado en un artículo anterior) también requiere elib (Emacs Lisp Library), JDK (Java Development Kit o herramientas equivalentes; compilador, máquina virtual, debugger, librerías de clases, etc) y un entorno de shell como Bash, también es recomendado tener instalado y configurado ECB (explicado en el artículo anterior).

Básicamente JDEE incluye:

  • Un menú específico para JDEE (compilar, ejecutar, debuggear, construir, navegación, proyecto, ayuda).
  • Highlighting.
  • Auto indentación.
  • Enlaces a código de los errores de compilación.
  • Debugging a nivel de código fuente.
  • Navegación específica para el código fuente.
  • Soporte para makefiles.
  • Generación de código automática.
  • Intérprete de código fuente en Java.

Como 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 completa sobre ello):

Una vez descargado el fuente debemos ejecutar make && make install fijándonos bien donde se instala o bien indicándolo nosotros mismos mediante los modificadores mediante el configure o bien editando directamente el Makefile tales como:

Entrada en el makefile / Valor típico / Descripción:

  • prefix suele tomar el valor /usr/local e indica el directorio donde se encuentra shared.
  • datadir suele tomar el valor $(prefix)/share e indica el directorio principal donde se encuentra Emacs.
  • locallisppath suele tomar el valor $(datadir)/emacs/site-lisp e indica donde se deben instalar los ficheros Lisp locales.
  • ELIBDIR suele tomar el valor $(locallisppath)/elib e indica donde irán los ficheros Lisp de Elib.
  • EMACS suele tomar el valor /usr/bin/emacs e indica cuál es el binario con que se lanza emacs.

Una vez instaladas todas las dependencias de emacs para poder usar JDEE, podemos proceder a la instalación del mismo. A nuestro .emacs ahora debemos añadirle las siguientes líneas:

;; Minimal setup required to run the JDEE
;; Debug option to enable a backtrace when a problem occurs
(setq debug-on-error t)

;; Include the path to the JDEE and its required packages
(add-to-list ‘load-path (expand-file-name «/usr/local/emacs/site-lisp/jde/lisp»))
(add-to-list ‘load-path (expand-file-name «/usr/local/emacs/site-lisp/semantic»))
(add-to-list ‘load-path (expand-file-name «/usr/local/emacs/site-lisp/speedbar»))
(add-to-list ‘load-path (expand-file-name «/usr/local/emacs/site-lisp/eieio»))
(add-to-list ‘load-path (expand-file-name «/usr/local/emacs/site-lisp/elib»))

;; Defer loading JDEE until you open a Java file
(setq defer-loading-jde nil)

(if defer-loading-jde

(progn

(autoload ‘jde-mode «jde» «JDE mode.» t)

(setq auto-mode-alist

(append

‘((«\\.java'» . jde-mode))

auto-mode-alist)))

(require ‘jde))

;; Set basic indentation for Java source files of 2 spaces
(add-hook ‘jde-mode-hook ‘(lambda () setq c-basic-offset 2)))

;; Set up to run bash as its primary shell (important for JDEE env)
(setq shell-file-name «bash»)
(setq shell-command-switch «-c»)
(setq explicit-shell-file-name shell-file-name)
(setenv «SHELL» shell-file-name)
(setq explicit-sh-args ‘(«-login» «-i»))
(if (boundp ‘w32-quote-process-args)

(setq w32-quote-process-args ?\»)) ;; Include only for MS Windows

A partir de aquí la compilación de los ficheros lisp de JDEE no es requerida, pero sí aconsejable para ganar tiempo. Para realizar esto, debemos lanzar emacs y una vez dentro ejecutaremos M-x jde-compile-jde, sólo es necesario compilarlo una vez obviamente.

Registrar las Java Tools es también un paso opcional, pero es interesante para cuando se tienen múltiples versiones de JDK instaladas. Para registrar un JDK será necesario ejecutar M-x customize-variable y desde ahí configurar la variable jde-jdk-registry, donde podemos seleccionar INS de insert para añadir un nuevo número de versión y path para el JDK. Este proceso puede ser repetido tantas veces como JDK queramos registrar, es importante presionar el boton «State» para guardar los cambios para futuros usos, así como presionar el botón «Finish« para esta primera vez antes de cerrar el buffer. Una vez hayamos registrado las JDK deseadas podemos cambiar la versión activa mediante M-x customize-variable y editar la variable jde-jdk, la cuál mostrará un prompt con la lista de JDK registradas.

Se ha comprobado que en algunos casos las JDK dan problemas a la hora de compilarla, el problema típico suele ser que no se encuentra el fichero tools.jar, en ese caso deberíamos editar la variable jde-global-classpath e incluir dicho fichero. Una configuración típica podría ser esta (variable valor):

jde-global-classpath /usr/local/j2se:.

jde-jdk-registry Version = 1.4.2

Path = /usr/local/j2se

Ahora veamos que keystrokes y utilidades hemos ganado teniendo JDEE funcionando correctamente: previamente teníamos comandos soportados por M-x java-mode tal que:

M-a y M-e: para moverse por los comandos java.
M-C-\ : indenta una región y tienen en cuenta las excepciones para realizar una alineación especial.

Hay más de ellos, todos relacionados con el modo c++. Ahora tenemos otras ciertas ventajas, tales como:

C-c C-v C-. : ‘jde-complete‘; muestra el listado de posibles opciones (incluida para toda la API de Java). La lista de opciones es completada mediante la viariable jde-global-path (que es posible configurar) dándole el valor deseado, sino tomará el del CLASSPATH.
(sin keystroke asociada) : ‘jde-browse-class-at-point‘; Lanza el navegador de clases.

Para la generación de código tenemos:

C-c C-v C-l : ‘jde-gen-println‘ ; muestra un prompt para imprimir el contenido e inserta System.out.println().
C-c C-v C-z : ‘jde-import-find-and-import‘; importa automaticamente los imports requeridos al inicio del fichero.
C-c C-v i : ‘jde-wiz-implement-interface‘; muestra un prompt para añadir el nombre de la interfaz a implementar, añade los imports necesarios, así como los requeridos para los argumentos de los métodos. Además de ello provee de skeletons comentados para cada metodo de la interfaz.

Además de ello permite generar getters y setters mediante la creación de una lista de atributos y ejecutando el wizard. También se puede usar el wizard para actualizar dichos getters y setters en el caso de que se haya añadido o eliminado alguno.

Para la compilación y ejecución de programas tenemos:

C-c C-v C-c ; compila el buffer actual. Si existen errores es posible moverse por dicho buffer de errores, pulsar intro, y el cursor automáticamente saltará al error referido en el código.
(sin keystroke asociada) : ‘jde-ant-build‘; compila mediante ant, para más información mirar la sección de Help de las variables comenzadas por jde-ant.
C-c C-v C-r : »; ejecuta el buffer actual abriendo un buffer nuevo con cualquier salida (output) que tenga dicho programa.

Para ejecutar proyectos grandes es conveniente editar las variables jde-run-working-directory que indica dónde comenzará la ejecución y jde-run-applications-class que indica el nombre de la clase que contiene el método main() a ejecutar.

Los siguientes keystrokes son útiles en caso de encontrar backtraces en el caso de ocurrir alguna excepción:

C-c C-v C-[ ; ir al siguiente método del stacktrace.
C-c C-v C-] ; ir al anterior método del stacktrace.

Los keystrokes referentes a debugging mediante JDB (Java Debugger) son:

(sin keystroke asociada): ‘jde-jdb‘; lanza jdb.
C-c C-a C-s ; siguiente paso (comando JDB es step)
C-c C-a C-n ; siguiente sentencia (comando JDB es next)
C-c C-a C-c ; continua (comando JDB es cont)
C-c C-a C-b ; toggle breakpoint (comando JDB es stop in, stop at, clear)
C-c C-a C-p ; imprime una expresión (comando JDB es print)
C-c C-a C-d ; vuelca un objeto (comando JDB es dump)

Las ventajas que nos ofrece JDB desde emacs es que podemos interactuar directamente con el debugger accediendo al buffer *debug*.

Nota: se debe tener en cuenta que las clases han debido ser compiladas con soporte para debugging, esto es mediante el parámetro -g para el comando javac, para ello con JDEE deberemos haber editado la variable jde-compile-option-debug.

JDEE es inmenso, por lo que si queremos una referencia completa sobre todo el potencial del mismo deberemos acceder a la web oficial de JDEE.