Jun 17 2008

Scheme, common y emacs lisp

Tag: introoverdrive @ 1:38 am

Antes de continuar explicando keystrokes más avanzados creo que es importante tener un mínimo de cultura general de Lisp (list processing), ya que está totalmente relacionado con Emacs (más de un 75% está escrito en lisp, algo más de un 23% en c, y el resto en lenguajes como sh, perl, awk, python y demás).

En primer lugar decir que Lisp es un lenguaje de programación multiparadigma, de alto nivel, declarativo, funcional, orientado a objetos y con 50 años de história. La potencia de lisp es mucho mayor de la que lo gente se piensa y aunque tiene relación con la IA (Inteligencia Artificial) se usa y se ha usado para muchísimas cosas más, como estudiar los paradigmas de los lenguajes de programación del futuro.

Lisp tiene 3 dialectos principales hoy en dia (aunque existen más), éstos son Scheme, Common lisp y Emacs lisp.

  • Scheme: la filosofía de Scheme es minimalista. Scheme proporciona un número muy reducido de primitivas, construyendo el resto a partir de este reducido número de abstracciones. El estándar (R5RS) tan sólo ocupa unas 50 páginas y se puede descargar de la página de schemers.org (http://schemers.org/Documents/Standards/R5RS/r5rs.pdf).
  • Common lisp: por otro lado tenemos common lisp, él índice de las especificaciones de éste es tan grande como todas las especificaciones de scheme, por lo lo que posee un gran número de primitivas. La especificación y referencia más cercana es la CLtL (www.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html).
  • Emacs lisp: por último tenemos Emacs lisp, éste dialecto fue escrito pensando u orientado para el entorno Emacs. El juego de primitivas que ofrece no es tan pequeño como el de Scheme, pero tan poco tan grande como el de Common lisp. Su número de primitivas también es reducido, lo que ocurre es que el estándar también define la biblioteca, que se construye con el juego de primitivas reducidas. La mejor referencia se encuentra en la web de gnu (http://www.gnu.org/software/emacs/manual/elisp.html).

Por supuesto nuestro entorno emacs tiene un intérprete de lisp (emacs lisp) escritro en c, que es la base de toda la aplicación y del resto de funcionalidades que se cargan. Por lo tanto podemos decir que podemos interpretar código Lisp desde emacs (y se hace constantemente). Para ello tenemos distintas posibilidades:

  • M-x run-scheme : podremos comenzar a interpretar scheme.
  • M-x run-lisp : podremos comenzar a interpretar common lisp.
  • M-x eval-expression ó M-: : podremos comenzar a interpretar emacs lisp desde el minibuffer.
  • C-x C-e : para interpretar emacs lisp escrito en algún buffer (útil cuando no es tan corto el código).

También podemos evaluar código emacs lisp usando M-x eval-buffer si queremos evaluar un buffer entero en dicho intérprete o bien M-x eval-region si lo que queremos es que interprete una región. Debemos tener instalados en nuestro sistema los intérpretes de scheme y common para poder evaluar expresiones de estos, el de emacs lisp, ya viene con GNU/Emacs.

lambda

Por último recomendar este magnífico video (Taller de lisp) también incrustado al final de éste post, de David Arroyo (los primeros 24 minutos sobre la história de Lisp) y José E. Marchesi (a partir del minuto 25, sobre como se implementa Lisp de forma interna).


Jun 16 2008

Puntero, cursor y marca. Regiones (básico)

Tag: introoverdrive @ 2:08 am

Antes de poder continuar, es imprescindible como explicar el concepto de puntero, cursor y marca. Todo ello esta explicado en la charla ya mencionada antes por José E. Marchesi (Editorwars-Emacs-Vs-Vim).

El cursor, es aquel elemento que parpadea, y que nos sirve a nosotros, los usuarios del sistema, saber en que posición nos encontramos. Sin embargo, los editores de texto y en este caso Emacs, no hace uso de este elemento, sino que usa el puntero. Cuando tenemos el cursor sobre el carácter ‘D’ de la palabra «ABCDEF», lo que realmente ocurre es que existe un puntero que se encuentra señalando la posicion entre la ‘C’ y la ‘D’, de esa forma si escribimos algo se escribirá no sobre la ‘D’, pero tampoco después de la ‘D’, sino entre la ‘C’ y la ‘D’, que en efecto es la posición del puntero. Este concepto está muy bien explicado dicha charla, que como se dice, existe una posicion válida para el puntero entre cada carácter. Por lo tanto cada vez que movemos el cursor, Emacs internamente cambia el valor del puntero.

Por último explicaremos el concepto de marca. La marca, por defecto es invisible en versiones anteriores a Emacs 22. La marca se emplea para trabajar con regiones por norma general o para recordar posiciones para nuestro interés a la cual nos podremos referir.

Explicamos ahora algunos comandos básicos empleando la marca y regiones que servirán como ejemplo para confirmar y fortalecer la teoría explicada anteriormente. En primer lugar tenemos que saber como poner la marca, para ello usaremos C-SPC. Recordemos que la marca estará guardando la posición entre dos caracteres, nunca encima de uno. Si movemos el cursor hacia otro lugar, tendremos en efecto una region desde la posición de la marca hasta la del cursor, la cual podemos copiar empleando M-w, cortar usando C-w, y después de ello pegar esta región usando C-y o M-y. La diferencia entre estas dos últimas es que C-y sigue manteniendo la región en el kill-ring, mientras que M-y no.

El kill ring (anillo de la muerte) es un cementerio de todo aquello eliminado (a excepción de carácteres individuales). Es decir, aquí se almacenarán palabras, regiones, párrafos, etc… borrados. Gracias a éste kill ring, eliminar por error en emacs nunca es fatídico, siempre podremos acudir a este anillo.

Existe también un mark ring, que es un cementerio de marcas; cada vez que marcamos una nueva marca, guardamos en éste anillo la marca anterior.

Éstos anillos son listas enlazadas circulares, y eliminar por norma general añadirá un nuevo nodo al anillo, mientras que recuperar el valor algunas veces implicará la eliminación del nodo.

Por último podemos intercambiar el valor de la marca y cursor usando C-x C-x.

puntero_cursor_y_marca


Jun 16 2008

Búsqueda, desplazamiento y reemplazo (básico)

Tag: introoverdrive @ 1:14 am

En este artículo comentaré la parte más esencial y fundamental para realizar búsquedas, desplazamientos y reemplazos; que son acciones necesarias para cualquier tipo de edición.

En primer lugar, para realizar busquedas hacia delante, tan sólo debemos pulsar C-s seguido de la cadena a buscar. Si queremos realizar la búsqueda desde el cursor hacia atrás, debemos pulsar C-r. Para salir de la búsqueda basta con comenzar a editar o bien pulsar intro.

Cuando realizamos estas búsquedas serán resaltados aquellos resultados que coincidan con la cadena a buscar, pero si lo que queremos es desplazarnos hasta cada uno de los casos de coincidencia tan solo debemos pulsar C-s C-s con lo cual iremos saltando a cada uno de estos resultados. Si lo que queremos es realizar estos saltos hacia atrás, debemos pulsar C-r C-r.

En cuanto a los comandos de desplazamiento, debemos indicar los que considero más importantes. De momento tan sólo nombraré cuatro; el primero M-> o M-end que va al final del buffer y el segundo M-< o M-home que se desplaza al inicio del buffer. Con M-g M-g nos desplazaremos a la linea deseada. Existe otro más, el cual no está mapeado a ningún keystroke debido a que no es tan interesante para nuestros propósitos actuales (pero luego veremos que sí tienen sentido todos estos comandos), al cual podemos acceder de momento usando M-x goto-char, el cual nos desplaza hasta el carácter deseado.

Un quinto comando relacionado con los anteriores, pero el cual no mueve la posición del cursor sinó el buffer respecto a el, es C-l, que lo que hace es centrar el buffer para que el cursor quede justo en medio.

Por último vienen los comandos de reemplazo. Tan sólo aprenderemos dos, uno no está mapeado a ningún keystroke por defecto, este puede ser invocado de momento pulsando M-x replace-string, y reemplazará una cadena por otra a lo largo del buffer. Existe un segundo comando, el cual considero más útil que puede ser invocado usando M-%, que tiene el mismo efecto que el anterior pero que para cada coincidencia que encuentre preguntará si deseamos reemplazarlo, ignorarlo o cancelar el reemplazo en este punto, para cada coincidencia encontrada podremos usar ‘y’ si queremos reemplazarla, ‘n’ si no queremos reemplazarla, ‘a’ si queremos reemplazarlas todas (este tiene el mismo efecto que el M-x replace-string) o bien ‘q’ para dejar de seguir buscando cadenas a reemplazar. Ademas de ello también podemos usar el SPC (barra espaciadora) en lugar de ‘y’.


Página siguiente »