Mar 09 2009

Lisp en Emacs

Tag: basicoverdrive @ 4:45 am

Existen distintos dialectos de emacs, por lo que disponemos de distintos modos en lisp.

lisp

M-x emacs-lisp-mode : usado para editar emacs lisp/elisp (.emacs o .el)
M-x lisp-mode : usado para editar codigo common lisp (.l, .lsp o .lisp)
M-x lisp-interaction-mode : usado para editar y ejecutar elisp.

Existen otros dialectos, entre ellos scheme (que es minimalista) o CL (common lisp, que es análogo a scheme). También decir que existe alguna implementación curiosa llamada sbcl (steal bank common lisp) que es un lisp bastante peculiar, el cual se puede usar bajo slime en emacs, aunque esto sobrepasa el objetivo de este artículo. Cambiando de tercio, decir que muchos keystrokes estan asociados a S-expressiones (expresiones simbólicas) que se refiere a cualquier expresión simbolica correcta (número, símbolo, variable, lista, etc). En el caso de listas son S-expressiones especiales, y defun (definición de funciones) son casos especiales de listas.

He dividido el artículo en dos partes, refiriendome a common lisp y scheme en general, o bien a casos particulares de emacs lisp

Common lisp y scheme general

S-exp

C-M-b : ‘backward-sexp‘; se desplaza a la S-exp anterior.
C-M-f : ‘forward-sexp‘; se desplaza a la siguiente S-exp.
C-M-t : ‘transpose-sexps‘; transpone 2 S-exps.
C-M-@ : ‘mark-sexp‘; pone la marca al final de la actual S-exp y el cursor al principio.
C-M-k : ‘kill-sexp‘; elimina la S-exp.
(sin keystroke asociada) : ‘backward-kill-sexp‘; elimina la anterior S-exp.

Listas

C-M-n : ‘forward-list‘; siguiente lista.
C-M-p : ‘backward-list‘; anterior lista.
C-M-d : ‘down-list‘; se desplaza hacia delante un nivel hacia abajo de los paréntesis.
(sin keystroke asociada) : ‘up-list‘; se desplaza hacia delante un nivel de los paréntesis.
C-M-u : ‘backward-up-list‘; se desplaza hacia atrás un nivel de los paréntesis.

Funciones

C-M-a : ‘beginning-of-defun‘; inicio de la definición de función.
C-M-e : ‘end-of-defun‘; fin de la definición de función.
C-M-h : ‘mark-defun‘; marca una definición de función.

Los keystrokes básicos empleados en lisp son;

Para indentación:

TAB : para indentar
C-j : introduce el salto de línea y adicionalmente TAB para indentar la siguiente.
C-M-q : indenta el bloque más interno de la expresión actual, es decir, de la s-expresión.

Para comentarios:

M-; : Añade un comentario al final de linea, siempre después de cualquier instrucción de código. Si se realiza en un comentario, se desplaza al inicio del mismo, justo detrás del último carácter delimitador de comentario que es ‘;‘ o ‘;;‘. Si se realiza en una línea en blanco, añade ‘;;‘.
M-j : Si se realiza en medio de un comentario, divide el comentario actual en varias líneas con el forma correcto. No se debe usar en la parte de código, ya que no tiene un formato correcto.
(sin keystroke asociada) : ‘kill-comment‘; elimina un comentario.

Emacs lisp específico

C-M-x : ‘eval-defun‘; evalúa la definición de función.
M-TAB : ‘complete-lisp-symbol‘; completa el símbolo según los símbolos ya conocidos.
C-j : ‘newline-and-indent‘; crea un salto de línea (dividiendo la línea) e indenta la nueva línea respecto la anterior.

Modo mayor y menor lisp

Es posible trabajar con el lisp-mode como un modo mayor en vez de menor, para ello tenemos el siguiente juego de keystrokes:

C-c C-z : ‘switch-to-lisp‘; cambia el modo lisp para que se ejecute como un modo menor en lugar de mayor.
C-M-x : ‘lisp-eval-defun‘; evalúa la definición de función en modo menor.

Otra forma de evaluar s-expressiones

M-: : ‘eval-expression‘; evalúa una expresión dada al instante via modeline.
C-x C-e : ‘lisp-eval-last-sexp‘; evalúa la última s-expresión en lisp.

Antes de finalizar, decir que se puede acceder a la ayuda de funciones mediante C-h f que invoca ‘describe-function‘ y ahi buscar una función que nos interese, que además es posible acceder al código y ver como esta implementado mirando el fichero donde este implementado (ya que existe un enlace a la función del fichero fuente en el que se encuentre). Esto se puede reconocer porque suele ir precedido de function-name is an interactive compiled Lisp function in ‘file.el’.

lisplogo

Existen otros modos y entornos dentro de emacs más interesantes y potentes como slime, pero ello conllevará un artículo entero.


Feb 18 2009

Usando ERC (Emacs internet Relay Chat) en Emacs para IRC

Tag: basicoverdrive @ 4:01 am

Como no, en emacs es posible conectar al irc. Existen distintos clientes entre ellos ERC, rcirc, riece… etc. Yo me centraré en el que más conozco, ERC. Además, cualquiera de estos clientes podemos combinarlos con Bitlbee, que noe es mas que una pasarela IRC a servicios de mensajería instantánea como AIM, ICQ, MSN, Jabber, Yahoo, etc.

En primer lugar podemos incluir en nuestro .emacs cierta información sobre a que red o canales conectar, así como el nickname por defecto o su realname, que de momento voy a obviar.

En primer lugar, si queremos ejecutar nuestro cliente de irc, podemos pulsar M-x erc, acto seguido se nos pedirá cierta información (siempre que no se la hayamos proporcionado antes en nuestro .emacs).

Se nos pedirá el servidor al que queremos conectar, por defecto si no tenemos nada en nuestro .emacs mostrará irc.freenode.net

Después de esto, nos preguntará al puerto al que queremos conectar, que normalmente será el 6667.

nick queremos conectar, en mi caso overdrive

Y por último la contraseña asociada (en caso de que estemos registrados en dicho servidor de irc), sinó tan sólo deberemos pulsar intro. Además, busca autenticarse con nickserv que es típico de la mayoría de servidores conocidos como freenode o kernelnewbies, sin embargo otros como por ejemplo hispano usan nick, por lo que no se autenticará, y deberemos hacerlo nosotros a mano una vez conectados o bien buscar alguna solución alternativa más elegante.

Como podemos ver, los carácteres no serán mostrados. Una vez estemos conectados veremos el prompt de ERC para Emacs, que es ERC> y es aquí donde debemos escribir texto y/o comandos. Digamos que por defecto estamos en la ventana equivalente al ‘status’, que muestra información relacionada con la conexi´on del servidor y demas, tan sólo debemos escribir /join #canal o /j #canal, en mi caso suelo conectar a #emacs-es por lo que haremos /j #emacs-es y pulsaremos intro para entrar en el canal.

Una vez estemos en el canal, ya podemos dirigirnos al canal hablando directamente (arriba nos indicará sobre que canal estamos, algo así como ‘overdrive on #emacs-es’). Si queremos hablar por privado como bien sabréis la mayoría deberíamos pulsar /query nick o /q nick, por ejemplo en este caso nos serviría /q Vejeta.

Con /names o /n podemos listar la lista de nicks (la cual es mostrada también al entrar al canal, así como el topic y alguna información más).

Recordad que estáis en emacs, y que cada canal estará asociado a un buffer, así que si estamos en varios canales simultáneamente tan sólo debemos pulsar C-x b nombre_de_otro_buffer. Un keystroke que suele ayudar mucho, suele ser C-SPC (control + espacio) que permite ir saltando a cada buffer en el que se haya producido un evento.

Por supuesto se puede emplear el autocompletion, tanto para buffers como para referirse a nicks o canales, por lo que es bastante útil, además una vez hayamos terminado de hablar antes de salir, guardar un log será tan simple como asociar dicho buffer a un fichero con C-x C-w o C-x C-s, aunque existen otras formas más correctas de hacer esto. Para salir tan sólo debemos pulsar /quit.

Por supuesto ERC es mucho más potente que todo esto, pero esto es lo básico para subsistir y poder estar de forma cómoda en dicho cliente.

En nuestro .emacs deberíamos al menos añadir estas líneas:

(require ‘erc)

(setq erc-server «irc.freenode.net»
erc-port 6667
erc-nick «overdrive»
erc-user-full-name overdrive
erc-email-userid «overdrive»
erc-prompt-for-password nil)

Para mas información sobre ERC podéis mirar las siguientes urls:

Página principal de ERC en emacswiki:

http://www.emacswiki.org/emacs/ERC

Página principal de clientes de IRC y configuraciones en emacswiki:

http://www.emacswiki.org/emacs/CategoryChatClient

Os daréis cuenta que ERC esconde cosas muy curiosas, como la posibilidad de jugar al ajedrez en un buffer con tu colega de irc si dispone de erc como tú o bien la posibilidad de poder recoger ante cualquier evento cuando alguien hable por IRC y se sintetice por la tarjeta de sonido y se escuche en los altavoces todo lo que se vaya diciendo por irc.


Dic 28 2008

Instalación y configuración de w3m bajo MacOS

Tag: platformoverdrive @ 9:42 pm

Existen distintas distribuciones de GNU/Emacs en MacOS X, entre ellas, las dos más famosas son Carbon emacs y Aquamacs. La primera, por lo que tengo entendido deja de mantenerse y es Aquamacs la que más soporte tiene.

La web oficial de Aquamacs es:

http://aquamacs.org/

Y la de Carbon emacs es:

http://homepage.mac.com/zenitani/emacs-e.html

Una vez instalada alguna distribución de emacs en nuestro mac, podemos disponernos a instalar w3m, la cual difiere del resto de sistemas por ciertas dependencias que por defecto no vienen instaladas en MacOS X.

Antes de continuar, decir que en MacOS, podemos usar macports para instalar ciertos paquetes de forma cómoda. La web oficial de macports es:

http://www.macports.org/

Para realizar la instalación de macports tan sólo debemos descargar macports y seguir el manual de instalación:

http://www.macports.org/install.php

Se puede conseguir un tutorial sobre el uso y manejo de macports en:

http://guide.macports.org/#using

Una de las dependencias básicas para w3m es gc (Boehm garbage collector) disponible en:

http://www.hpl.hp.com/personal/Hans_Boehm/gc/

Una vez instalado, debemos instalar w3m que se puede encontrar en:

http://w3m.sourceforge.net/index.en.html

Y luego Emacs-w3m, que se puede conseguir del cvs:

http://emacs-w3m.namazu.org/

Por último debemos añadir a nuestro .emacs las siguientes líneas para soporte w3m en emacs:

(add-to-list ‘load-path «/usr/share/emacs/site-lisp/w3m»)
(if window-system
(require ‘w3m-load))

Además podemos añadir las siguientes líneas si queremos cargar las imagenes en línea automaticamente:

(setq w3m-default-display-inline-images t)

Por último se puede encontrar un tutorial más extenso sobre todo el proceso de instalación de cada uno de los paquetes en:

http://bc.tech.coop/blog/080110.html

Una vez ejecutemos emacs, podemos lanzar w3m mediante M-x w3m, y conseguiremos un aspecto bastante aceptable:

 


« Página anteriorPágina siguiente »