Javier Valcarce's Personal Website

Emacs

From JavierValcarce.Eu

You are at: Home > Software > Emacs
Jump to: navigation, search
Resumen
Esta página es un manual sobre Emacs. Explica cómo configurar y usar las sus funciones más básicas y otras no tan conocidas como por ejemplo usarlo como IDE, procesador XSTL, cliente de IRC, email, USENET, etc.

De entre los infinitos editores de texto existentes para programadores, Emacs sobresale sobre todos ellos por ser multiplataforma y por su riqueza de opciones. El común de los mortales no llega a utilizar ni el 50% de todas sus posibilidades. Incluso los que creen conocerlo bien se quedan sorprendidos al cabo de los años al descubrir en él características y usos nuevos que ayudan a simplificar su trabajo diario.

Emacs forma parte de todas las distribuciones de Linux/*BSD. Si usas Windows, puedes descargar Emacs para Windows (la versión correcta es la que termina en "bin").

Table of Contents


Qué es Emacs

Emacs 22 para Windows

Muchos lo definen como un editor de texto muy potente, con muchas opciones. En realidad Emacs es simplemente un entorno de ventanas (llamadas buffers) cada una de las cuales puede mostrar texto y gráficos (esto último sólo en modo gráfico).

Lo que hay dentro de estos búferes lo determinan programas escritos en elisp (Emacs Lisp), un lenguaje derivado de Lisp. Estos programas son ejecutados por un intérprete de elisp que está dentro del propio Emacs. Podemos ver y modificar el código fuente de estos programas así como añadir nuevos programas (llamados extensiones) para dotar al entorno de nuevas funcionalidades, por eso se dice que Emacs es extensible.

Cada uno de estos búferes, dependiendo de los programas elisp asociados a él, puede ser un editor de texto, un cliente de correo, un tetris, un navegador web, un administrador de ficheros, un depurador, etc. Hay personas que usan Emacs desde hace años pero no como editor de texto, sino principalmente como cliente de correo/news, por ejemplo.

Mucha gente cree erróneamente que Emacs esta escrito en elisp. Los scripts elisp determinan qué aplicación hay dentro de un búfer (editor, navegador, tetris...) y es por tanto el lenguaje en el que están escritos todos los modos y extensiones. El propio Emacs y su intérprete, en cambio, están escritos en C.

Tecleo de órdenes

Al entorno Emacs podemos enviarle órdenes tales como find-file, save-buffer, etc para abrir un ficheros y cargarlo en un búfer, grabar un buffer en un fichero de texto en el disco, etc.

Notación para los atajos de teclado y la introducción de órdenes
M-x significa presionar ALT y sin soltar, luego x
M-x orden significa presionar ALT-x, escribir la orden y luego ENTER
C-x significa presionar CONTROL-x
S-x significa presionar SHIFT-x
C-x f significa presionar CONTROL-x, soltar ambas teclas y luego pulsar f

Cada una de estas órdenes es realmente una función ELisp ejecutable, para invocarla debemos hacer lo siguiente

  1. Teclea M-x
  2. Escribe la orden
  3. Pulsa ENTER.

Por ejemplo: M-x find-file ENTER sirve para abrir un fichero. Tras pulsar ENTER pregunta el nombre del fichero que quieres abrir, por ejemplo ~/.emacs

Pulsa C-g para cancelar la edición en el minibufer o la orden en curso y volver al búfer actual, esta orden la usarás muy a menudo.

Las órdenes más usuales tienen un atajo de teclado asignado. Se pueden definir nuevos atajos o cambiar los predeterminados en el fichero .emacs. Puedes ver la lista completa de atajos con C-h b. También es posible autocompletar cualquier orden con TAB. En un entorno gráfico (X o Windows) las opciones más importantes están también disponibles en un menú de opciones gráfico y puedes seleccionarlas haciendo click con el ratón.

Órdenes básicas

En lugar de repetir aquí la lista completa de órdenes, una lista que podrás encontrar en muchos sitios, te recomiendo que leas esta tarjeta resumen escrita por Marc Abramowitz con las más comunes.

Algunas órdenes básicas
Orden Atajo Descripción
save-buffers-kill-emacs C-x C-c Salir de Emacs
visit-file C-x C-f Abrir un fichero y cargarlo en un nuevo búfer
save-buffer C-x C-s Guardar el búfer actual en un fichero de texto
write-file C-x C-w Guardar como
switch-to-buffer C-x b Cambiar el búfer actual
kill-buffer C-x k Cerrar el búfer actual
isearch-fordward C-s Buscar incrementalmente hacia delante


Intercambios y cambio a mayúsculas/minúsculas

Al teclear, muchas veces los errores más comunes consisten en simples transposiciones de 2 caracteres seguidos (por ejemplo ordne --> orden), 2 palabras seguidas, mayúsculas por minúsculas o viceversa, etc.

Intercambiar posiciones y poner en mayúscula/minúscula
Atajo Orden Descripción
C-t transpose-chars Intercambia el orden de 2 caracteres
M-t transpose-words Intercambia el orden de 2 palabras
C-x C-t transpose-lines Intercambia el orden de 2 líneas
transpose-sentences Intercambia el orden de 2 frases
transpose-paragraphs Intercambia el orden de 2 párrafos
M-u upcase-word Poner en mayúscula una palabra
M-l downcase-word Poner en minúscula una palabra

Quitar los caracteres ^M

  1. C-x RET C undecided-unix RET C-x C-w RET y
  2. Ir al principio del documento
  3. M-x replace-string RET C-q C-m RET RET


Convertir los caracteres TAB en espacios

  1. M-x untabify RET

Búsqueda con expresiones regulares

Las expresiones regulares es un tema que mucha gente no conoce y puede llegar a ser muy útil, a veces imprescindible. Si no sabes lo que son te recomiendo que les eches un vistazo.

Ejemplo: Buscar con expresiones regulares

Quiero buscar todas las palabras que comiencen con una letra mayúscula y terminen con un número. La expresión regular que se ajusta a este requisito es [A-Z]\w*[0-9]

  1. M-x isearch-fordward-regexp
  2. Nos pregunta qué expresión regular queremos usar, le decimos [A-Z]\w*[0-9] y pulsamos ENTER
Emacs resaltará todas las palabras que se ajusten a la expresión regular que hemos escrito y pasará por ellas una a una pulsando C-M-s


El fichero de configuración .emacs

Emacs lee el fichero de configuración .emacs durante el arranque. Deberá estar en nuestro directorio de inicio, indicado por la variable de entorno HOME

  • En Windows: Panel de control > Sistema > Avanzado > Variables de entorno. Definir una nueva variable llamada HOME de valor C:\HOME o lo que sea.
  • En Linux: Normalmente ya está definida (en el fichero .bashrc)

Líneas en el .emacs

A mí estás tres líneas en .emacs me resultan imprescindibles:

Línea Descripción
(setq visible-bell t) Elimina la dichosa campanilla que suena cuando llegas al final del búfer o pulsas TAB y no hay nada que completar.
(setq c-default-style "bsd") Estilo BSD/Allman en la tabulación del código C/C++/Java/etc, que es el que a mí más me gusta.
(setq c-basic-offset 6) Sangrado de 6 espacios (2 debería estar prohibido, 8 es sólo para genios)

Después de modificar el fichero .emacs, no hay por qué reiniciar el programa para aplicar los cambios, basta con load-library y le indicamos el fichero .emacs, p. ej: e:/.emacs

Línea -*- en el fichero

Si un fichero de código C no tiene extensión *.c (lo mismo para cualquier otro lenguaje) podemos indicarle a emacs que modo tiene que usar añadiendo en la primera línea del fichero

/* -*- mode: c -*- */

Entre los signos -*- podemos pasar todo tipo de opciones (llamadas variables locales) a emacs, que las utilizará durante la edición de ese fichero. Por ejemplo, la línea siguiente establece el modo "c", estilo "bsd" y sangrado a 6 espacios para el fichero que la contiene:

/* -*- mode: c; c-default-style: "bsd"; c-basic-offset: 6 -*- */

Instalar nuevos modos

Los modos son ficheros *.el de código fuente en lenguaje elisp, este código es ejecutado por el propio Emacs, que incluye un interprete de de este lenguaje[1].

  1. Descargamos el/los fichero/s *.el en cuestión, p. ej: ruby-mode.el
  2. Cargamos el fichero de código elisp con la orden load-file, p. ej: load-file RET e:/ruby-mode.el
  3. Ahora ya podemos cargar el nuevo modo, M-x ruby-mode

Es conveniente (no obligatorio) compilar los programas byte-code porque acelera su carga y ejecución:

byte-compile-file RET e:/ruby-mode.el

tras lo cual se genera e:/ruby-mode.elc, que se puede cargar igual que si fuera un fichero *.el pero más rápido

Conviene añadir la orden load-file al fichero .emacs para cargar el modo siempre al inicio:

(load-file "e:/ruby-mode.elc")

Es también muy útil asociar un modo a un fichero según su extensión de forma que Emacs entre en ese modo automáticamente al abrir el fichero. Por ejemplo, para asociar el modo wikipedia-mode.el a todos los ficheros terminados en *.wiki añade la siguiente línea a tu .emacs:

(add-to-list 'auto-mode-alist 
   '("\\.wiki\\'" . wikipedia-mode))

Algunos modos de Emacs

Algunos modos obtenidos de Internet que no suelen venir en la distribución estándar de Emacs (alojados localmente en este servidor web).

Modo Descripción
d-mode.el Lenguaje de programación D
wikipedia-mode.el Para editar artículos de Wikipedia (información)
ruby-mode.el Lenguaje de programación Ruby

UNICODE

Emacs 22 viene con soporte completo para Unicode

Orden Atajo Descripción
 ? C-x RET r Reabrir el fichero en curso usando el juego de caracteres que especifiquemos en el minibuffer (iso-8859-1, utf-8, etc)
 ? C-x RET f Cambiar el juego de caracteres usado para guardar en disco el fichero actual

Para que Emacs reconozca un fichero UTF-8 al abrir podemos poner la variable automática -*- coding: mule-utf-8 -*- en la primera línea del fichero. Con M-x list-coding-systems puedes ver la lista completa de códigos admitidos.

Macros

Grabar una macro:

  • C-x (
  • Teclear la secuencia de caracteres
  • C-x )

Reproducir la macro grabada:

  • C-x e

También podemos poner en .emacs:

(global-set-key [(shift f1)] 'call-last-kbd-macro)

esto ejecuta la última macro grabada al pulsar SHIFT+F1

Reproducir la macro grabada N veces seguidas:

  • C-u N C-e, donde N es un número
Ejemplo: Poner etiquetas XHTML

Si estamos editando un fichero XHTML y tenemos que poner etiquetas a muchísimas palabras entonces una macro ahorrará mucho tiempo. Grabarla es muy fácil:

  1. Situamos el cursor en la palabra
  2. C-x (
  3. C-flecha izquierda, desplazar el cursor a mano pulsando repetidas veces flecha izquierda no sirve porque cada palabra tiene distinta longitud
  4. <etiqueta>
  5. C-flecha derecha, idem a lo dicho anteriormente
  6. </etiqueta>
  7. C-x )
Y ya está. Ahora cada vez que queramos poner la etiqueta <etiqueta> a una palabra después de escribirla, sólo pulsaremos C-x e. Cuando grabes una macro piensa en la posición y longitud que tendrán las palabras o párrafos a los que quieres dar formato automático y usa movimientos directos del cursor con C-p, C-n, C-a, C-e etc.

Las macros efectúan un procesado de texto que puede llegar a ser bastante complicado. Para un procesado más complejo aun podemos escribir un script en LISP que es posible integrar y ejecutar directamente dentro de Emacs.

Usar Emacs como IDE

Dired

Dired es el "Explorador de Windows" de Emacs. Administra ficheros y directorios, nos permite crear directorios, mover ficheros, copiarlos, renombrarlos, des/comprimirlos, etc. El número de órdenes que acepta este módulo es enorme. Algunos de las órdenes más comunes son:

Orden Atajo Descripción
dired Arranca Dired
dired-create-directory + Crea un nuevo directorio
etc etc etc

SpeedBar

Teclea M-x speedbar para mostrar la "speedbar". La speedbar es una nueva ventana que muestra una lista de búferes abiertos o de funciones o clases del programa. Esto último requiere la asignación de etiquetas en el código fuente para poder navegar por el. TODO

Terminal

Orden Atajo Descripción
shell  ? Abre un terminal dentro de un búfer de Emacs
comint-interrupt-subjob C-c C-c Equivalente a C-c en un terminal normal en UNIX.
comint-send-eof C-c C-d Envía un carácter EOF.

Si tienes activada la salida en color de ls (ls --color=auto) verás en el búfer de Emacs un montón de caracteres extraños. Esto es así porque Emacs no interpreta correctamente los caracteres especiales de color así que tendrás que desactivar el color (ls --color=none) si quieres ver bien la salida.

Control de versiones con SVN

This article or section is still a stub. Este artículo o sección es todavía un esbozo.

GDB

Emacs 22 viene con una nueva interfaz con GDB, mucho mejor que la anterior...

This article or section is still a stub. Este artículo o sección es todavía un esbozo.


Editor hexadecimal

Teclea hexl-mode para transformar la vista del fichero en curso y mostrar su contenido en hexadecimal.


Corrección ortográfica y diccionario

aspell

Para usar el corrector ortográfico aspell con Emacs, primero debemos instalarlo. en Debian por ejemplo:

$ apt-get install aspell-es

También existe una versión para Windows. Acuérdate de añadir al PATH el directorio c:\Archivos de programa\Aspell\bin

Para verificar el búfer completo, teclea M-x ispell-buffer y sigue las instrucciones en pantalla para reemplazar las palabras mal escritas. Fíjate en la línea superior que aparece en el búfer con la lista de posibles sustituciones y usa una tecla numérica para reemplazar o r para escribir tú mismo la palabra.

Si has instalado los diccionarios de varias lenguas, puedes cambiar de uno a otro mediante M-x ispell-change-dictionary RETURN y luego TAB para ver la lista completa de posibles diccionarios.

Es posible cambiar automáticamente de diccionario en connivencia con algunos modos; por ejemplo, si estas escribiendo en modo LaTeX puedes hacer que Emacs use automáticamente el diccionario correspondiente a la lengua que estás usando (más información).

flyspell-mode

En el modo Flyspell Emacs resalta las palabras mal escritas a medida que las escribes. Para entrar en él, teclea M-x flyspell-mode RETURN tras lo cual la palabra "Fly" aparece en la barra de modo y las palabras mal escritas se subrayan. Para cada palabra subrayada existe un menú con una lista de posibles alternativas.

Diccionario

Hay varios diccionarios para Emacs, yo uso

$ apt-get install dictionary-el

Tras lo cual, dentro de Emacs, teclea M-x dictionary

Email y USENET

Emacs tiene un módulo llamado GNUS que es tanto un lector de noticias (USENET) como de email. Aunque GNUS no es necesariamente mejor que otros programas como ThunderBird, Evolution, Eudora, Outlook, etc, la ventaja de usar Emacs para estos menesteres es que es ligero, funcional, es posible integrarlo con otras herramientas (p. ej: mailcrypt) y además lo podemos ejecutar desde el terminal y esto a veces viene muy bien.

El correo viaja a través de Internet mediante el protocolo SMTP. El correo, una vez que llega a su nodo destino, queda almacenado en un buzón. Los buzones pueden ser locales o remotos (es decir, que no están en nuestro ordenador). En el caso de los buzones remotos lo normal es acceder a ellos bien mediante el protocolo POP o bien mediante IMAP (recomendado).


Configuración de USENET

Edita el fichero de configuración ~/.gnus.el y escribe algo parecido a esto, pon el nombre del servidor de acceso a USENET que estes usando, por ejemplo:

(setq user-full-name "Fulano Mengano")
(setq user-mail-address "fulano_mengano@gmail.com")

(setq gnus-select-method '(nntp "news.gnus.org"))

En España, no sé porqué pero los servidores de acceso a USENET prácticamente han desaparecido o se ofrecen como un servicio secundario si te registras en algunos portales como por ejemplo www.terra.es (news.terra.es), muchos de ellos están caidos largos periodos de tiempo. Un desastre.

Cuando Emacs se haya conectado aparecerá una ventana con todos los grupos de USENET a los que puedes acceder desde ese servidor y que son visibles. Seguramente hay muchos más que no puedes ver porque están en estado "zombie" o "muertos".

  • Teclea A z para ver los grupos "zombies"
  • Teclea A k para ver los grupos "killed"
  • Suscríbete a un grupo de tu interés (normal, zombie o muerto, eso da igual) con u

Visualiza ahora sólo los grupos suscritos "A u".

Configuración del correo

Supondré que vamos a usar el protocolo SMTP para el correo saliente (¿y cual sino?) e IMAP para sondear el buzón de entrada. Es decir supondré que el correo una vez llega a su destino queda almacenado en un buzón remoto en un servidor y que usamos IMAP para acceder a él. Si quieres usar POP y el servicio Gmail lee esto.

IMAP es un protocolo de sondeo a un buzón de correo. Puede hacer lo mismo que POP y muchas más cosas, podríamos decir que es un protocolo "POP++".

Con IMAP puedes tanto descargar los mensajes en tu máquina y gestionarlos localmente con gnus, mutt, pine, etc. como gestionarlos directamente en el propio servidor sin necesidad de descargarlos. Esta última característica es muy interesante si lees tu correo en casa, en la oficina, etc. de esta forma tendrás tu correo siempre disponible y gestionado independiente desde donde te conectes.

El fichero de configuración de GNUS es ~/.gnus.el (pero yo personalmente prefiero poner las siguientes líneas en .emacs para así tener un sólo fichero con toda la configuración)

(setq message-send-mail-function 'smtpmail-send-it
           smtpmail-default-smtp-server "mail.domain.com")

(setq gnus-secondary-select-methods
      '((nnimap "mail.domain.com")))

El fichero ~/.authinfo contiene el nombre y contraseña que debe usar en el servidor mail.domain.com. Añade tantas líneas como servidores tengas.

machine mail.domain.com login my_user@domain.com password my_pass123

Conviene que este fichero sea de sólo lectura y que sólo lo puedas leer tú, ya que contiene las contraseñas de acceso

 chmod 400 .authinfo

GNUS usa siempre el método más seguro para acceder al servidor, si SSL o TLS están disponibles, intentará usar IMAPS (IMAP Secure). Los puertos que usa son los habituales pero se pueden cambiar, para ello lee la documentación.

Si ahora vas al búfer *Group*, que es donde se listan todos los grupos de discusión suscritos verás que las carpetas de correo no aparecen. Esto es así porque primero debes suscribirte.

Pulsa "A A" para ver todos los grupos, y luego "u" para suscribirte a aquellos que te interesen. Ahora "A u" para ver sólo los grupos suscritos. Voilà.

       0: nndraft:queue 
       0: nndraft:drafts 
    8850:*gnu.emacs.gnus 
       4: nndoc+gnus-help:gnus-help 
       4:*nnimap+mail.domain.com:INBOX 
       0: nnimap+mail.domain.com:INBOX.spam 
Notación
La linea 4:*nnimap+mail.domain.com:INBOX significa que hay 4 mensajes, el asterisco me dice que algunos todavía no han sido leidos, nnimap es el protocolo de acceso (IMAP), mail.domain.com es el servidor IMAP e INBOX es el grupo de discusión (que es este caso no es tal, sino una carpeta de correo).

Como ves, GNUS trata el correo electrónico como si fuesen artículos de USENET, a las carpetas de correo en el servidor las considera "grupos de discusión". Esto tiene algunas consecuencias importantes que debes tener en cuenta como por ejemplo que cada mensaje tiene un tiempo de vida tras el cual expira y desaparece del listado, esto no significa que haya sido borrado, simplemente significa que desaparece de la vista y hay teclear /-o para volver a mostrar los mensajes viejos. En general, debes acostumbrarte a ello y no intentar cambiar la configuración de GNUS para que se parezca lo más posible a un cliente de correo normal. Eso es una batalla perdida y además no merece la pena.



ERC

ERC es un cliente de IRC completo para Emacs. Podemos invocarlo de dos maneras distintas:

  • M-x irc. Se conecta automáticamente a la red de IRC irc.freenode.net con el nombre de usuario de la cuenta de Windows/Linux. FreeNode es posiblemente la red de IRC más popular y la que alberga casi siempre los canales de discusión sobre proyectos de sw libre (#emacs, #debian, #mediawiki, etc)
  • M-x erc. En el minibufer nos pregunta el nombre de la red IRC, nick y password. Por ejemplo: irc.irc-hispano.org, pepe, password. Si no tenemos ningún nick registrado pulsamos Enter cuando pregunte la contraseña, más adelante tendremos que registrar nuestro nick de la forma que nos indiquen los administradores del servidor. La mayoría de los canales están protegidos (+R) para que sólo los usuarios registrados puedan entrar
02:51 *** 375 - sterling.freenode.net Message of the Day - 
02:51 *** 372 - Welcome to sterling.freenode.net in Hoofddorp, NL, EU! 
02:51 *** 372 - Thanks to Chris Mentjox, Martijn Bakker, Guido Bakker, Peter
02:51 *** 372 - Bosgraaf and to Cable & Wireless for sponsoring this server!
02:51 *** 372 - 
02:51 *** 372 - STERLING, BRUCE, [1954-].  Born in Texas, US, author of
02:51 *** 372 - Islands in the Net, The Hacker Crackdown and numerous
02:51 *** 372 - other titles, Bruce Sterling is an unofficial spokesman for
02:51 *** 372 - the cyberpunk genre of science fiction.  He writes a regular
02:51 *** 372 - column, Catscan, for SF Eye and lives in Austin, Texas,
02:51 *** 372 - with his wife and daughter.
02:51 *** 372 -
...

Ahora ya estamos conectados a la red IRC elegida y podemos entrar en un canal de chat exactamente igual que lo haríamos con otros clientes de IRC tales como XChat o mIRC. Para subir y bajar por el bufer de texto tenemos los atajos de teclado de siempre. La línea de ordenes es la última del bufer, para escribir primero debemos posicionar el cursor en ella (C-fin)

>/join #emacs
>...
Algunas órdenes para el servidor IRC
Orden Comentario
/ Repite la última orden escrita
/away <away_message> Imprime un mensaje de ausencia, sin <away message> indica que has regresado
/help <keyword> Ayuda sobre la orden <keyword>
/invite <nickname> <#channel> Invita a otro usuario al canal
/join <#channel> Unirse al canal indicado
/list [#string] [-min #] [-max #] Lista todos los canales que concuerden con el patrón #string y que tengan entre #min y #max usuarios
/msg <nickname> <message> Envía un mensaje privado al usuario indicado sin abrir una ventana de consulta
/part <#channel> Sale del canal especificado.
/query <nickname> <message> Abre una ventana de consulta en el usuario indicado y le envía un mensaje privado
/quit [reason] Desconexión del IRC con un mensaje de despedida opcional
/time Indica cuanto tiempo llevas conectado al servidor
/who <#channel> Muestra el nick de todos los usuarios del canal

Pequeñas utilidades

  • Calendario: M-x calendar
  • Calculadora: M-x calc

Usos estrambóticos de Emacs

This article or section is still a stub. Este artículo o sección es todavía un esbozo.

  • Consultas a la base de datos CDDB
  • Conexión con MPLAYER para ver vídeo ascii art
  • Conexión con XAWTV para ver el teletexto
  • Editor básico de sonido
  • Intérprete de expect
  • No podriamos terminar esta lista sin hablar del (p)sicoterapeuta de Emacs, M-x doctor o M-x psychoanalyze-pinhead

Referencias



  1. Por eso se dice que Emacs es extensible, podemos extender su funcionalidad sin más que escribir nuevos módulos en elisp y agregarlo al programa