Archivo
Qué hacer si recibes un fichero .org
Si lo quieres modificar y no quieres usar el emacs (se descarga desde http://ftp.gul.es/gnu/ftp.gnu.org/gnu/emacs/) yo creo que lo mejor es abrirlo desde, por ejemplo, el openoffice/libreoffice (Archivo -> Abrir y eliges el fichero descargado). En Word supongo que es igual, pero no tengo un Word para probarlo.
Los títulos empiezan con * y los subtítulos empiezan con ** y los subsubtítulos con *** y así sucesivamente. No necesitas saber nada más pues no uso más artificios para los ficheros que estoy compartiendo contigo. Desde el emacs es muy cómodo navegar por el fichero porque al principio solo se ven los títulos y al dar a la tecla TAB se despliegan los subtítulos y si vuelves a dar a TAB se vuelven a plegar. Si los abres con Word u OpenOffice aparece todo desplegado y tienes que tirar de scroll como te pasa en cualquier otro documento .doc u .odt
Org mode es todo un mundo y esta es su página oficial http://orgmode.org/es/index.html por si te interesa, que igual no, por lo que no me enrrollo más.
Gnus + Gmail + Offlineimap
En un anterior artículo se ha explicado como tener emacs funcionando con gnus para leer el correo de Gmail. En este artículo daremos un paso adelante: poder leer correo imap desconectados teniendo una copia de todo el correo en local y sincronizarlo de manera eficaz.
Con apt-get install dovecot-imapd instalamos el servidor imap al que accederemos desde gnus. La configuración de dovecot que viene en debian es extensa y consta de muchos ficheros, interesa meter una sola línea:
mail_location = maildir:%h/Maildir
Y lo haremos en el fichero /etc/dovecot/conf.d/10-mail.conf
Offlineimap realizará el trabajo de sincronizar el directorio ~/Maildir con Gmail. Con apt-get install offlineimap instalamos la aplicación en debian/ubuntu. La configuración del fichero ~/.offlineimaprc sería:
[general]
accounts = Gmail
maxsyncaccounts = 1
[Account Gmail]
localrepository = Local
remoterepository = Remote
[Repository Local]
type = IMAP
remotehost = localhost
port = 993
remoteuser = miusuario
[Repository Remote]
type = Gmail
remoteuser = miusuario@gmail.com
remotepass = micontraseña
holdconnectionopen = true
keepalive = 60
Ahora ya se puede lanzar offlineimap, la primera vez lo mejor es hacerlo desde línea de comandos y si llevas años usando gmail es probable que tarde bastante en descargar todo el correo.
Mientras eso ocurre se puede configurar gnus por ejemplo de la siguiente manera:
(setq gnus-select-method
'(nnimap "Mail"
(nnimap-address "localhost")
(nnimap-stream network)
(nnimap-authenticator login)))
Una vez que se ha descargado el correo se puede ver que todo va bien haciendo M-x gnus desde emacs.
Puesto que para tener el correo actualizado es necesario ejecutar offlineimap he creado la siguiente función interactiva para ello:
(defun offlineimap ()
(interactive)
(shell-command "offlineimap&" "*offlineimap*" nil))
Una vez añadida al .emacs y cargada se llama con M-x offlineimap.
Múltiples cuentas de smtp en GNUS con msmtp
En un artículo anterior ya se explico cómo configurar Gmail en Gnus incluyendo el servidor de smtp. La idea de este artículo es que Gnus elija el servidor smtp en función del from que introducimos.
Hay diferentes formas de gestionar esto. Aquí se ha elegido usar msmtp por su estabilidad y sencillez.
Así es que lo primero será instalar msmtp:
sudo apt-get install msmtp
Después se crea un fichero .msmtprc para almacenar las cuentas de smtp:
################################# account gmail host smtp.gmail.com domain smtp.gmail.com tls on tls_certcheck off tls_starttls on auth on user correo@gmail.com from correo@gmail.com password XXXXXXXX port 587 logfile ~/msmtplog.txt ################################## account gnues host chapters.gnu.org domain chapters.gnu.org tls on tls_certcheck off tls_starttls on auth on user miusuario from miusuario@es.gnu.org password XXXXXXXXX port 25 logfile ~/msmtplog.txt ##################################
Una vez hecho esto se cambian los permisos del fichero de configuración:
chmod 600 ~/.msmtprc
Y ahora se reemplaza la configuración que hubiera en el .emacs relativa a smtp por lo siguiente:
(defun cg-feed-msmtp ()
(if (message-mail-p)
(save-excursion
(let* ((from
(save-restriction
(message-narrow-to-headers)
(message-fetch-field "from")))
(account
(cond
;; I use email address as account label in ~/.msmtprc
((string-match "correo@gmail.com" from) "gmail")
;; Add more string-match lines for your email accounts
((string-match "miusuario@es.gnu.org" from) "gnues"))))
(setq message-sendmail-extra-arguments (list "-a" account))))))
(setq message-sendmail-envelope-from 'header)
(add-hook 'message-send-mail-hook 'cg-feed-msmtp)
;; with Emacs 23.1, you have to set this explicitly (in MS Windows)
;; otherwise it tries to send through OS associated mail client
(setq message-send-mail-function 'message-send-mail-with-sendmail)
;; we substitute sendmail with msmtp
(setq sendmail-program "/usr/bin/msmtp")
Modificando claro lo relativo al correo y a las etiquetas de msmtp que hayais puesto.
Con esto ya debería valer, pero podéis depurar posibles errores lanzando msmtp desde línea de comandos y revisando el log que en este caso está en ~/msmtplog.txt
Suerte!
Tutorial de org-mode
Esta página es una traducción al español del tutorial original de David O’Toole. Dicha traducción fué contribuida a Worg.
Introducción
Org-mode es un gestor de información personal y una herramienta de
resúmenes para Emacs. Este documento pretende dar al lector una
primera impresión de org-mode y enseñar el uso básico con
instrucciones paso a paso y mediante pantallazos. No se pretende
reemplazar el manual, ya que solo se cubre un subconjunto de las
funcionalidades de org-mode.
Este documento también está traducido en Francés, Japonés, Chino, and
Coreano. Agradecimientos especiales a los traductores
Obteniendo org-mode
Org-mode es parte de Emacs 22 y 23, así si tiene una versión moderna
de Emacs, entonces ya lo tiene.
Si no, se puede descargar desde la web de org-mode, se descomprime y
se enlaza el load path de Emacs al directorio lisp de dicha
distribución de Org-mode:
(add-to-list 'load-path "PATH_TO_WHERE_YOU_UNPACKED_ORGMODE/lisp")
Activación
Añade lo siguiente a tu .emacs:
(require 'org-install)
(add-to-list 'auto-mode-alist '("\\.org$" . org-mode))
(define-key global-map "\C-cl" 'org-store-link)
(define-key global-map "\C-ca" 'org-agenda)
(setq org-log-done t)
Esto asegurará la carga de org y la definición de algunas
combinaciones de teclas. Se mostrará qué hacen “org-store-link” y
“org-agenda” más adelante en este mismo documento
Una cosa más —es mejor definir un directorio separado dónde tus
ficheros org se almacenarán. Yo recomiendo usar ~/org.
Lo básico
Esta sección ilustra el uso básico de org-mode mostrando cómo yo usé
org-mode para crear este documento.
Creando un nuevo fichero
Si se configuró el fichero de inicialización de Emacs como se sugería
arriba, Emacs debería entrar en org-mode siempre y cuando se visite o
cree un fichero con la extensión “.org”
Yo cree un nuevo fichero llamado “OrgTutorial.org” y ví el indicador
“Org” en el modeline, mostrando que había entrado en org-mode.
Lista simple de tareas
Primero introduje un headline llamado “Tasks” (Tareas) para
almacenar la tareas dentro. Esto no es necesario pero, con frecuencia,
es conveniente, especialmente si se quiere almacenar tareas separadas
del cuerpo del documento que se está escribiendo
Los títulos de primer nivel empiezan con una estrella; los de segundo
nivel con dos estrellas, y así.
En org-mode, los ítems TODO (tareas no hechas) son siempre títulos. Se
introdujo un ítem TODO para “Start new org file for tutorial” (Empezar un nuevo fichero org tutorial).
http://orgmode.org/worg/images/dto/tutorial-1.png
Esto es un poco tonto, porque ya se ha iniciado un nuevo fichero. Así,
márquese el ítem TODO como ítem DONE (tarea ya realizada) moviendo el
cursor a esta esa línea y pulsando C-c C-t, que ejecuta el comando
org-todo.
Aquí está el resultado:
Nótese cómo org-mode usa una marca de tiempo para grabar cuando un
ítem TODO fué cerrado.
Permítase añadir algunos ítems TODO más. Posicione el cursor en la
siguiente línea y pulse M-shift-RET para llamar a
org-insert-todo-heading. Se puede pulsar varias veces y añadir
varios TODOs.
Usando títulos para estructurar un documento
Con frecuencia el mejor camino para organizar las ideas es un
esquema. El siguiente paso es hacer un esquema de los diferentes
asuntos del tutorial. Haciendo esto, se rompe la intimidatoria página
en blanco en una serie de pequeños trozos menos
intimidatorios. Llegando entonces, a ser sencillos de rellenar.
Recuerda que una estrella da comienzo a una cabecera de primer nivel,
y dos estrellas dan comienzo a una cabecera de segundo nivel. Si se
necesita un anidamiento más profundo, ¡usa tres o más estrellas!
Aquí está lo que se ve después de hacer un esquema del documento:
Nótese que se marcó “Outline document” (Esquematizar el documento)
como DONE después de finalizar.
Rellenando secciones
Fácilmente se puede añadir texto un cuerpo de texto debajo de
cualquier título.
Enlaces a otros lugares
En la sección “Obteniendo org-mode” se necesita proveer un enlace al
sitio web de org-mode. Una sintaxis especial de corchetes es usada al
enlazar:
[[enlace][descripción]]
Observa cómo se escribió el enlace y descripción, dejando abierto el
último corchete:
Entonces cuando yo escribo el último corchete, el enlace “se encoge” y
simplemente muestra la descripción.
Pruebe a mover el cursor hasta el enlace y presione C-c C-o para
org-open-at-point (Abrir el enlace),
También se puede enlazar a ficheros locales. Pruebe visitando otro
fichero —por ejemplo, su fichero de inicialización de
emacs. Entonces pulse C-c l para llamar a org-store-link. Se verá
un mensaje acerca de que un enlace fué almacenado para la posición
actual en el fichero que se está visitando.
Entonces vuelva a su buffer org-mode y pegue el enlace usando C-c C-l para llamar a org-insert-link. (Puede necesitar presionar las
teclas de flechas para mover el scroll hasta encontrar el enlace
grabado.)
Visión de conjunto del documento
En este momento, el documento es largo y no se puede ver entero en una
sola pantalla. Org-mode hace fácil tener una visión de conjunto del
documento presionando shift-TAB.
Nótese que solo se muestran los títulos de primer nivel. Se puede
pulsar shift-TAB de nuevo para mostrar todos los títulos o
cabeceras, incluyento ítems TODO:
Pulsa de nuevo para mostrar una vista normal del documento, con los
cuerpos de cada sección:

Añadiendo notas a una tarea
Se puede poner tanto texto como se quiera bajo una cabecera de un ítem
TODO. De hecho, se puede tener incluso subcabecera bajo un TODO, ¡y
TODOs con TODOs!
Siendo capaz de anotar tareas hace fácil recoger enlaces relacionados
y pensamientos asociados a una tarea. Siendo capaz de anidar tarear es
bueno para modelar flujos de trabajo — con bastante frecuencia, una
tarea larga is dividida en pequeñas subtareas que se pretende marchar
según se hagan.
Saboreando funcionalidades avanzadas
Antes de finalizar, se verá brevemente las funcionalidades de org-mode
relativas a lista global de TODOs, planificación y agenda. Éstas son
usadas para combinar ítems TODO desde diferentes ficheros org
mostrándose de un modo priorizado y cronológico. También puede usarse
para ver qué tareas se completaron y cuando.
Configuración
Primero debe asignarse la variable org-agenda-files de tal modo que
org-mode conocerá qué ficheros buscar para TODOs e ítems planificados
Imagínese que ya tiene varios ficheros org —por ejemplo, uno para
trabajar, uno para casa y uno para clase.
En tal caso, se añadiría lo siguiente al fichero de inicialización de
emacs:
(setq org-agenda-files (list "~/org/trabajo.org"
"~/org/clase.org"
"~/org/casa.org"))
La lista TODO global
Presione C-c a t para introducir la lista global todo. Org-mode
escaneará los ficheros en org-agenda-files y presentará un listado
de todas los ítems TODO abiertos:
Se puede mover el cursor alrededor de diferentes ítems todo, y púlsese
“t” para marcar un ítem como DONE (hecho), o pulse RET para saltar
al fichero fuente donde el TODO está localizado.
Planificando tareas y usando la agenda
Imagine que se quiere planificar “Finish document” (Finalizar documento) para hoy. Entonces, se mueve el cursor a la línea de
después del ítem TODO llamado “Finish document” y se pulsa C-c C-s
para ejecutar org-schedule. El calendario aparece, y se puede
introducir o hacer click en la fecha deseada:
Una vez se selecciona la fecha, org-mode inserta una marca de fecha
planificada después del ítem TODO:
Ahora se guarda el fichero y se pulsa C-c a a para org-agenda. Se
mostrará una vista de los ítems planificados para esa semana:
Ahora presione “l” (minúscula L) para activar la vista de log. Esto
muestra por pantalla todas las tareas finalizadas y sus fechas de
terminación.
Despedida
Éste ha sido solo un breve paseo por org-mode. Más excitantes
funcionalidades aguardan en el manual online de org-mode.
Aprendiendo ikiwiki
Recientemente he descubierto ikiwiki. Y diréis ¿para qué otro wiki? pues bien a mi me resuelve muchos problemas, pero hay uno que es importante y es poder editar las entradas de mi sitio web personal directamente con mi emacs y poder administrarlas con un sistema de control de versiones, sin el desfase de usar un sitio html estático, ni el atraso de usar herramientas privativas como disqus. Así que es probable que este sitio en un futuro esté construido con ikiwiki, pero por ahora solo lo estoy evaluando. Dejo aquí mis impresiones:
¿Qué es ikiwiki?
ikiwiki is un compilador wiki. Construye páginas html para un wiki desde un fuente en el lenguajes de marcas ikiwiki (u otros).
Instalación
Muy sencillo en debian/ubuntu:
sudo apt-get install ikiwiki apache2
Y seguir los pasos de debconf para el tipo de control de version, la carpeta donde se situará el repositorio, etc.
Por tanto, también habrá que instalar un sistema de control de versiones, por defecto se usa git, aunque yo también he testeado bzr y funciona sin problemas.
En caso de elegir git:
sudo apt-get install git gitweb
Después habra que compilar un wiki local:
ikiwiki --setup /etc/ikiwiki/auto.setup
Es posible que tengas que configurar mínimamente el apache. Por ejemplo, habilitar el módulo userdir:
a2enmod userdir
O habilitar el uso de cgi.
Instalar plugins
- Descargar plugins desde http://ikiwiki.info/plugins/ a la carpeta ~/.ikiwiki/IkiWiki/Plugin/
- Especificar el lugar del fichero de configuración del wiki desde ~/.ikiwiki/wikilist (En mi caso es ~/wiki.setup)
- Aplicar los cambios con ikiwiki -setup /home/davidam/wiki.setup -rebuild -v
A modo de ejercicio, os proponemos que también instaleis el plugin de org-mode y de texinfo que a pesar de no ser plugins estables son poderosos
.
Habilitar multilenguaje con po
Quienes estén familiarizados con el proceso de traducción en gnu estarán familiarizados con gettext y los ficheros .po, sino es posible echar un vistazo a Traduciendo Documentación en Texinfo con emacs y po4a
Para que nuestro sitio sea multilingüe usando ficheros .po es necesario modificar la configuración de ikiwiki y el apache.
Primero modifiquemos la configuración de ikiwiki:
- Habilito po en la configuración
- master language: en|English
- slave languages: es|Español
- PageSpec controlling which pages are translatable: index or po-test (dos páginas para comprobar que todo va bien)
- internal linking behavior: default
Después la configuración de Apache:
- Añadir la siguiente línea a por ejemplo /etc/apache2/sites-available:
DirectoryIndex index.html index.htm index.en.html index.es.html
- Añadir a /etc/apache2/httpd.conf lo siguiente:
AddType application/rss+xml;qs=0.8 .rss AddType application/atom+xml;qs=0.8 .atom
Habilitando búsquedas
- Se habilita search en la configuración
- Al aplicar los cambios encuentro el siguiente error:
Can't locate Search/Xapian.pm in @INC (@INC contains: /home/davidam/.ikiwiki /etc/perl /usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at (eval 342) line 2. BEGIN failed--compilation aborted at (eval 342) line 2.
- Lo soluciono con:
sudo apt-get install libsearch-xapian-perl xapian-omega
Habilitando barra lateral
- Habilitar sidebar en la configuración
- Crear una página sidebar.mdwn con el contenido que se desee
Modificando el aspecto
Lo más sencillo es habilitar themes en la configuración y elegir un tema. Pero para afinar más se puede crear un fichero local.css en el directorio raíz subirlo al repositorio e (importante) reconstruir el wiki con
ikiwiki -setup /home/davidam/wiki.setup -rebuild
Traduciendo Documentación en Texinfo con emacs y po4a
Texinfo es el formato de marcas estándar para documentación de GNU. Permite crear manuales en formato pdf, info, html, etc. desde un solo fichero fuente .texi con las características avanzadas que debería tener un buen manual.
Antes de familiarizarnos con los comandos del proceso de traducción instalemos los paquetes debian que vamos a utilizar:
apt-get install texlive texinfo texi2html emacs23 gettext-el po4a aspell-es dict dict-freedict-eng-spa dict-freedict-spa-eng dictionary-el dict-gcide
Si tenemos un fichero texinfo y queremos convertirlo a pdf se puede usar el siguiente comando:
texi2pdf myfile.texi
El problema con texi2pdf es que a veces no ofrece buenos mensajes de depuración, para depurar es mejor hacerlo con:
makeinfo myfile.texi
Además con este comando se crea el fichero .info
Si queremos crear un sitio web con nuestro documento podemos usar:
texi2html myfile.texi
Si se desea traducir el fichero del inglés al español u otras lenguas es posible utilizar gettext gracias a po4a. Siguiendo estos pasos:
po4a-gettextize -f texinfo -m myfile.texi -p myfile.pot # Crea un fichero .pot a partir de un .texicp myfile.pot myfile.es.po- Se traduce del inglés al español abriendo myfile.es.po con emacs en modo po-mode
po4a-translate -f texinfo -m myfile.texi -p myfile.es.po -l myfile.es.texi # Creamos myfile.es.texi, el texi traducido
Es probable que con el tiempo salgan nuevas actualizaciones del fichero .texi original, podemos actualizarnos con msgmerge del siguiente modo:
po4a-gettextize -f texinfo -m myupdated.texi -p myupdated.pot # Crea el fichero .pot actualizado a partir del nuevo .teximsgmerge myold.es.po myupdated.pot > myupdated.es.po
Las frases en las que haya habido variaciones aparecerán como fuzzy debiendo ser debidamente revisadas.
Y ahora vemos algo de configuración del .emacs para hacer más fácil y divertida la traducción:
;;;; PO-MODE ;;;;
(require 'po-mode)
(defun iacute()
(interactive)
(insert "@'{@dotless{i}}"))
;; El atajo C-i insertará i acentuada, a la manera nativa de texinfo
(define-key po-subedit-mode-map "\C-i" 'iacute)
;; Debe cortar las líneas automáticamente
(add-hook 'po-subedit-mode-hook 'auto-fill-mode)
;;;; ASPELL ;;;;
;; Para que avise
(setq ispell-program-name "aspell"
ispell-extra-args '("--lang=es"))
(add-hook 'po-subedit-mode-hook
(lambda()
(flyspell-mode 1)))
;;;; Dictionary ;;;;
(global-set-key "\C-cs" 'dictionary-search)
(global-set-key "\C-cm" 'dictionary-match-words)
Gmail desde Emacs Gnus
Recientemente he configurado mi emacs para poder leer el correo de gmail. Básicamente es lo que viene en http://www.emacswiki.org/emacs/GnusGmail. Pero en este artículo trataré de explicarlo paso a paso y en castellano.
Gnus viene instalado con emacs, que en ubuntu 11.04 se instala de la siguiente forma:
sudo apt-get install emacs23
La configuración del .emacs para descargar correo es
;; GNUS ;;
(setq gnus-select-method '(nnimap "gmail"
(nnimap-address "imap.gmail.com")
(nnimap-server-port 993)
(nnimap-stream ssl)))
(add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
;; Threads are nice!
(setq gnus-summary-thread-gathering-function
'gnus-gather-threads-by-subject)
Aparte en .authinfo es necesario meter la siguiente línea:
machine imap.gmail.com login correo@gmail.com password mipassword port 993
Ahora ya deberíamos poder descargar correo en emacs con M-x gnus. Lo primero que deberemos hacer es suscribirnos a algún grupo con la letra U. Una vez suscrito pulsamos enter en el grupo y ya podemos acceder.
Lo siguiente es poder enviar correo si usamos el smtp de gmail nuestros correos quedarán almacenados en el servidor automáticamente. La configuración es la siguiente:
;; SMTP ;;
(setq message-send-mail-function 'smtpmail-send-it
smtpmail-starttls-credentials '(("smtp.gmail.com" 587 nil nil))
smtpmail-auth-credentials '(("smtp.gmail.com" 587 "correo@gmail.com" nil))
smtpmail-default-smtp-server "smtp.gmail.com"
smtpmail-smtp-server "smtp.gmail.com"
smtpmail-smtp-service 587
smtpmail-local-domain "ubuntu")
(setq user-full-name "David Arroyo Menéndez")
(setq user-mail-address "correo@gmail.com")
No obstante, primero deberemos instalar starttls, en debian/ubuntu apt-get install gnutls-bin
Otra funcionalidad que considero vital es que autocomplete la dirección de correo electrónico. Para ello es necesario 2 modos de emacs: bbdb + google-contacts y algo de software python + gdata. En debian/ubuntu podemos hacer apt-get install python-gdata bbdb y ya solo nos faltará descargar y descomprimir en tu directorio emacs el proyecto googlecontacts.
Mi configuración en el .emacs de bbdb y google-contacts es la siguiente:
;;;; BBDB ;;;;
(setq bbdb-default-country "Spain"
bbdb-north-american-phone-numbers-p nil
bbdb-default-area-code "91"
bbdb-quiet-about-name-mismatches t
bbdb-file "~/.bbdb")
(require 'bbdb)
(bbdb-initialize)
(add-hook 'gnus-startup-hook 'bbdb-insinuate-gnus)
(add-hook 'gnus-startup-hook 'bbdb-insinuate-message)
(add-hook 'message-setup-hook 'bbdb-define-all-aliases)
;;;; Google Contacts ;;;;
(setq load-path (append load-path (list (expand-file-name "~/emacs/google"))))
(require 'google-contacts)
(setq google-contacts-user "davidam") ;;; GOOGLE USER
(setq google-contacts-code-directory "~/emacs/google/code") ;;; PATH TO THE PYTHON CODE
(setq google-contacts-directory "/tmp") ;;; TEMPORARY DIRECTORY
(setq google-contacts-auto-update t ) ;;; DEFINE IF THE CONTACTS ARE DOWNLOADED AFTER EVERY MODIFICATION
Y así automáticamente podemos autocompletar con TAB al escribir un correo desde GNUS.
Actualización (29/09/2011): Al hilo de este artículo he publicado cómo utilizar Múltiples cuentas de smtp en GNUS con msmtp
Actualización (21/10/2011): Otro artículo relacionado: Gnus + Gmail + Offlineimap y así poder leer correo de gmail en gnus también cuando se está desconectado.
Aumenta tu Productividad con GNU/Emacs
Introducción
La primera herramienta que basa su desarrollo en compartir código dentro de una comunidad, sigue teniendo una comunidad fuerte que lleva el uso de este editor hasta límites insospechados. En un momento en el que se mueven cifras millonarias alrededor del Software Libre, este editor se sigue manteniendo por aportaciones desinteresadas, ó más bien interesadas en cuestiones culturales y, de productividad personal y profesional. Así mismo, la historia de GNU Emacs es la historia de los hackers de la IA, de Lisp y de la investigación, pero también es usado en entornos donde se busca la rentabilidad económica.
En este artículo vislumbraremos cómo ser productivo con GNU Emacs, tanto en tareas exclusivas de programación, de uso general del editor y, casi cualquier tarea que se necesite hacer delante de un ordenador.
Conceptos Generales de Uso del Editor
Antes de ahondar en temas más avanzados abramos un emacs y aprendamos a diferenciar window, buffer, mini-buffer, puntero y marca.
Buffer: Podemos decir que un buffer es una lupa a un fichero emacs. Desde un mismo buffer podemos diferenciar una parte de un solo fichero. Desde distintos buffers podemos ver uno ó varios ficheros. Desde un buffer se muestra contenido para ser editado, si bien también tenemos buffers de solo lectura.
Window: El concepto de ventana en emacs es similar al mismo en otros entornos. Esto es, un elemento de información que es gestionada por un gestor de ventanas. Un proceso puede tener asociado a un numero n de ventanas y buffers.
Mini-buffer: Es el lugar donde se envían comandos al editor y se sitúa en el pie de la ventana (window).
Puntero: Es un diminuto rectángulo parpadeando que se sitúa donde estás escribiendo.
Marca: A veces, es necesario dejar una marca con C-SPACE para cortar, copiar, o invocar una función en una determinada región.
Productividad con GNU/Emacs
En esta sección se mostrarán algunas características para volverte productivo usando GNU Emacs. Debemos pensar que un programador pasa muchas horas delante de un editor de textos, tener un solo editor que te libere de tareas monótonas es claramente beneficioso.
Si nunca has usado Emacs lo primero que tendrás que empezar a aprender serán atajos de teclado, ¿has probado a bajarte un quicksheet?. Si ya conoces atajos de teclado de bash, prueba con esos y si no puedes hazlo al revés. En cualquier caso con C-h t abres un tutorial con el que te divertiras aprendiendo atajos comunes
Modos
Una de las características que hacen a Emacs interesante es que hay modos para casi cualquier lenguaje de programación por raro que éste sea. Esto es, colorines, atajos de teclado, plantillas, etc. De este modo, sabiendo usar de manera eficaz el editor y sabiendo programar puedes programa muy rápido en cualquier lenguaje. Hay otros programadores que prefieren aprender un entorno en función del lenguaje que vayan a usar …
Con M-x sql-mode, por ejemplo, estaríamos invocando al modo sql, si no nos gusta el modo en el que nos toca programar podemos volver a fundamental-mode que es el modo que nos permite escribir texto de la manera más simple posible.
Para conocer los atajos del modo mayores en el que se está se puede utilizar C-h m y para conocer atajos disponibles en ese momento C-h b. Esto es distinto debido a que aparte de modos mayores hay modos menores, la diferencia estriba en que un modo mayor se adapta a la tarea general que estás desarrollando mientras que un modo menor se adapta a una tarea específica dentro de la tarea general. Por ejemplo, si estamos escribiendo un programa en c, podemos usar c-mode, pero dentro de los comentarios podría
Si bien la instalación de nuevos modos no es difícil y, hay paquetería de éstos para muchas distribuciones, también existe una manera estándar de instalar paquetes en GNU Emacs llamada ELPA
Variables
Lo primero que se hace cuando te enfrentas a una nueva herramienta, ya sea un editor de textos, un servidor o cliente de correo, jabber, ó lo que sea es hacer pequeñas personalizaciones. Esto en emacs suele ser equivalente a asignar un valor a una variable. Veamos algunas personalizaciones simples que pueden ser añadidas a un .emacs:
;;; quitar la barra de navegación (tool-bar-mode nil) ;;; introducir colorines (global-font-lock-mode)
C-h v describe el valor de una variable dada. Una variable interesante es auto-mode-alist esta variable nos dice que modos están asociados a que extensiones de ficheros, así si queremos asociar ficheros html a html-helper-mode podemos hacer lo siguiente:
(setq auto-mode-alist (cons '("\\.htm$" . html-helper-mode) auto-mode-alist))
Macros
Si hacemos una tarea de manera repetitiva (ir al comienzo de un párrafo, cortar la primera palabra, pegarlo al final del párrafo, ir al siguiente párrafo, …), nos puede resultar interesante grabarlo para llamar a esa tarea con un atajo de teclado. La manera de hacer esto es comenzar a grabar con C-(, después ejecutas las acciones: (ir al comienzo de un párrafo, cortar la primera palabra, ir al final del párrafo y pegarlo) y paras la grabación. Cuando quieras utilizarlo puedes llamarlo con C-x e, por ejemplo, desde el siguiente párrafo donde quieres introducir la acción.
Funciones
Si tenemos una macro que queremos seguir utilizando en futuras sesiones de emacs, lo más cómodo es guardarlo como una función y añadirla a tu .emacs.
Algo similar a lo que se ha explicado en la sección de macros sería decidir que lo que se acaba de escribir es un subtítulo en formato emacswiki, para ello se puede recurrir a la siguiente función:
(defun subtitle() (interactive) (beginning-of-line) (insert "==") (end-of-line) (insert "==") (forward-line 1))
Para ejecutar la función se podría llamar a M-x subtitle. Después puede resultar interesante asociar un atajo de teclado con el siguiente código:
(global-set-key "\C-c\st" 'subtitle)
También es posible ir desde el atajo de teclado a la función C-h k y de la función al código fuente C-h f.
Expresiones Regulares
Emacs también tiene un buen soporte para expresiones regulares, como muchos otro editores. Para usarlos mientras estamos escribiendo y queremos buscar haciendo uso de expresiones regulares se puede usar isearch-forward-regexp (C-M s), o reemplazar con query-replace-regexp (C-M %).
Puede utilizar las funciones antes mencionadas para actuar sobre buffers, pero para actuar sobre cadenas también puede utilizar replace-regexp-in-string. Ejemplo de uso: (replace-regexp-in-string “foo*” “fu” “Fight foo for food!)”
Autoinsert
Con autoinsert al abrir un fichero de una determinada extensión incluiremos algún texto en dicho fichero. Por ejemplo:
(require 'autoinsert)
(auto-insert-mode) ;;; Adds hook to find-files-hook
(setq auto-insert-directory "~/.mytemplates/")
(setq auto-insert-query nil)
(define-auto-insert "\.txt" "txttemplate")
Así, estamos insertando el contenido de txttemplate al abrir un fichero de extensión .txt. También es posible usar autoinsert en combinación con skeleton. Esto evita el tedioso trabajo de añadir nota de copyright, librerías a cargar u otras líneas que suelen cambiar poco mientra se programa.
Skeleton
La finalidad de skeleton es dar unas plantillas para las que solo hay que rellenar algún dato. Por ejemplo,
(define-skeleton primitiva "Declare a primitive function and an example to use it." nil (read-string "Nombre de la Primitiva Lisp: ") ": " (read-string " Descripción de la Primitiva Lisp: ") \n "Ejemplo de Uso: ")
Este código no es más que un formulario para ir haciendo una chuleta de primitivas lisp y, así vamos poniendo el nombre de la primitiva, la descripción y un ejemplo de uso. Una vez que está cargado y/o añadido a nuestro .emacs se llama con M-x primitiva.
Abbrevs
En ocasiones, resulta útil construir alguna abreviación que por larga resulta molesta de escribir entera. Ésta es la utilidad de abbrev. Veamos como se define una tabla de abbrevs:
(setq-default abbrev-mode t)
(define-abbrev-table 'text-mode-abbrev-table '(
("foriter" "" java-iter-skeleton 0)
("iternext" "" java-iter-next-skeleton 0)
;; ...
("logdebug"
"org.apache.log4j.Logger.getLogger(getClass().getName()).debug()"
nil 1)
;; ...
("ctc" "true" nil 1)
("cfc" "false" nil 1)
("cnc" "null" nil 1)
("á" "á" nil 1)
))
A la izquierda de la tabla encontramos las abreviaturas y a la derecha el texto o función al que estamos llamando. Una vez cargado en el emacs el texto abreviado con C-x a e se expande el texto, también podemos expandir una región con M-x expand-region-abbrevs.
Funciones que llaman a comandos unix
En otras ocasiones nos interesa que el poder de la conocida línea de comandos llegue hasta nuestro emacs, podemos ver un par de ejemplos para entender a qué nos referimos
(defun insert-output (command) (interactive "sCommand: ") (insert (shell-command-to-string command))) (defun output-to-buffer (buffer command) (interactive "sBuffer name: \nsCommand: ") (get-buffer-create buffer) (call-process command nil buffer) (switch-to-buffer (get-buffer buffer)))
En ambos ejemplos podemos insertar la salida de un proceso dentro de nuestro buffer. Hay otras maneras de interactuar con unix desde emacs como M-x shell ó M-x ansi-term o M-!, y así evitamos salir de emacs, pero así no extendemos nuestro emacs.
Conclusión
Emacs tiene poderosos y simples mecanismos de extensibilidad que hacen que tu editor se comporte tal y como tu quieres realmente. En este artículo, solo hemos visto unas pocas herramientas, sin embargo, quedaría mucho por aprender. Así mismo, tiene una comunidad fuerte: listas, irc, manuales, … que sigue creciendo según pasan los años. Así, las posibilidades de Emacs son tan sorprendentes, útiles y divertidas que es interesante en invertir algún tiempo en usarlo para siempre.