NOTAS SOBRE EMACS

Índice

1 Emacs: A modo de pequeña introducción

Estas notas son una modificación del curso de emacs publicado en la web http://lapipaplena.org sin la rigidez de aquel para permitir extenderlo sin problemas. La intención es exactamente la misma, o sea en primer lugar, contribuir en lo posible a que la gente le pierda el miedo a este "editor", en segundo lugar que aquellos que en su vida jamás hubieran oído hablar de él puedan desenvolverse en este entorno con suficiente decencia y tercero, nada de páginas y más páginas de combinaciones de teclas, por lo demás, bastante habituales en los tutos de emacs.

Cada capítulo abordará uno o varios temas confeccionados a salto de mata y sin ningún tipo de planificación. La distro sobre la que trabajo es una Debian 8 testing y la terminal que se usará es sakura (apt-get…) una especie de terminator (con pestañas, paneles, F11 para maximizar/minimizar…) con la ventaja de ser poco conocida lo cual, aunque no tengamos repajotera idea de emacs, nos da un aire así como de más frikis. Es importante usar la misma terminal. Viene al caso porque no todas se comportan igual; por ejemplo la xfce4-terminal, tiene asociadas determinadas teclas a acciones especificas de la propia terminal que invalidan las de emacs o sea que para no liarnos con modificaciones en el mapeo de teclas, mejor usar para las presentes notas la que menciono y que está disponible en los repos de todas las distros.

Sin más preámbulos, instalamos emacs (apt-get, pacman o el instalador que proceda) y verificamos que la versión sea, al menos, la 24:

$ emacs --version.
GNU Emacs 24.4.1
Copyright (C) 2014 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.

Si nuestra distro todavía usara la versión 23 (los dioses no lo quieran) es preferible descargarse la última versión de su página oficial y compilarla:

# apt-get install git-core libxaw7-dev libxpm-dev libpng12-dev libtiff5-dev libgif-dev
# apt-get install libjpeg8-dev libgtk2.0-dev libncurses5-dev autoconf automake texinfo
# apt-get build-dep emacs
$ git clone git://git.savannah.gnu.org/emacs.git
$ cd emacs/
$ git checkout emacs-24.4
$ git checkout -b custom_branch
$ ./autogen.sh
$ ./configure --prefix=/opt/emacs24
$ make --jobs=2
# make install
# ln -s /opt/emacs24/bin/emacs /usr/bin/emacs24
$ emacs24

He puesto un enlace del ejecutable en /usr/bin/emacs24 por si no se ha desinstalado la versión de los repos (/usr/bin/emacs). Para ahorrarte todo este engorro, también puedes plantearte seriamente el cambio de distro.

Dado que, seguramente entre los lectores, predominan los usuarios de vi, empezaré con una breve reseña sobre él. Vi es mucho más simple que emacs principalmente porque para gestionarlo correctamente solo se precisa conocer una combinación de teclas:

:q!

Lo cual nos permite salir de vi y poder entrar en el editor de los dioses:

$ emacs -nw (O emacs24 -nw si lo hemos compilado)

Como muy bien sabemos, todos los sistemas operativos (los linux incluidos salvo algunas excepciones) están pensados para que puedan ser usados por las hermanas clarisas, o sea que si lanzamos emacs sin argumentos, se abrirá la versión gráfica, por eso usamos la opción -nw (No Window) o sea no gráfica. También podríamos haber instalado y lanzado emacs-nox (emacs No X) que para el caso sería algo parecido pero para entornos más propios de las ttys. La opción no gráfica permite acceder remotamente por ssh de forma rápida y cómoda máxime si se lanza en una sesión tmux o screen y a la vez permite en local, acceder a aplicaciones gráficas (firefox, evince …) sin problema. Naturalmente si entre los lectores están los que lanzan emacs (sin -nw) o incluso los que se han instalado y lanzado xemacs tampoco vamos a rasgarnos las vestiduras. Sepan que todo lo que se va a decir en las siguientes notas es válido para todos los sabores de emacs aunque, eso sí, aconsejaría que mientras se sigue cada apartado se use la opción -nw, más que nada para no dispersarnos demasiado y se dejaran las otras opciones para practicar a nivel personal.

Al arrancar, lo primero que se muestra es la pantalla de bienvenida y puede ser parecida a esta:

1-1.png

Vemos, en la parte superior, una barra de menús, debajo, la zona de edición y las dos lineas inferiores: la linea de modo y el área de eco o minibuffer (En estos momentos completamente negra). En la zona de edición o ventana se muestra una bonita y útil página de sugerencias (que pronto desactivaremos junto con la barra de menús) con algunos atajos y quedarnos con la copla que para deshacer cambios debemos de usar la combinación de teclas C-x u (Pulsar simultáneamente las teclas "Control" y "x" soltarlas y luego pulsar la "u").

Pero no nos dejemos llevar por la emoción del momento y pulsemos F10, con las flechas vamos a la pestaña "help", bajamos a la opción "Emacs Tutorial (choose language)…", tecleamos "Sp", completamos con el tabulador y pulsamos "Intro; accederemos a un tutorial en español (Si queremos otro idioma de los disponibles lo escogemos en la pantalla correspondiente) muy constructivo y recomendable y que cuando lo cerremos con C-x k nos preguntará en el minibuffer si queremos que nos guarde el punto donde nos encontramos (Save your position in the tutorial?) y nos abrirá el buffer scratch (tampoco tenemos mucho donde escoger, de momento)

1-2.png

Este buffer, como podemos observar en la linea de modo, tiene el nombre con un asterisco delante y otro atrás. Esto significa que no está asociado a ningún archivo o sea que al cerrar la sesión emacs perdemos su contenido (siempre podemos guardarlo con C-x w) y suele usarse como bloc de notas o para pruebas de elips. Como muestra de su funcionamiento un pequeño ejemplo. Copi/pasteamos:

(message "linux es genial")

Colocamos el cursor sobre el segundo paréntesis y pulsando C-x C-e en el minibuffer se nos mostrará el sublime mensaje.

Otro buffer tampoco asociado a ningún fichero es el Messages, podemos acceder a él pulsando C-x b y empezando a teclear su nombre. Cerramos la sesión con C-x C-c.

Y, ya para acabar con esta primera introducción y no saturar al personal, recordaré que en emacs todo son buffers. Cualquier consulta, debug, compilación, archivo o lo que sea crea un nuevo buffer lo cual, en alguna circunstancia, puede llegar a exasperar al más pintado por la enorme cantidad de buffers que aparecen abiertos. En las siguientes notas se iran mostrando más características de emacs.

2 Iniciando el archivo de configuración y moviéndonos con soltura

Instalamos un paquete que usaremos más adelante:

# apt-get install lorem

En Arch se llama lorem-ipsum-generator y en Ubuntu libtext-lorem-perl.

Hemos comprobado en la primera nota, que para usar emacs no es imprescindible un archivo de configuración, aunque tenerlo, no solo es muy útil sinó practicamente imprescindible: Permite tunear el "editor" a nuestro gusto y aumenta su potencia con nuevas extensiones. Empezamos dicho archivo:

$ emacs -nw .emacs

Copy/pasteamos:

;;; Sin mensaje de bienvenida:
(setq inhibit-startup-message t)
;
;;; No mostrar la barra del menú:
(menu-bar-mode -1)
;
;;; Reemplazar "yes" y "no" por "y" y "n"
(fset 'yes-or-no-p 'y-or-n-p)
;
;;; Mover a la papelera al borrar archivos y directorios:
(setq delete-by-moving-to-trash t
trash-directory "~/.local/share/Trash/files")
;
;;; guardar la sessión al cerrar emacs y restaurarla
;;; al arrancar-la de nuevo. Cero (0) para desactivar:
(desktop-save-mode 1)
;
;;; Para que se muestren todos los buffers abiertos al pulsar C-x b (ido):
(ido-mode 1)
;;; Ignorar determinados buffers.
(setq ido-ignore-buffers '("^ " "*Completions*" "*Shell Command Output*"
                           "*Messages*" "Async Shell Command" "*scratch*"
                           "*tramp*"))

Guardamos con C-x C-s. Para que los cambios tengan efecto podemos salir de emacs (C-x C-c) y volver a entrar o pulsar M-x eval-buffer (M-x y a continuación escribir "eval-buffer", sin las comillas). En emacs nos referimos a la tecla Alt como la tecla Meta ya que en los primeros teclados existía esta tecla. Yo continuaré con esta monenclatura por respeto a la tradición. Por tanto M-x significa pulsar "Alt" junto con la tecla "x"

Con estas primeras lineas de configuración y pulsando C-x b, nuestro emacs lucirá:

2-1.png

Los comentarios (Las lineas precedidas de punto y coma [;]) son suficientemente explicativos de lo que realiza el código (En realidad: un archivo elisp). Si se quiere acceder al contenido de la barra de menú, pulsando F10 se nos abre en un buffer su contenido y pulsando en este orden y respetando las mayúsculas: h t Sp accedemos al tutorial que mencionaba en laprimera nota. Con C-x o saltamos entre ventanas y con C-x 1 volvemos a pantalla simple. La extensión ido que forma parte del core de emacs, además de mostrar todos los buffers abiertos en la zona de eco, "esconde" los especificados. Siempre podemos acceder a ellos entrando su nombre después de pulsar C-x b (Recordando que la tecla TAB funciona como con una terminal)).

Si habéis practicado el tuto integrado en emacs que se mencionó en la primera nota ya no tendréis ningún secreto para moveros con soltura por un texto. Si no es el caso, lo más probable, aquí mostraremos algunas formas. Vaya por delante y so pena de ser acusado de herejía que podemos usar sin problemas las teclas específicas de los teclados modernos. Al menos en textos: mover el cursor con las flechas, subir/bajar páginas con RePág y AvPág e ir al inicio y al final de la linea con las teclas Inicio y Fin. Pero vale la pena dedicar algún tiempo con las teclas propias de emacs porque, aunque existen muchas, las más usuales tampoco son tantas. Además pueden ir incorporándose al repertorio a medida que se vayan precisando.

C-a (ir al comienzo de una línea)
C-e (ir al final de una línea)

C-f (un carácter hacia adelante)
C-b (un carácter hacia atrás)

M-f (una palabra hacia delante)
M-b (una palabra hacia atrás)

C-n (ir a la siguiente línea)
C-p (ir a la línea anterior)

C-v (Página siguiente)
M-v (Página anterior)

M-< (Ir al principio del texto)
M-> (Ir al final del texto)

C-l (Redibuja la pantalla. La primera vez que se pulsa, coloca la linea del cursor en el centro, la segunda arriba y la tercera abajo)

Practicaremos con un texto sin importancia, para prevenir catástrofes y de paso vemos una manera de mostrar la salida de un comando en un texto. C-x C-f y colocamos un nombre, por ejemplo pruebas.txt. Una vez abierto el buffer, pulsamos (Recuerda tabular para el comando como en una terminal y que en Debian y Ubuntu el comando es lorem):

C-u M-! lorem-ipsum-generator -p 20

2-2.png

Lo cual generará 20 párrafos del clásico texto. Podemos practicar los movimientos del cursor mencionados antes y además vamos a incoroporar dos nuevos: Uno simple (buscar texto) y otro que es un proceso (seleccionar texto, cortar o copiar y pegar en otra parte):

C-s (Buscar un palabra desde el cursor al final del texto. Cuando termine volverá al principio. Cada vez que pulsemos C-s saltará a la siguiente coincidencia)
C-barra espacio (Empieza la selección de texto)
C-e (o cualquiera de los atajos de movimiento del cursor. En este caso seleccionamos la linea)
C-n (seleccionamos varias lineas)
C-w (cortamos y desplazamos el cursor donde queramos)
C-y (pegamos)
M-w (Si lo que queremos es copiar el texto mencionado y no cortar)

Y esta nota la dejamos aquí para que se pueda confeccionar una chuletilla y practicar un poco para ir adquiriendo soltura, no sin antes mencionar

C-x C-s (guardar)
C-g (abortar algún atajo que se haya empezado a pulsar)
C-u (Deshacer el último cambio)

Recuerdar que con C-x C-c se sale de emacs, preguntando si guardar las modificaciones pendientes de los buffers y que cuando se vuelva a entrar se abrirán los mismos buffers que se tenian abiertos en la última sesión, gracias a la línea que hemos incorporado al archivo de configuración.

3 Dired, el navegador de archivos

Esta nota la dedicaremos al flamante navegador de archivos de emacs: dired. También veremos algunas extensiones que podemos incorporar a nuestro archivo de configuración .emacs para una mejor optimización del navegador. Dired, a palo seco, luce así:

3-1.png

Lo mejor es abrirlo invocándolo directamente (M-x dired) o con el atajo (C-x d) y probar los atajos, los más comunes, se muestran a continuación:

+ (Crear directorio)
e [enter] (Editar el archivo)
g (Después de una modificación actualiza la pantalla)
q (Regresa al listado)
d (Marca un archivo para su eliminación. Coloca una "D" en la 1ª columna)
u (Elimina la marca anterior)
x (Elimina los archivos marcados con una "D")
D (Eliminación inmediata)
C (Copiar)
4C (Copiar el archivo del cursor y los 4 siguientes)
R (Renombrar o mover)
Z (Comprimir/descomprimir [compress (.z .Z) y gzip (.gz)])
X (Entrar comandos de shell [chmod, grep, find, sort …])
S (Crear un enlace simbólico)
h (Muestra la ayuda y todos los atajos de teclado)
( (Muestra/esconde detalles de archivos y directorios)
& (Con el cursor sobre un archivo, permite entrar una aplicación para abrirla)

En general, para emacs, existe un montón de extensiones que hacen referencia a los temas más insospechados. Aquí sólo usaremos dos funciones muy útiles. Abrimos el archivo de configuración:

C-x C-f .emacs

Y copy/pasteamos:

;;; dired
(defun dired-dotfiles-toggle ()
 "Mostrar/esconder archivos ocultos"
 (interactive)
 (when (equal major-mode 'dired-mode)
   (if (or (not (boundp 'dired-dotfiles-show-p)) dired-dotfiles-show-p)
       (progn
         (set (make-local-variable 'dired-dotfiles-show-p) nil)
         (message "h")
         (dired-mark-files-regexp "^\\\.")
         (dired-do-kill-lines))
     (progn (revert-buffer)
            (set (make-local-variable 'dired-dotfiles-show-p) t)))))
;;; Atajo para esconder/mostrar archivos ocultos clicando C-c w:
(global-set-key (kbd "C-c w") 'dired-dotfiles-toggle)
;
;
;;; dired
(defun external-app ()
 "Abrir archivo con apps externas."
 (interactive)
 (let* ((file (dired-get-filename nil t)))
   (call-process "xdg-open" nil 0 nil file)))
;;; Atajo para abrir archivos con apps externas clicando F8.
(global-set-key (kbd "<f8>") 'external-app)

Como podemos observar en la descripción entrecomillada de la linea siguiente al nombre de la función (defun) la primera muestra/esconde archivos ocultos y su atajo es C-c w y la segunda permite abrir archivos sobre los que está situado el cursor con aplicaciones externas y el atajo es la tecla F8. Recordar que para que estas funciones sean operativas en emacs, después de guardar el archivo (C-x C-s) ha de salirse y volver a entrar en emacs o “recargar” el buffer (M-x eval-buffer). Podemos practicar si verdaderamente podemos abrir toda clase de archivos con la función external-app. Si alguna extensión no nos la “pilla” recordar que el & permite entrar una aplicación concreta.

Aprovechamos que tenemos el archivo de configuración .emacs abierto para añadir algunas lineas a

;;; Eliminar espacios en blanco al final de la linea y al final del texto
;;; de forma automática al guardar el archivo:
(add-hook 'before-save-hook 'delete-trailing-whitespace)
(add-hook 'write-file-hooks 'delete-trailing-whitespace nil t)
;
;;; Añadir un espacio entre el número de linea y el texto de la linea
;;; al lanzar M-x linum-mode (ver números de linea)
(setq linum-format "%d ")

Si quisiéramos en vez de un espacio 3 pondríamos "%3d "

4 Ayudas y colorines

Cuando se dice que emacs es auto documentado significa literalmente eso, que es auto documentado, o sea que provee de toda la ayuda que podamos precisar. Naturalmente en inglés.

El prefijo para todas las ayudas es C-h. Algunos de los más útiles:

C-h k –> Muestra información sobre un atajo (C-c w)

4-1.png

C-h a –> Todas las opciones de un comando (dired)

4-2.png

C-h b –> Ver todos los atajos

C-h w –> Muestra el atajo de la función que entremos

4-3.png

C-h f –> (Información sobre una función)

4-4.png

C-h C RET –> Muestra información sobre las codificaciones. RET (RETURN)es la forma de mencionar la tecla intro en emacs.

C-h v –> Muestra información sobre variables (menu-bar-mode)

4-5.png

C-h C-h –> Muestra ayuda de la ayuda

4-6.png

C-h e –> Muestra los mensajes de log

4-7.png

Podemos acceder a un completo manual de emacs con:

M-x info-emacs-manual

Y también podemos emplear:

M-x apropos RET

Y entrar una palabra sobre la que queremos detalles (por ejemplo “save”). Apropos funciona como C-h a, pero además busca opciones de usuario y otras variables.

Para el tema de los colores tendremos que descargar una extensión con la que daremos inicio al directorio de extensiones de emacs. Vale cualquier nombre, yo lo tengo en .emac.d/lisp. Puede que el directorio .emacs.d ya se te haya creado en el sistema, verifícalo y si no es el caso, lo creas:

$ mkdir -p .emacs.d/lisp
$ wget http://download.gna.org/color-theme/color-theme-6.6.0.zip
$ unzip color-theme-6.6.0.zip
$ mv color-theme-6.6.0 .emacs.d/lisp

Y en nuestro archivo de configuración .emacs añadiremos las lineas:

;;; Tema de colores:
(add-to-list 'load-path (expand-file-name "~/.emacs.d/lisp/color-theme-6.6.0"))
(require 'color-theme)
(color-theme-initialize)

La última linea es una función que carga las librerías de gestión de temas. Recargamos la configuración con M-x eval-buffer o cerrando emacs con C-x C-c y volver a abrirlo con:

$ emacs -nw

Y abrimos el listado de colores disponibles (Recuerda que la tecla TAB autocompleta como en bash):

M-x color-theme-select

Mostrará en un nuevo buffer una lista de temas disponibles. Con las flechas nos desplazamos por la lista (si lo hacemos con C-n para bajar y C-p para subir por el listado, mucho mejor) que podrán probarse seleccionándolos con “intro” o la tecla “i”. Para volver al tema de color por defecto, clicar sobre la primera linea del listado [Reset]. Una vez escogido el tema, pulsando la letra d, muestra la linea que ha de entrarse en .emacs.

4-8.png

Supongamos que escogemos Charcoal Black, añadiremos la linea (color-theme-charcoal-black) quedando toda la entrada para el tema color así:

;;; Tema de colores:
(add-to-list 'load-path (expand-file-name "~/.emioacs.d/lisp/color-theme-6.6.0"))
(require 'color-theme)
(color-theme-initialize)
(color-theme-charcoal-black)

Resuelto el tema del color, y ya puestos, añadimos nuevas lineas al archivo de configuración .emacs para que nos muestre fecha y hora en formato 24 horas en la linea de modo y que el calendario esté en español (por defecto está en inglés):

;;; Mostrar fecha y hora en formato 24 horas:
(setq display-time-day-and-date t
display-time-24hr-format t)
(display-time)
;
;;; Poner en castellano el calendario y que empiece en lunes:
(setq calendar-week-start-day 1
calendar-day-name-array ["Lu" "Ma" "Mi" "Ju" "Vi" "Sa" "Do"]
calendar-month-name-array ["Enero" "Febrero" "Marzo" "Abril" "Mayo" "Junio" "Julio" "Agosto"
                           "Setiembre" "Octubre" "Noviembre" "Diciembre"])

Después de reiniciar emacs, Veremos el resultado pulsando M-x calendar

4-9.png

Recuerda que se vuelve a pantalla completa con C-x 1 y se salta entre ventanas con C-x o.

5 Sobre urls, sudo y música con emms

Abrimos una cerveza y nuestro flamante emacs (emacs -nw) y empezamos por añadir otra función a nuestro archivo de configuración:

C-x C-f .emacs

Copy/pasteamos:

;;; Urls y firefox
(defun open-url ()
 "Poner el cursor sobre una URL de un texto y abrirla en firefox"
  (interactive)
  (let (url)
  (if (string= major-mode "w3m-mode")
      (setq url (or (w3m-anchor) (w3m-image)
       w3m-current-url)))
      (browse-url-firefox (if url url (car
      (browse-url-interactive-arg
      "URL: "))))
      ))
 ;;; atajo para la función open-url con C-c b
 (global-set-key (kbd "C-c b") 'open-url)

Recargamos la configuración (M-x eval-buffer) y probamos la función con algún texto que tengamos a mano y que tenga alguna url. Si no disponemos de ninguno, podemos crear o abrir si no lo hemos borrado el archivo pruebas.txt:

C-x C-f pruebas.txt

Y copy/pasteamos el siguiente texto:

El buscador duckduckgo.com es un orgasmo de buscador y la imagen que andas buscando está en https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Emacs-logo.svg/2000px-Emacs-logo.svg.png

Colocamos el cursor sobre duckduckgo.com y pulsamos la combinación de teclas C-c b. En el minibuffer mostrará la url y pulsamos intro. Tendría que abrirse una pestaña en firefox con la página marcada o, en caso de estar el navegador cerrado, abrirse con la mencionada página. Podemos probar con la otra url del texto.

Obviamente, si nuestro navegador favorito no es firefox, modificamos, en la función open-url, la línea (browse-url-firefox … por cualquiera de la opciones disponibles pulsando M-x browse TAB TAB (browse-url-chromium, browse-url-galeon…)

5-1.png

Si estamos en remoto o somos muy frikis y siempre que lo tengamos instalado en el sistema (w3m.el), podemos navegar con w3m (M-x w3m) o con el recientemente incorporado eww (M-x eww)

Veremos ahora como abrir un archivo con privilegios de administrador (sudo o su). La extensión que realiza la proeza en TRAM que forma parte del core de emacs. Como ya viene siendo habitual, abrimos el archivo de configuración .emacs y añadimos la siguiente función:

;;; sudo
(defun sudo-open-file (file)
  "Abrir archivo com privilegios de root"
  (interactive "FFind file: ")
  (set-buffer
  (find-file
  (concat "/sudo::"
  (expand-file-name file)))))
;;; atajo para la función sudo-open-file con C-c s
(global-set-key (kbd "C-c s") 'sudo-open-file)

Guardamos (C-x C-s), cargamos la nueva configuración con el clásico M-x eval-buffer o reiniciando emacs (C-x C-c) y pulsamos el atajo que hemos especificado para sudo-open-file: C-c s. En el minibuffer nos saldrá:

Find file: ~/

Hemos de borrar el "gusanillo" que indica el directorio personal [~] y completar con el archivo que queremos abrir, por ejemplo, /etc/sudoers. Como es lógico pedirá la contraseña y abrirá el fichero especificado.

Veamos ahora como escuchar música mientras trabajamos con el editor de los dioses. En primer lugar instalar emms de los repositorios (apt-get, pacman …) y luego:

$ wget http://ftp.gnu.org/gnu/emms/emms-4.0.tar.gz
$ tar -zxf emms-4.0.tar.gz
$ mv emms-4.0 .emacs.d/lisp

Editar el archivo de configuración .emacs como ya hemos mencionado varias veces y añadir las siguientes lineas:

;;; emms
(add-to-list 'load-path "~/.emacs.d/lisp/emms-4.0/")
(require 'emms-setup)
(emms-standard)
(emms-default-players)

Recargar la configuración (M-x eval-buffer) y con M-x emms TAB TAB nos aparecerán en una ventana las opciones disponibles:

5-2.png

Con la tecla TAB se mostrarán más. Para probar si funciona el invento podemos pulsar:

M-x emms-play-file

Y entrar la ruta a un archivo mp3 del disco duro. Para cerrar el reproductor M-x emms-stop. Como podemos ver, existen muchas opciones e incluso atajos propios, como en dired. Si tenemos un directorio con toda nuestra música favorita, podemos especificarlo en el archivo de configuración .emacs añadiendo a las lineas mencionadas arriba:

(setq emms-source-file-default-directory "~/Musica/")

De esta forma accederemos a este directorio simplemente pulsando M-x emms

Si nos inclinamos por urls de música y tenemos un archivo tipo:

$ cat urls_musica.txt
http://uplink.duplexfx.com:8062/
http://jay.krivanek.org:8000/xrm.ogg
http://s6.viastreaming.net:7010
http://streaming.radionomy.com:8000/City-Dance-Radio
http://uplink.duplexfx.com:8044
http://85.25.86.69:8000/
http://91.121.38.216:8018/
http://eilo.org:8000/happycore
http://broadcast.rantradio.com:9000
http://s5.voscast.com:7346/
http://radio.hazzardofdarkness.com:6666/
http://66.55.148.27:10054
http://80.94.69.106:6814/
http://streaming1.digitalwebs.com.ar:8920/
http://sc4.spacialnet.com:26368/
http://italia.lolliradio.net:8010/
http://listen.radionomy.com/lonestar-radio
http://listen.radionomy.com/walesfm
http://streaming206.radionomy.com:80/A11-Radio-Dreams-90s
http://jen.frequence3.net:80/m290-128.mp3
http://jen.frequence3.net:80/m2chillout-128.mp3
http://audio1.ipercast.net:8000/deluxemusic.tv/lounge_web/mp3
http://stream-204.shoutcast.com:80/classical_skyfm_mp3_96kbps
http://radio2.sikhnet.com:8501/autodj
http://streaming204.radionomy.com:80/Con-Alma-de-Blues
http://stream.punkrockers-radio.de:8000/prr.ogg
http://streaming203.radionomy.com:80/AMBIENT-AND-LOUNGE

Y lanzamos:

M-x emms-play-m3u-playlist

Y colocamos la ruta al archivo, empezará a sonar la primera emisora del listado. Con M-x emms accederemos al listado y podremos seleccionar otra emisora.

5-3.png

6 Gestor de extensiones y otros ajustes

Existe un paquete que gestiona repositorios de extensiones con cierta similitud con los clásicos gestores de paquetes de las distros linux (pacman, apt, …), es la extensión “package” incluido en emacs a partir de la versión 24. El repositorio por defecto es Emacs Lisp Package Archive, elpa para los amigos (http://elpa.gnu.org/packages/) y cuyos paquetes están certificados por la Free Software Foundation pero nosotros añadiremos los repos de Marmalade, Melpa y org. Editamos el archivo de configuración .emacs y copi/pasteamos las lineas:

;;; package
 (setq package-archives '(("gnu" . "http://elpa.gnu.org/packages/")
                          ("marmalade" . "https://marmalade-repo.org/packages/")
                          ;("melpa-stable" . "https://stable.melpa.org/packages/")
                          ("org" . "http://orgmode.org/elpa/")
                          ("melpa" . "http://melpa.milkbox.net/packages/")))

He puesto el repo de melpa-stable comentado por si alguien gusta más de él lo descomenta y comenta el otro melpa sin olvidarse de cerrar los parentesis en la linea anterior. C-x C-s para guardar, M-x eval-buffer para recargar la configuración. Para lanzarlo:

M-x package-list-packages

6-1.png

Viene a ser como un update. Veamos como instalar paquetes, por ejemplo, chess para jugar al ajedrez.

C-s chess

El cursor se posicionará sobre dicho paquete. Si hubieran varios con la misma palabra en el nombre, pulsando C-s sucesivamente iríamos saltando de uno en uno. En la linea del paquete chess nos informa de la versión, la indicación de “disponible” (available) y una pequeña descripción de la maravilla. Posicionamos el cursor al principio de la linea y al pulsar la letra “i” (install) nos marca el paquete para instalar. Podríamos ir marcando paquetes del mismo modo pero como muestra ya nos vale. A continuación pulsamos la letra “x” y en el minibuffer nos preguntará: Install package `chess'? (y or n). Pulsamos “y” e iniciará el proceso de compilación generando, como es normal, un buffer con el log del proceso (Compile-log) que quitamos de la pantalla con C-x 1 y con C-x b vemos que lo tenemos ahí. Con C-g anulamos lo del minibuffer.

6-2.png

Verificamos que tengamos el paquete disponible con:

M-x chess

Con C-x o vamos a la ventana del tablero y con C-x 1 la maximizamos:

6-3.png

Si queréis probar qué tal se os da; mueven blancas (Las mayúsculas), colocar el cursor sobre la figura que vamos a mover y pulsar “intro”, desplazar el cursor a la casilla donde la colocaremos y volver a pulsar “intro”. Jugamos contra la máquina. Suerte.

Para desinstalar chess, volvemos al listado y

C-x s chess

Ahora el paquete lo tendremos al final del listado de “disponibles” y nos lo marcará como “installed”. Colocamos el cursor al inicio de la linea y al pulsar “d” (delete) lo marcará para borrar y al pulsar “x” lo eliminará de emacs.

Algunas teclas útiles cuando se está en package:

enter (muestra una descripción del paquete)
u (Desmarcar)
r (Resfrescar el listado)

Con C-x k vamos matando buffers que no nos interesan. También podemos visualizarlos todos en una ventana con:

C-x C-b

Nos movemos al listado con C-x o y marcamos con una “d” (igual que en package) los que queremos “matar”. Cuando los tengamos todos marcados, pulsando “x” se ejecutará la acción.

6-4.png

Naturalmente el paquete color-theme de la 4ª nota está en los repos. Allí se mostró como instalar por el “sistema antiguo” y en este pedazo por el “moderno”.

Y ya que hemos mencionado el buscar palabras en un texto (C-s), mencionar otra forma más “curiosa” de buscarlas.

M-x occur

Abrirá una nueva ventana mostrando todas las lineas que contenga la coincidencia y resaltándola. Si nos desplazamos a esta ventana (C-x o) y posicionamos el cursor sobre alguna de ellas y pulsamos intro, nos desplazaremos a esta linea del texto.

6-5.png

No podemos terminar esta nota sin añadir algunas lineas nuevas a nuestro archivo de configuración .emacs. Lo editamos y copi/pasteamos las siguientes lineas:

;;; Iluminar los paréntesis y las llaves por parejas para evitar olvidos:
(show-paren-mode 1)
;;; No hacer copias de seguredad ni crear archivos #auto-save#
(setq make-backup-files nil)
(setq auto-save-default nil)
;;; Si quisiéramos copias de seguridad cada 2 minutos:
;(setq auto-save-timeout 120)
;;; Si quisiéramos copias de seguridad cada 20 modificaciones:
;(setq auto-save-interval 20)

Naturalmente comentar y descomentar la opción que interese. Otra linea útil en el archivo de configuración .emacs es:

;;; Insensible a mayúsculas y minúsculas en las busquedas:
(setq case-fold-search nil)

Que siempre nos puede venir bien.

7 Alias, lanzadores y alguna minucia

Crear atajos con emacs es tan simple como indicar las letras o números del atajo y la función a la que hacen referencia. Supongamos que tenemos un archivo con urls de música tipo:

$ cat urls_musica
http://uplink.duplexfx.com:8062/
http://s6.viastreaming.net:7010
http://streaming.radionomy.com:8000/City-Dance-Radio
http://uplink.duplexfx.com:8044
http://85.25.86.69:8000/
http://91.121.38.216:8018/
http://eilo.org:8000/happycore
http://broadcast.rantradio.com:9000
http://s5.voscast.com:7346/
http://italia.lolliradio.net:8010/
http://listen.radionomy.com/lonestar-radio
http://listen.radionomy.com/walesfm
http://streaming206.radionomy.com:80/A11-Radio-Dreams-90s
http://jen.frequence3.net:80/m290-128.mp3
http://jen.frequence3.net:80/m2chillout-128.mp3

Para escucharlas con emms hemos de pulsar:

M-x emms-play-m3u-playlist

Y entrar la ruta al archivo. Naturalmente podemos usar el tabulador para simplificar pero también podemos crear un alias o un lanzador. Para un alias, añadir a nuestro archivo de configuración .emacs las siguientes lineas:

;;; alias para emms-play-m3u-playlist (M-x m3):
(defalias 'm3 'emms-play-m3u-playlist)

Y para un lanzador:

;;; Atajo para emms-play-m3u-playlist (C-c p):
(global-set-key (kbd "C-c p") 'emms-play-m3u-playlist)

Recargamos la configuración (M-x eval-buffer) y probamos el invento (M-x m3 RET urls_musica o C-c p urls_musica). Empezará a sonar la primera url de la lista. Si está caída salta a la siguiente. Si pulsamos M-x emms accederemos al listado para seleccionar otra url.

7-1.png

Recordamos que con C-x b y C-s podemos saltar por los buffers, con C-g anulamos cualquier acción que hayamos iniciado, con C-x k cerramos el buffer activo. M-x emms-stop parará la reproducción. Si estamos en el buffer del listado, podremos parar la reproducción pulsando la letra "s".

Exhorto al lector a crear un alias y un lanzador de la función "eval-buffer" que lanzamos tan a menudo.

Si lo que queremos es acceder a un archivo o un directorio al que nos desplazamos mucho de forma rápida, existen varias formas de hacerlo. Veremos algunas.

Añadir al archivo de configuración .emacs las lineas:

;;; Abrir mi .bashrc con una función (M-x bashrc):
(defun bashrc ()
  "Abrir `~/.bashrc'."
  (interactive)
  (find-file "~/.bashrc"))

Dejo a la inventiva del lector crear un atajo para dicha función.

Ahora incorporaremos, a nuestro archivo de configuración, una función que nos mostrará en el minibuffer los archivos o directorios que le especifiquemos en la variable "lista". Copy/pasteamos las siguientes lineas en .emacs:

;;; Abrir archivos o directorios de forma rápida. Primero la variable:
(defvar lista nil
"Lista de archivos o directorios a los que accedemos a menudo (modificar rutas con los de cada cual))"
(setq lista
     '(
       ("Images" . "~/Images")
       ("backups" . "~/backups/")
       ("downloads" . "~/Vídeos/torrents/downloads/")
       ("bashrc" . "~/.bashrc")
       ;; Más archivos o directorios ...
       ))
;;; Ahora la función:
(defun abrir-lista (openCode)
  "Función para abrir el archivo o directorio predefinido en la variable lista"
  (interactive
   (list (ido-completing-read "Open:" (mapcar (lambda (x) (car x))
      lista))))
  (find-file (cdr (assoc openCode lista))))
;;; El atajo para esta función es C-c x
(global-set-key (kbd "C-c x") 'abrir-lista)

Ya que tenemos abierto el archivo de configuración aprovechamos para incorporar una nueva línea, si somos usuarios de un portátil: que nos muestre el nivel de carga de la batería en el minibuffer:

;;; Activar el indicador de bateria(si estamos en un portatil):
(display-battery-mode 1)

Una vez guardado (C-x C-s) y releída la nueva configuración (el ya famoso M-x eval-buffer o el atajo que hayáis creado), pulsando C-c x veremos en la zona de eco los archivos y directorios que hemos especificado en la variable y empezando a teclear las primeras letras de alguno de ellos o saltando por los mostrados con C-s y pulsar "intro" sobre el deseado, se mostrará en la ventana.

7-2.png

Como vemos en el pantallazo, mi batería anda por el 79%. Cerramos (C-x C-c) y a dormir.

8 Acceder a la shell: eshell y ansi-term

Para acceder a la shell del sistema podemos enviar la sesión emacs a segundo plano con C-z, lanzar los comandos que deseemos y volver a la sesión emacs con fg RET. Pero existen otras formas de invocar a la shell. La propia de emacs es M-x eshell que está enteramente escrita en elisp así como los comandos que ejecuta y que emulan los contenidos en el paquete coreutils disponible en cualquier distro. Eshell es capaz de invocar casi cualquier función elisp cargada en Emacs pero ha de tenerse en cuenta que no es un emulador de terminal.

8-1.png

M-x eshell

Buscar un archivo a partir de una función elisp:

$ find-file archivo.txt

Permite crear alias de una forma muy simple. Por ejemplo para abrir dired:

$ alias d 'dired $1'

Luego sólo tenemos que poner la letra "d" y pulsar intro para que nos abra nuestro $HOME. Para eliminar el alias:

$ alias d RET

Eshell funciona muy mal con comandos interactivos ya que son demasiado complejos para ser mostrados directamente y requieren un manejo especial. Un ejemplo podría ser el comando htop. Para que nos funcione correctamente con eshell, entre otras opciones, añadimos al archivo de configuración .emacs las lineas:

;;; Activar comandos visuales en eshell:
(defcustom eshell-visual-commands
"Comandos a los que activar visual-commands"
  '("htop"))
(add-to-list 'eshell-visual-commands "htop")

Otras características de eshell es que podemos desplazar el cursor por la consola como si fuera un archivo de texto (C-p para subir, C-n para bajar y C-f y C-b desplazamiento lateral) y seleccionar, por ejemplo una MAC para copiarla (C-espacio C-e M-w) y pegarla en otro buffer (C-y), acceder al histórico de comandos con M-p y M-n y direccionar un comando a un buffer:

$ cat archivo.txt >> #<buffer *scratch*>.

8-2.png

Para modificar el prompt y el mensaje de bienvenida de la eshell añadimos al archivo de configuración .emacs las lineas:

;;; Ajustar el prompt de eshell
;;; Para mostrar el usuario: (concat (getenv "USER")
;;; Para mostrar el directorio actual: (concat (eshell/pwd)
(setq eshell-prompt-function
  (lambda nil
   (concat (eshell/pwd)
    (if (= (user-uid) 0) " # " " $ "))))
;;; Especificar ruta a la shell que vamos a usar:
(setq explicit-shell-file-name "/bin/bash")
;;; mensaje de bienvenida al entrar a la eshell:
(setq eshell-banner-message "\n... entrando en emacs shell...\n\n")

No olvidemos recargar la configuración.

8-3.png

Si no nos gusta el nombre (eshell) lo podemos modificar con:

M-x rename-buffer

Dejamos eshell y mencionamos otra terminal, más parecida a la clásica terminal de linux. Se trata de ansi-ter+m, también escrita en emacs lips y que para estar plenamente funcional no precisa de más ajustes. Si lanzamos M-x ansi-term nos preguntará en el minibuffer por la shell a usar. Para que la abra directamente con bash y pulsando F5, podemos añadir las siguientes lineas al archivo de configuración .emacs:

;; Entrar terminal ansi-term al pulsar F5 y con la shell bash:
global-set-key (kbd "<f5>") '(lambda ()(interactive)(ansi-term "/bin/bash")))

Obviamente si nuestra shell favorita es zsh, ash, csh, ksh, tcsh o la que sea, la modificaremos en la linea.

8-4.png

Sólo comentar que ansi-term tiene como prefijo C-x o sea que para renombrar el buffer:

C-x M-x rename-buffer

Lo dejamos aquí. En el próximo pedazo veremos el corrector ortográfico y wget.

9 Corrector ortográfico y wget

Los paquetes necesarios en el sistema son aspell-es y dictionary.el (apt-get). He puesto un pequeño texto para las pruebas, pero si tenéis uno que, al menos, esté a la misma altura literaria que el mostrado podéis usarlo en su lugar.

$ cat corrector.txt
"Las bentanas del quarto davan a un uerto mui umedo."

Lo abrimos con emacs (C-x C-f) y activamos el corrector:

M-x ispell

aspell comenzará a buscar palabra por palabra y, en caso de que encuentre algún error, la coloreará y en la parte superior mostrará las opciones de substitución. Sólo tendremos que pulsar el número, letra o carácter para realizar el cambio.

9-1.png

Vamos a continuar el texto por lo que activamos la corrección interactiva con:

M-x flyspell-mode

Los errores se resaltarán conforme se vaya escribiendo. Este modo no analiza el texto escrito antes a menos que el cursor pase por encima. Escribimos:

"Sus hojos no podian degar de mirar tanta velleza."

9-2.png

Para ver las opciones de substitución, posicionamos el cursor sobre la palabra errónea y pulsamos:

M-$

En esta situación, podemos usar varias opciones. Algunas son:

ESP (Saltar la palabra)
r (modificar personalmente)
a (Aceptar la palabra incorrecta)
i (incorporar la palabra al diccionario personal)
C-g (Salir de corrección. Con C-u M-$ vuelve a corrector)
q (Salir de corrector)
C-l (Actualizar pantalla)

Para modificar el diccionario:

M-x ispell-change-dictionary

Para el idioma español se utiliza el diccionario castellano (Acuérdate que puedes escribir las primeras letras y usar el tabulador), el diccionario castellano8 leí en cierta ocasión que podía dar problemas con las palabras acentuadas usando codificación utf-8, latin-1 o similar. Desconozco si esto esta resuelto. Podemos añadir a nuestro archivo de configuración .emacs una linea que cuando abramos un txt automáticamente se active el corrector o crear un atajo para activarlo/desactivarlo nosotros a voluntad. He comentado la primera opción para que cada cual opte por alguna de las dos soluciones:

;;; Activar corrector automáticamente al abrir un texto:
;(dolist (hook '(text-mode-hook))
;      (add-hook hook (lambda () (flyspell-mode 1))))
;
;;; Activar/desactivar automáticamente corrector con C-c c:
(global-set-key (kbd "C-c c") 'flyspell-mode)

Si estás programando puedes activar:

M-x flyspell-prog-mode

Con esta línea se comprobará la ortografía de los comentarios pero no de las palabras reservadas del lenguaje ni de los nombres de variables.

Con emacs también podemos usar wget. Instalamos la extensión con package tal como se indica en la nota 6ª y la lanzamos:

M-x wget

Preguntará la url a descargar, la colocamos y pulsamos intro.

9-3.png

La primera vez que usemos wget, preguntará si queremos crear el directorio ~/download:

9-4.png

y será en este directorio donde encontraremos la descarga:

9-5.png

Y con wget terminamos esta nota.

10 Sobre historiales, logs y marcas

Como en el manejo de todo sistema basado en programario libre, saber lo que ocurre en la sesión es importante, y, como es lógico, emacs nos brinda las herramientas necesarias. La primera que veremos en command-history que mantiene un histórico de los comandos complejos. Un comando complejo es el que lee un argumento interactivo desde el minibuffer (M-x …, M-…)

M-x command-history

Si no solo queremos el historial de comandos sino también los buffers cerrados podemos añadir al archivo de configuración .emacs las líneas:

;;; Reabrir algún buffer cerrado anteriormente
;;; El atajo de teclado es C-c 2
(require 'recentf)
(recentf-mode 1)
(setq recentf-max-saved-items 200)
(setq recentf-max-menu-items 35)
;; prevenir la limpieza periódica de archivos remotos:
(setq recentf-auto-cleanup 'never)
;;; Reabrir alguno de los buffer cerrados:
(global-set-key (kbd "C-c 2") 'recentf-open-files)

10-1.png

Con solo posicionar el cursor sobre alguno del listado y pulsar intro, se nos abrirá de nuevo. Cerramos la ventana pulsando "q".

Podemos acceder a un más completo historial sobre todo lo que ocurre en la sesión, activando el modo savehist añadiendo las siguientes líneas a .emacs:

;;; Guardar un completo historial de todo lo que ocurre en la sesión:
(setq savehist-file "~/.emacs.d/savehist")
(savehist-mode 1)
(setq history-length t)
(setq history-delete-duplicates t)
(setq savehist-save-minibuffer-history 1)
(setq savehist-additional-variables
     '(kill-ring
       search-ring
       regexp-search-ring))

Lo consultamos en la ruta especificada en savehist-file. También podemos colocar un acceso rápido a dicho archivo como habíamos mencionado en la 7ª nota para .bashrc. Esto lo dejo para el lector.

10-2.png

En eshell podemos usar, como en la shell bash, las flechas para acceder a comandos lanzados con anterioridad. Lo propio en emacs es usar M-p para subir en el listado y M-n para bajar y con C-c C-l se abre una ventana con todo el listado.

10-3.png

También recordar, como mencionábamos en la 4ª nota, que con C-h e accedemos a un listado de logs de la sesión.

Hablemos un poco de las marcas. Para acceder a un punto concreto de un archivo, emacs pone a nuestra disposición las marcas. Creamos un archivo largo y lo guardamos:

C-u C-! lorem -p 200
C-x C-s

Avanzamos un par o tres de páginas:

C-u 3 C-v

Nota.- C-u significa repetir las veces que se indique (3) el comando que viene a continuación (C-v)

Colocamos al inicio de una línea unas cuantas “x” para comprobar si funciona y pulsamos la combinación:

C-x r m

Colocamos un nombre para la marca, por ejemplo “marca”. Guardamos y cerramos el buffer (C-x k). A continuación pulsamos:

C-x r b

Ponemos el nombre que le hemos dado a la marca que buscamos, “marca” en este caso. Se abrirá el buffer cerrado con el cursor en la línea que habíamos marcado. Para ver todas las marcas que tenemos registradas pulsamos C-x r l

10-4.png

Para eliminar una marca:

M-x bookmark-delete

Y dejamos las marcas…

11 bloc de notas, scritps y previsión de lluvias

En esta nota trataremos de más extensiones que nos pueden ser de gran utilidad, por ejemplo, disponer de un bloc de notas:

M-x remember

Se abrirá una ventana en la que escribimos o copiamos lo que no queremos olvidar y pulsando C-c C-c añadimos hora y fecha. Se guarda en ~/.notes o en ~/.emacs.d/notes (a partir de la versión 24). Accedemos al contenido como con un archivo normal de texto (C-x C-f)

Veamos ahora como se comporta emacs con los scripts de bash (En realidad, con cualquier script). La forma más elemental consiste en añadir las siguientes lineas al archivo de configuración .emacs para que nos permita ejecutarlo con C-c e:

;;; Dar permisos de execución al fichero si és un script
;;; y poderlo ejecutar con C-c e
(add-hook 'after-save-hook
  'executable-make-buffer-file-executable-if-script-p)
(global-set-key (kbd "C-c e") 'executable-interpret)

Creamos un script:

C-x C-f script.sh

11-1.png

Emacs activa el modo shell. Copy/pasteamos el siguiente contenido (naturalmente vale el que sea):

#!/bin/bash
echo
echo “emacs es genial”
echo

C-x C-s para guardar y probamos el atajo C-c e:

11-2.png

11-3.png

Si comprobamos los permisos, vemos que se han modificado de 664 a 775:

11-4.png

Como podemos observar en la salida, nos da más información de la necesaria. Si sólo queremos que nos muestre la salida “pelada” del script, podemos instalar quickrun (M-x package-install RET quickrun) y una vez instalado, añadir a .emacs la linea:

(global-set-key (kbd "C-c r") 'quickrun)

Reiniciamos emacs o recargamos el buffer y sobre el script.sh pulsamos C-c r. El resultado es más limpio:

11-5.png

Con emacs también podemos estar informados del tiempo en nuestra ciudad. Existen, como es habitual, varias funciones que nos pueden ayudar en este tema, nosotros usamos weather-metno. La podéis instalar con package tal como se indica más arriba con quickrun y añadir al archivo de configuración .emacs las lineas:

;;; Para conocer el tiempo en nuestra ciudad,
;;; en este caso Figueres (España).
(require 'weather-metno)
(setq weather-metno-location-name "Figueres, Spain"
     weather-metno-location-latitude 42.27
     weather-metno-location-longitude 2.96)

Naturalmente cambiar la ciudad y las coordenadas geográficas por las de la vuestra. Podéis consultar http://www.mundivideo.com/coordenadas.htm

11-6.png

Después de introducir ciudad y nación, anotáis las coordenadas en grados decimales. No es necesario poner toda la ristra de número, con un par de decimales es suficiente. Recargamos la configuración (M-x eval-buffer) o reiniciamos y lanzamos:

M-x weather-metno-forecast

11-7.png

Y, ya para acabar con esta nota y en el caso que tengamos parientes o amigos en lugares lejanos y queremos saber si es tarde para llamarles, podemos añadir a .emacs las lineas:

;;; Para conocer dia y hora actual en distintos puntos del globo.
;;; M-x display-time-world
(setq display-time-world-list '(("Europe/Oslo" "Oslo")
                                ("America/Buenos_Aires" "Buenos Aires")
                                ("America/New_York" "New York")
                                ("America/Bogota" "Bogotá")
                                ("Asia/Tokyo" "Tokyo")
                                ("Australia/Melbourne" "Melbourne")))

Con M-x display-time-world estaremos perfectamente informados:

11-9.png

12 Algunas cosas sobre tablas

Con emacs también podemos confeccionar tablas:

M-x table-insert

Preguntará por el número de columnas (3), número de filas (9), ancho de la celda (15) y altura de la celda (1). El resultado con los parámetros que hemos puesto entre paréntesis y algunos datos es:

12-1.png

Podremos movernos por las celdas con la tecla TAB

Para resaltar las tablas:

M-x table-recognize

12-2.png

Y para que se muestren como texto:

M-x table-unrecognize

12-3.png

Si tenemos datos y queremos colocarlos en una tabla, primero seleccionar los datos (C-a C-espacio C-e C-n):

1,Pacífico,165.721
2,Atlántico,81.660
3,Índico,73.442
4,Ártico,14.351
5,Mediterráneo,2.966

Una vez seleccionados:

M-x table-capture

Preguntará por el delimitador de la columna (Column delimiter regexp:), pulsamos la tecla coma (,), el delimitador de las lineas (Row delimiter regexp:) pulsamos, para nueva línea, C-q C-j RET, si queremos los datos justificados a derecha, centro o izquierda (Justify (default left):), ponemos "center" y el ancho mínimo de la celda (Minimum cell width (default 1)) ponemos 3. El resultado:

12-4.png

Si quisiéramos insertar un nuevo dato, colocamos el cursor al principio de la línea, justo debajo de la tabla y pulsamos:

M-x table-insert-row

12-5.png

Y llenamos con los nuevos datos (Lo mismo para nueva columna [M-x table-insert-column]). Si quisiéramos borrar una línea, colocamos el cursor en cualquier punto de la misma y:

M-x table-delete-row

Para enmarcar un texto:

M-x table-capture

Y dejando en blanco los delimitadores (Column delimiter regexp y Row delimiter regexp):

12-6.png

Tambien podemos generar el código html de una tabla, colocando el curso en su interior y pulsando:

M-x table-generate-source

12-7.png

Después de colocar el cursor en la ventana del html (C-x o) guardamos con C-x C-w table.html y visualizamos el archivo con el navegador:

12-8.png

Ver más opciones con:

M-x table TAB TAB

13 htmls y pdfs con markdown

Markdown es un lenguaje de marcado ligero que emplea texto plano, procurando que sea legible pero consiguiendo que se convierta en XHTML correctamente formateado y sin usar ningún tipo de editor visual. Naturalmente no vamos a tratar sobre markdown sino como emacs puede echarnos un cable para simplificarnos todavía más nuestra experiencia con este lenguaje. Primero instalamos el paquete en el sistema (apt-get install markdown). Luego instalamos la extensión de emacs con package:

M-x package-install RET markdown-mode

Y para que al abrir un archivo markdown se active el modo, añadimos a nuestro archivo de configuración .emacs las líneas:

;;; Modo markdown
(add-to-list 'load-path "~/.emacs.d/elpa/markdown-mode-2.0")
(autoload 'markdown-mode "markdown-mode" t)
(add-to-list 'auto-mode-alist '("\\.markdown\\'" . markdown-mode))
(add-to-list 'auto-mode-alist '("\\.md\\'" . markdown-mode))

Reiniciamos o recargamos el buffer (M-x eval-buffer) y creamos un archivo md:

C-x C-f texto.md

Comprobamos que en la línea de modo se haya activado markdown y Copy/pasteamos las siguientes líneas (La primera es para que nos muestre correctamente acentos y eñes):

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
C-c C-t H

Tuto markdown mode
=============

C-c C-c 6

`###### Texto de medida pequeña ######`

###### Texto de medida pequeña ######

C-c C-a l

`[La pipa plena](http://lapipaplena.org “La Pipa Plena”)`

[La pipa plena](http://lapipaplena.org “La Pipa Plena”)

C-c C-i i

`![Gnu](http://ourcomments.org/Emacs/img/emacs23P-256.png "Logo emacs")`

![Gnu](http://ourcomments.org/Emacs/img/emacs23P-256.png "Logo emacs")

C-c C-s e

`*En cursiva*`

*En cursiva*

C-c C-s s

`**En negrita**`

**En negrita**

C-c C-s b

`>Cita`

>Cita

C-c C-x m

* item

C-c C-s c

`trozo de código`

C-c C-s p

   Tabulación

C-c -

-------------------------------------------------------------------------------

C-x C-s para guardar y lo compilamos con:

C-c C-c m

Se abrirá una nueva ventana con el resultado en html. Con C-x o cambiamos de ventana y la podemos guardar con C-x C-w. Visualizar el resultado en el navegador pulsando:

C-c C-c p

13-1.png

Si queremos guardar directamente el html generado:

C-c C-c e

Y para visualizar en el navegador el archivo html generado:

C-c C-c v

Si lo que queremos es generar un pdf, instalamos en el sistema pandoc (apt-get install pandoc) e instalamos la extensión pandoc-mode:

M-x package-install RET pandoc-mode

Para activar el módulo cuando se abre un archivo markdown, añadimos al archivo de configuración .emacs las líneas:

;;; activar pandoc con markdown
(load "pandoc-mode")
(add-hook 'markdown-mode-hook 'pandoc-mode)

Reiniciamos o recargamos el buffer, volvemos a abrir el archivo texto.md y comprobamos que en la línea de modo aparece “Markdown Pandoc/native”

13-2.png

Para generar el pdf tecleamos:

M-x pandoc-convert-to-pdf

Naturalmente entrando M-x pandoc TAB TAB veremos un montón de opciones disponibles.

14 Plantillas con skeleton

Con emacs también podemos confeccionar nuestras plantillas usando skeleton. Para hacer pruebas y no ensuciar nuestro archivo de configuración .emacs, vamos a usar ielm. También podríamos usar el buffer scratch pero éste ya lo hemos visto y así incorporamos nuevos recursos. Ielm vendría a ser como una shell para evaluar expresiones elisp.

M-x ielm

14-1.png

Una forma muy básica de probarla, casi equivalente al "Hola mundo", es copy/pasteando en el prompt que acabamos de abrir las siguientes líneas:

(define-skeleton saludo-skeleton
  "Saluda a quien entremos"
  "Pon tu nombre: "
        "Hola, " str "!")

Pulsando "Intro" muestra el nombre que le hemos dado (saludo-skeleton) y a continuación muestra el prompt. Pulsamos (Recuerda a usar TAB para completar la expresión):

M-x saludo-skeleton

Mostrará "Hola," en el prompt y en el minibuffer esperará a que entremos el nombre para completar la expresión.

14-2.png

Una plantilla un poco (?) más útil podría ser:

(define-skeleton cabecera-skeleton
  "Una cabecera para un proyecto"
    ""(setq v1 (skeleton-read "Comment symbol? "))
    \n \n
    v1" ==============================="\n
    v1" Proyecto: " (skeleton-read  "Proyecto: ") \n
    v1" Año de entrega: " (skeleton-read  "Año: ") \n
    v1" Datos extras: " (skeleton-read  "Datos: ") \n
    v1" Fecha: "  (current-time-string) \n
    v1" Autor: Templix" \n
    v1" ===============================" \n
    \n \n )

La Copy/pasteamos en el prompt de ielm, pulsamos “intro” y lanzamos:

M-x cabecera-skeleton

Entramos los datos que nos va solicitando en el minibuffer (El “comment symbol” es el signo al principio de la linea [>]).

14-3.png

Como pequeña muestra de cómo se confeccionan plantillas con skeleton es suficiente. Si quisiéramos incorporar alguna de estas plantillas al archivo de configuración de emacs la tendríamos siempre a nuestra disposición y si la usamos muy a menudo podríamos darle un atajo:

(global-set-key (kbd "C-c t") 'cabecera-skeleton)

Antes de cerrar esta nota, y para ahorrarnos el tener que estar especificando el directorio donde se encuentra cada extensión al estilo:

(add-to-list 'load-path "~/.emacs.d/…

Podemos añadir al inicio (!!) de nuestro archivo de configuración las lineas:

;;; Especificar directorio y subdirectorios de extensiones:
(let ((default-directory "~/.emacs.d/"))
  (normal-top-level-add-subdirs-to-load-path))

No tendría que ocurrir, pero si al iniciar emacs muestra una linea de “archivo no encontrado” (File error: Cannot open load file…) lo más probable es que no se hayan colocado al inicio del archivo. Si antes de estas lineas existe alguna extensión que ha de leer de este directorio del tipo:

(load “pandoc-mode”) o (require 'quickrun)

Dará error:

14-4.png

Tambien podemos verificar si el valor de “load-path” incluye determinado directorio con:

C-h v load-path RET

En caso negativo lo tendremos que incluir y consultar el path de alguna librería con:

M-x locate-library RET emms

15 Plantilla para textos en latex

Latex, el mejor procesador de texto que existe, es un mundo aparte, pero para beneficiarnos de su enorme potencia, tampoco es necesario pasar horas y horas sumergidos en sus manuales. Nosotros, a base de incorporar lineas a medida que las hemos necesitado, nos hemos creado una plantilla más que suficiente: Texto, algunas tablas, urls, imágenes, nada de formulas matemáticas y poca cosa más. Naturalmente, si no vas a usar latex en tu vida o sáltate esta entrega o cuando la hayas asimilado borras las entradas que no te interesen de .emacs.

Abrimos el archivo de configuración:

C-x C-f .emacs

Y pegamos las siguientes líneas:

 (define-skeleton plantilla-latex
 "Plantilla encabezado latex (C-c y)"
 " "
"\\documentclass[a4paper,openright,oneside,12pt]{book}\n"
"\\usepackage{geometry}\n"
"\\usepackage{url}\n"
"\\usepackage[spanish]{babel}\n"
"\\usepackage[T1]{fontenc}\n"
"\\usepackage{textcomp}\n"
"\\usepackage[utf8]{inputenc}\n"
"\\usepackage{fancybox}\n"
"\\usepackage{framed}\n"
"\\usepackage{wedn}\n"
"\\usepackage{utopia}\n"
"\\usepackage{pbsi}\n"
"\\usepackage{suetterl}\n"
"\\usepackage{verbatim}\n"
"\\usepackage{url}\n"
"\\usepackage{setspace}\n"
"\\usepackage[framemethod=tikz]{mdframed}\n"
"\\usepackage{incgraph}\n"
"\\usepackage{xcolor}\n"
"\\usepackage{colortbl}\n"
"\\usepackage{multirow}\n"
"\\usepackage{wrapfig}\n"
"\\usepackage{fancyvrb}\n"
"\\usepackage{fullpage}\n"
"\\usepackage{listings}\n"
"\\usepackage{graphicx}\n"
"\\usepackage{parskip}\n"
"\\textheight=25cm\n"
"\\textwidth=18cm\n"
"\\oddsidemargin=-1cm\n"
"\\topmargin=-1cm\n"
"\n"
"\\begin{document}\n"
"\n"
"\n"
"\n"
"\\end{document}\n")
;
;;; skeleton plantilla-latex:
(global-set-key (kbd "C-c y") 'plantilla-latex)

No vamos a meternos en el significado de cada línea porque no es el tema que nos ocupa, pero recomendamos a los lectores una pequeña inmersión en ese procesador. Recargamos la configuración (M-x eval-buffer) o reiniciamos emacs y lanzamos:

C-x C-f pruebas.tex

Pulsamos el atajo que le hemos asignado:

C-c y

Desplazamos el curso entre \begin{document} y \end{document} y entramos texto y guardamos:

C-u M-! lorem -p 40
C-x C-s

15-1.png

A continuación compilamos el buffer:

C-c C-c RET RET

15-2.png

15-3.png

Si nos salen errores, que no deberían en este caso, podemos consultar el buffer con la salida de la compilación (~/pruebas output) para saber donde tenemos que modificar el texto.

15-4.png

Para visualizar el pdf generado:

C-c C-c RET

15-5.png

Y si queremos modificamos el visor por evince (o el que sea) en el minibuffer:

15-6.png

Si hemos optado por evince, con F5 podemos visualizar la presentación:

15-7.png

Para establecer como visor “evince” de forma predeterminada, añadimos al archivo de configuración .emacs las lineas:

;;; Modificar visor de pdfs y dvis (por defecto xdvi)
(setq TeX-view-program-selection
      '((output-dvi "DVI Viewer")
        (output-pdf "PDF Viewer")))
(setq TeX-view-program-list
      '(("DVI Viewer" "evince %o")
        ("PDF Viewer" "evince %o")))

Con:

C-c v

Visualizaremos el último pdf generado hasta la siguiente compilación.

16 Codificar archivos y párrafos

Llevar un buen archivo de usuarios y contraseñas del montón de webs en las que estamos registrados, cuentas de correo, redes sociales y sitios varios es algo imprescindible. Nuestra favorita es ccrypt, limpia, fácil de usar y perfectamente integrada en emacs. Después de instalarla en el sistema (apt-get install ccrypt) instalamos la extensión con package:

M-x package-install RET ps-ccrypt

Y añadimos a .emacs las lineas:

;; EasyPG (GPG para emacs)
(require 'epa-file)
(epa-file-enable)
;
;;; ccrypt (encriptar archivos)
(setq load-path (cons "~/.emacs.d/lisp/ps-ccrypt" load-path))
(require 'ps-ccrypt "ps-ccrypt.el")

Solamente com gpg, que forma parte del core de emacs, ya podríamos encriptar archivos, pero nos resulta más practico encriptar el archivo con ccrypt y en su interior los parrafos con gpg, de esta forma le damos otra capa de seguridad. Cuando hayamos reiniciado o lanzado M-x eval-buffer y abramos un fichero terminado con .cpt nos pedirá la contraseña y si lo acabamos de crear, la contraseña y la confirmación. Creamos uno:

C-x C-f sarcofago.cpt

Después de entrar la correpondiente contraseña, lo llenamos con algún contenido:

16-1.png

Nos desplazamos con el cursor y seleccionamos los tres correos (C-a C-espacio C-e C-u 3 C-n)

16-2.png

Pulsamos:

M-x epa-encrypt-region

Bajamos con el cursor hasta “OK”, entramos y confirmamos la contraseña y el párrafo lucirá:

16-3.png

Repetimos la operación con los otros párrafos (También podríamos haber seleccionado todo el texto, pero a mi me gusta más encriptar cada sección por separado):

16-4.png

Guardamos el buffer con C-x C-s y lo cerramos (C-x k). Al volver a abrirlo (C-x C-f sarcofago.cpt nos pedirá la contraseña y volveremos a tenerlo con los párrafos encriptados. Para desencriptarlos, seleccionamos el párrafo:

16-5.png

Y pulsamos:

M-x epa-decrypt-region

Nos preguntará si reemplaza el texto:

16-6.png

Y volveremos a tener el párrafo desencritpado:

16-7.png

Si guardamos el buffer en este momento, lo gardará tal cual se muestra en el pantallazo. Para facilitar la labor, creamos unos atajos para encriptar/desencriptar regiones añadiendo estas líneas a .emacs:

;;; Encriptar region:
(global-set-key (kbd "C-c C-e") 'epa-encrypt-region)
;;; Descencriptar region:
(global-set-key (kbd "C-c C-d") 'epa-decrypt-region)

17 Codificar con gpg, el tiempo con wttrin, archivos solo lectura y marcar cambios

Aprovechando que tenemos el honor de estar en http://planet.emacs-es.org/ vamos a proseguir el curso de emacs, que finalizó con el pedazo número 16, con la 17ª entrega con el mismo esquema que la primera parte, o sea sin ningún tipo de esquema.

En la entrega 16 tocábamos como cifrar archivos con dos niveles de codificación. Si no deseamos complicarnos tanto la vida podemos hacerlo solo con gpg. Creamos un archivo con la extensión que nos ocupa:

C-x C-f sarcofago.gpg

y lo llenamos de contenido:

C-u M-! lorem -p 20

Cuando lo guardemos con C-x C-s mostrará esta pantalla:

17-1.png

Pulsamos OK y nos preguntará la contraseña y su confirmación. Cuando lo volvamos a invocar también tendremos que tipear la contraseña.

17-2.png

Hablemos otra vez del tiempo. Otra forma de conocer la situación climática de nuestra ciudad, además de la que mencionábamos en la 13ª entrega con la extensión weather-metno, es usando la extensión wttrin. La instalamos:

M-x package-install RET wttrin

Recuerda que "RET" significa pulsar Intro y luego teclear "wttrin". Añadimos a nuestro archivo de configuración .emacs las lineas:

;;; Otra forma de conocer el tiempo en una ciudad
(require 'wttrin)

Recargamos la configuración o reiniciamos emacs y lanzamos:

M-x wttrin

Preguntará la ciudad, la entramos (figueres [Girona] en este caso) y veremos un resultado más visual y con muchos menos datos que con weather-metno.

17-3.png

Pulsando "q" cerramos el buffer y "g" para entrar otra ciudad. También podemos especificar en el archivo de configuración .emacs varias ciudades y así, después de lanzar wttrin cuando nos pide la ciudad, pulsando una o dos letras y TAB completará la deseada, agregando las lineas:

(setq wttrin-default-cities '("figueres" "bogota" "melbourne"))

Y si sólo consultamos una ciudad o sea que la variable wttrin-default-cities únicamente tiene un nombre:

(setq wttrin-default-cities '("figueres"))

O la consulta más usual es sobre la primera del listado, con la función:

(defun mi-wttrin ()
  "Abrir wttrin con la primera ciudad especificada en 'wttrin-default-cities'"
  (interactive)
  (wttrin-query (car wttrin-default-cities)))

Y después de recargar la configuración o reiniciar emacs y lanzando:

M-x mi-wttrin

Nos ahorramos el tener que especificarla cada vez. Y para terminar esta entrega, una función y algo sobre read-only-mode. La función emplea "occur” que ya vimos en la 6ª entrega y que hace una búsqueda recursiva en todos los buffers que tengamos abiertos en la sesión. Copi/pasteamos a nuestro archivo de configuración .emacs.

(defun search (regexp)
  "Buscar una expresión en todos los buffers abiertos"
  (interactive "sExpresión a buscar: ")
  (multi-occur-in-matching-buffers ".*" regexp))

Cuando no queremos que un buffer sufra algún accidente podemos activar/desactivar el modo de sólo lectura pulsando C-x C-q o:

M-x read-only-mode

Si contrariamente, lo que queremos es dejar constancia visual de todos los cambios que vamos haciendo en un buffer, podemos activar:

M-x highlight-changes-mode

17-4.png

Y nos marcará de otro color todo lo modificado en el buffer. Felices orgasmos con emacs

18 wdired, renombrando archivos y cambiando permisos

En la 3ª entrega abordamos el navegador de archivos Dired de forma básica, en esta veremos algunas de sus innumerables posibilidades. Lo abrimos y creamos un directorio de pruebas pulsando por orden los siguientes comandos (Recuerda que "RET" es "Intro"):

C-x d RET
+
pruebas RET RET

Ya estamos en su interior.

18-1.png

Creamos 8 archivos de texto:

M-! touch {1..8}.txt

18-2.png

Pulsamos "g" para actualizar el buffer.

18-3.png

Vamos a cambiar los permisos del archivo 5.txt. Primero modificamos la variable que lo va a permitir:

M-x set-variable RET wdired-allow-to-change-permissions RET t

Luego posicionamos el cursor sobre el permiso que vamos a cambiar y activamos el modo escritura de dired (wdired):

C-x C-q

18-4.png

Pulsamos "w" y fijamos los cambios:

18-5.png

C-c C-c

Si queremos dejar esta variable siempre activa ponemos en el archivo de configuración .emacs la linea:

(setq wdired-allow-to-change-permissions t)

Y si la queremos desactivar:

M-x set-variable RET wdired-allow-to-change-permissions RET nil

Ahora vamos a renombrar todos los archivos del directorio menos 1.txt y 8.txt. Activamos nuevamente wdired:

C-x C-q

Colocamos el cursor sobre 2.txt y los seleccionamos:

C-Esp
C-e
C-n

18-6.png

Borramos la selección:

C-x r k

18-7.png

C-u C-x r N

Entramos el numeral del que queremos empezar. Ponemos que empiece por 10 (por defecto 1) y entramos el nuevo formato:

file-%2d.txt

18-8.png

Fijamos los cambios cerrando wdired

C-c C-c

Cuando activamos wdired (C-x C-q) tambien podemos modificar directamente el nombre de los archivos del directorio como si de un archivo de texto se tratara. Los cambios no se materializarán hasta salir del modo (C-c C-c) y si en algún momento antes de salir pulsamos:

C-c Ess

Deshacemos los cambios realizados.

Existen dos funciones que en algún caso pueden sernos útiles: Una para que cuando salgamos de wdired (C-c C-c) nos pida confirmación para cada cambio efectuado (wdired-use-interactive-rename) y la otra que pida confirmación solo cuando se va a sobreescribir un archivo ( wdired-confirm-overwrite). Si las queremos tener siempre activadas añadimos las siguientes lineas al archivo de configuración .emacs:

;;; Pedir confirmación para los cambios efectuados
(setq wdired-use-interactive-rename t)
;;; Confirmación si se sobreescribe un archivo
(setq wdired-confirm-overwrite t)

Y si solo las queremos activar de forma temporal procedemos como con todas las funciones:

M-x set-variable RET wdired-use-interactive-rename RET t
M-x set-variable RET setq wdired-confirm-overwrite RET t

Y sustituir la "t" final por "nil" cuando las desactivemos.

Felices orgasmos con emacs

19 impatient-mode, writeroom-mode, capturas y memoria en uso.

En esta ocasión veremos algunos paquetes interesantes que, en determinadas circunstancias, pueden sernos útiles.

En ciertas ocasiones queremos compartir un buffer de emacs en nuestra red local y que además todos vean lo que estamos tecleando en tiempo real. Una forma fácil de realizar estas proezas es con la extensión impatient-mode. Este paquete precisa simple-httpd y htmlize. Lo instalamos de la forma habitual:

M-x package-install RET impatient-mode RET

Activamos el servidor (simple-httpd):

M-x httpd-start

Nos colocamos en el buffer que deseamos compartir y activamos el modo menor (El mismo comando lo desactiva):

M-x impatient-mode

Los demás equipos de la red visualizaran nuestro buffer en la dirección http://ip:8080/imp . Para cerrar la conexión

19-1.png

M-x httpd-stop

Y en el buffer que hemos lanzado impatient-mode:

M-x impatient-mode

Casi todos los usuarios de emacs también lo somos de org-mode. Cualquiera que haya sido tocado con su mágia, sabe que entrar en org-mode es como traspasar el horizonte de sucesos de un agujero negro: No hay vuelta atras. Es adentrarse en un nuevo estado de la materia que trasciende nuestros sentidos y nos transporta a un mundo cuántico donde las leyes físicas dejan de tener sentido y el concepto de espacio/tiempo se relativiza hasta extremos inimaginables.

Naturalment no voy a hablar de org-mode al menos, de momento, sinó de writeroom-mode, un modo menor que permite escribir sin distracciones y con escasos ajustes en nuestro archivo de configuración. Para su instalación como siempre (M-x package-install…). En .emacs sólo he aumentado los caracteres por linea de 80 (por defecto) a 120 añadiendo:

(custom-set-variables '(writeroom-width 120))

Si somos de los que estamos variando continuamente los caracteres por linea, segun el texto que nos ocupa, podemos añadir unos atajos para facilitar las cosas:

(with-eval-after-load 'writeroom-mode
  (define-key writeroom-mode-map (kbd "C-c <") #'writeroom-decrease-width)
  (define-key writeroom-mode-map (kbd "C-c >") #'writeroom-increase-width)
  (define-key writeroom-mode-map (kbd "C-c =") #'writeroom-adjust-width))

Otra cosa en la que emacs también nos echa un cable es con el texto de las licencias. El paquete es xlicense (M-x package-install…) y solo precisa añadir al archivo de configuración el "require" correspondiente:

(require 'xlicense)

Lo lanzamos con:

M-x license-skeleton

Y pulsando la tecla TAB veremos las opciones.

19-2.png

Escogemos la deseada.

19-3.png

Y para terminar esta entrega dos extensiones útiles: screenshot y memory-usage. Obviamente la primera es para realizar capturas de pantalla y la otra para mostrar la cantidad de memoria en uso de los buffers de nuestra sesión de emacs. Si queremos especificar un directorio donde almacenar las capturas, añadimos a nuestro archivo de configuración .emacs:

;;; Que las capturas se guarden en ~/capturas
(setq screenshot-schemes
   '(("local"
      :dir "~/capturas/")))
(setq screenshot-default-scheme "local")

Al lanzar:

M-x screenshot

Después de colocar el nombre de la captura y confirmar el scheme "local" y pulsar C-c C-c

19-4.png

El puntero se convierte en una cruz y seleccionamos el trozo a capturar.

19-5.png

M-x memory-usage

19-6.png

Felices orgasmos con emacs.

logo.png

20 Gráficos en org-mode

En esta entrega veremos como crear gráficos con org-mode para que al exportar a html se vean aparentes. En primer lugar, caso de no tenerla instalada, instalamos la aplicación ditaa (apt-get install ditaa), aplicación que transforma caracteres ascii en mapas de bips. Una vez instalado en el sistema, abrimos emacs y visualizamos su página man:

M-x man RET ditaa

Si queremos ver las páginas man con algunos colorines, añadimos al archivo de configuración .emacs las lineas (Los colores, como es natural, al gusto del interesado):

(set-face-attribute 'Man-overstrike nil :inherit 'bold :foreground "orange red")
(set-face-attribute 'Man-underline nil :inherit 'underline :foreground "forest green")

20-0.png

Ditaa también puede usar por terminal:

20-1.png

Naturalmente nosotros la usaremos en org-mode. Tambien descargamos plantuml.jar (http://plantuml.com/download) y lo colocamos, por ejemplo, en /opt/plantuml.jar. Realizamos unos ajustes en el archivo de configuración .emacs para indicarle donde están los ejecutables, ya que por defecto en mi Debian testing busca ditaa en /usr/share/emacs/25.1/lisp/contrib/scripts/ditaa.jar y plantuml en la sierra de Gredos, añadiendo las lineas:

;;; Crear gráficos con org-mode con ditaa y plantuml
(setq org-plantuml-jar-path
      (expand-file-name "/opt/plantuml.jar"))
;
(setq org-ditaa-jar-path "/usr/bin/ditaa")
;

Asegurarse de que la ruta especificada en org-ditaa-jar-patch sea la correcta (whereis ditaa). En el caso de plantuml, si bien también lo tengo instalado en el sistema (apt-get install plantuml) he tenido que bajar el .jar porque no me pillaba el ejecutable situado en /usr/bin/plantuml. A continuación incluir ditaa y plantuml en org-babel-do-load-languages para que resuelvan los caracteres:

(org-babel-do-load-languages
 'org-babel-load-languages
 '((emacs-lisp . t)
   (latex . t)
   (python . t)
   (shell . t)
   (ditaa . t)
   (plantuml . t)
   (sh . t)))

Recargamos la configuración de emacs con M-x eval-buffer o reiniciándolo y empezamos por crear un directorio de trabajo con dos subdirectorios, uno para las plantillas css y el otro para las imágenes:

$ mkdir -p org/{css,images}
$ touch org/pagina.org

De tal manera que el arbol del directorio nos quede:

$ tree org
org
├── css
├── images
└── pagina.org

2 directories, 1 file

Descargamos un paquete de plantillas css de http://lapipaplena.org , que es recopilación de varios lugares (https://github.com/dakrone/dakrone.github.com , https://github.com/fniessen/org-html-themes , http://thomasf.github.io/solarized-css/ , https://raw.githubusercontent.com/orderedlist/modernist/master/stylesheets/styles.css , http://nklein.com/2010/05/org-mode-css/ ). Pedimos indulgencia por las chapucillas que contienen, las tenemos en proceso de revisión pero las cosas no van lo rápido que desearíamos. Como muestras ya nos sirven. Las copiamos en org/css. También descargamos el paquete de imágenes que usamos en este post por si se van copipasteando los codigos en el archivo pagina.org de http://lapipaplena.org y las copiamos en el directorio images

Abrimos pagina.org:

C-x C-f org/pagina.org

Y colocamos un encabezado mínimo: Título y un archivo css, useremos la plantilla org2.css así podremos ir cambiando de plantilla solo cambiando el digito (2) por el que deseemos para ir probandolas todas de forma fácil y rápida:

#+TITLE: GRAFICOS CON ORG-MODE
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/org2.css"/>

Y a continuación copia/pasteamos:

#+begin_src ditaa :file ditaa1.png

+-------+   +--------+   +--------------+   +-------+
|{io}   |   |{d}     |   |{s}           |   |cBLU   |
| Nacer +-->+ Crecer +-->+ Reproducirse +-->+ Morir |
| c1BA  |   |        |   |              |   |       |
+-------+   +--------+   +-------+------+   +-------+
              |
              |
           /--+--\             +--------+
           | c2BA|             | c1AB   |         /=\
           | GNU +------+----->+  Vida  |-------> |∞|
           \-----/             | eterna |         \-/
                               +--------+

#+end_src

Pulsamos:

C-c C-e h h

20-2.png

Pulsamos "y" y nos creará el archivo ditaa1.png y pagina.html en el directorio org.

20-3.png

$ tree org
org
├── css
│   ├── org10.css
│   ├── org11.css
│   ├── org12.css
│   ├── org13.css
     ...
│   ├── org7.css
│   ├── org8.css
│   ├── org9.css
│   └── org.css
├── ditaa1.png
├── imagenes
│   ├── 20-0.png
│   ├── 20-10.png
     ...
│   ├── 20-8.png
│   └── 20-9.png
├── pagina.html
└── pagina.org

2 directories, 33 files

Visualizamos en el navegador org/pagina.html

20-4.png

Veamos varios ejemplos con sus respectivos resultados que podemos ir copipasteando en nuestro archivo pagina.org

También podemos pasar un argumento a ditaa, en este caso, para que las esquinas sean redondeadas (:cmdline -r):

#+begin_src ditaa :file ditaa.png :cmdline -r
+-------------------+
|                   |
|      Distros      |
|                   |
+---------+---------+
| Linux   |  GNU    |
|         | cRED    |
+---------+---------+
#+end_src

20-5.png

O que las esquinas sean redondeadas usando los caracteres "\" y "/":

#+begin_src ditaa :file ditaa2.png
/-----------------\
| Algunas Distros |
| cGRE            |
| - Debian        |
| - Arch          |
| - Ubuntu        |
| - Fedora        |
\-----------------/
#+end_src

20-6.png

Las figuras geométricas que contienen el texto han de estar cerradas usando los caracteres permitidos (-,=,|,/,\,:,<,>,^) Los : y el = son equivalentes y solo colocando uno de estos signos en algún lugar de la figura, la mostrará punteada.

#+begin_src ditaa :file ditaa3.png
/--------=-------------------\
| Linux es un sistema genial |
\----------------------------/
#+end_src

20-7.png

#+begin_src ditaa :file ditaa4.png
Algunos colores
/--------------+--------------\
|cYEL Debian   |cPNK Ubuntu   |
+--------------+--------------+
|cBLK Arch     |cBLU Mint     |
+--------------+--------------+
|c96C Mageia   |c0F0 Tails    |
+--------------+--------------+
|cGRE Fedora   |cRED Suse     |
\--------------+--------------/
#+end_src

20-8.png

Tenemos 3 figuras más a nuestra disposición usando las llaves ({d}, {s} y {io})

#+begin_src ditaa :file ditaa5.png
+----------+  +---------+  +----------+
|{d} cRED  |  |{s} cBLU |  |{io} cPNK |
|          |  |         |  |          |
|  Linux   |  |   es    |  | genial   |
|          |  |         |  |          |
+----------+  +---------+  +----------+
#+end_src

20-9.png

Usando flechas:

#+begin_src ditaa :file ditaa7.png
    +--------+   +--------+    +-------+
    |        | --+ Debian +--> |       |
    | Linux  |   +--------+    |  Dios |
    |  GNU   |   |  Arch  |    |       |
    |     {d}| --+ cRED   +--> | cYEL  |
    +---+----+   +--------+    +-------+
        :                            ^
        |    Camino a la perfección  |
        +----------------------------+
#+end_src

20-10.png

Otros colores permitidos: 789, 000, 222, 333, 555, 666, 777, 888, 999, BBB, CCC, DDD, EEE, ABC, 9CF, BFF, 026, 369, 39C, 69C, 00F, 0FF, 0EE, 0F0, C33, F00, F0F, FBF, 96C, FFF, FF0, C90

Los graficos con ditaa son bastante simples de confeccionar. Plantuml se usa para gráficos más complejos y la verdad yo no lo he precisado nunca, pero me ha parecido interesante, a modo de ejemplo, poner un trozo de código sacado de la web para ver si alguien se anima con él:

test_uml.png

Felices orgasmos con emacs.

21 postámbulos y algo sobre imagenes en org-mode

Por defecto, el postámbulo que aparece en un html que ha sido exportado de un archivo org, coge los datos del sistema y consta del nombre del autor (author), la fecha (timestamp), las versiones de emacs y org-mode (creator) y el link de validación del código.

21-1.png

Si queremos especificar más datos de las mencionados o suprimir alguno de los existentes, lo tendremos que especificar en el propio header del archivo org o desde el archivo de configuración .emacs

Para suprimir todo el postamble colocamos en la cabecera del archivo org la linea:

#+OPTIONS: html-postamble:nil

Si sólo queremos que salga una fecha concreta (que especificamos en #+DATE:) y validación y suprimir autor, versiones y fecha actual:

#+DATE: 2017
#+OPTIONS: author:nil creator:nil timestamp:nil

O que salgan todos los datos distintos a los que saldrían por defecto más el correo electrónico:

#+DATE: 2017
#+AUTHOR: Mano Negra
#+CREATOR: GNU/Linux, emacs y org-mode
#+OPTIONS: timestamp:nil email:t
#+EMAIL: manonegra@gmoil.com

21-2.png

Para suprimir la validación del código añadir a .emacs la linea:

(setq org-html-validation-link nil)

Si deseamos que siempre se muestre en el postámbulo un usuario y un correo electrónico concretos y que no son los del sistema, añadimos a .emacs las lineas:

(custom-set-variables '(user-full-name "manonegra"))
(custom-set-variables '(user-mail-address "manonegra@gmail.com"))

Siempre tendremos que especificar en el archivo org: #+OPTIONS: email:t para que salga reflejado.

Veamos ahora algo sobre imágenes de mucho peso en un documento org. Supongamos una de gran formato:

$ file 21-3.png
21-3.png: PNG image data, 1916 x 1039, 8-bit/color RGB, non-interlaced

Colocada sin parámetros:

[[./images/21-3.png]]

O como link:

[[./images/21-3.png][Luna]]

Excederán de la página ya que emacs no redimensiona las imágenes. Podemos solucionar este inconveniente con las siguientes lineas delante de cada una de las imágenes. Las dejaremos en 600 px. Si además queremos exportarlo a pdf (C-c C-e l p), con 600 px todavía se veran muy grandes en el pdf resultante por tanto, para este caso, las reducimos a 200 (recuerda que org-mode pasa a pdf via tex) y, ya que estamos, también vemos como añadir un borde de determinado color a la imagen.

#+CAPTION: Luna a 600px
#+ATTR_HTML: :width 600 :style border:5px solid red;
#+ATTR_latex: :width 200
[[./images/21-3.png]]

21-3.png

Y como último recurso siempre podemos tratar las imágenes con html puro y duro con la etiqueta correspondiente:

#+html: <p align="center"><img src="./images/21-3.png" style="width:200px;border:5px solid red;" /></p>
#+html: <center><p>Figura 1 Luna a 200px</p></center>

21-4.png

Y para terminar, algunos atajos. No soy amante de poner un montón de ellos, que por otra parte se pueden encontrar en infinidad de sitios y desincentivan a los recien llegados. Lo normal es ir incorporándolos a medida que se van necesitando. Mostraré sólo los que uso, además de los genéricos, en org-mode, que como se puede ver, tampoco son tantos:

|-----------------+-------------------------------------------------|
| C-c C-n         | Siguiente cabecera                              |
| C-c C-p         | Anterior cabecera                               |
|-----------------+-------------------------------------------------|
|-----------------+-------------------------------------------------|
| C-u C-u C-u TAB | Despliega todas las secciones                   |
| C-u C-u TAB     | Pliega todas las seciones                       |
| TAB             | Pliega/despliega seccion                        |
|-----------------+-------------------------------------------------|
|-----------------+-------------------------------------------------|
| <s TAB          | #+begin_src ... #+end_src                       |
| <e TAB          | #+begin_example ... #+end_example               |
| <v TAB          | #+begin_verse ... #+end_verse                   |
|-----------------+-------------------------------------------------|
|-----------------+-------------------------------------------------|
| C-c C-e l p     | Exportar a LaTeX y procesar a PDF               |
| C-c C-e l o     | Exportar a LaTeX, procesar a PDF y visualizarlo |
| C-c C-e h h     | Exportar a HTML                                 |
| C-c C-e h o     | Exportar a HTML y abrirlo en el navegador       |
|-----------------+-------------------------------------------------|

Felices orgasmos con emacs.

22 Personalizar la linea de modo y el minibuffer

En esta entrada veremos como personalizar un poco la linea de modo y el minibuffer. Sin ningún tipo de modificación, la linea de modo puede lucir más o menos así:

22-1.png

Añadiendo a nuestro archivo de configuración .emacs las siguientes lineas:

(setq-default mode-line-format
      (list
       " %2 " mode-line-modified
       " %2 %f %4 [%l:%p] "
       " %4 %m %4 %I %4 "
       mode-line-misc-info
       " %4 " (message "Emacs es genial") " %4 "
       mode-line-end-spaces))

Se verá:

22-2.png

Para que la fecha se muestre tal como se ve en la imagen, tengo en el archivo de configuración .emacs las siguientes lineas:

(setq display-time-string-forms
      '(day "-" month "-" year " " "[" 24-hours ":" minutes "]"))
(display-time)
+-------------------------+-----------------------------------------------------------------------+
| %2                      | Los signos "%" seguidos de un dígito indican espacios.                |
| mode-line-modified      | Indica si el buffer ha sido modificado:                               |
|                         |   --  no modificado desde última vez.                                 |
|                         |   **  modificado desde la última vez que se guardó                    |
|                         |   %*  de sólo lectura pero modificado                                 |
|                         |   %%  de sólo lectura pero no modificado                              |
| %f                      | Mostrar la ruta absoluta del archivo visitado.                        |
| [%l:%p]                 | Mostrar entre corchetes, num linea, ":" y porcentage desde el inicio. |
| %m                      | Modo mayor                                                            |
| %I                      | Tamaño del buffer entendible para humanos.                            |
| mode-line-misc-info     | Información diversa en este caso fecha, hora y minutos.               |
| message ...             | Única verdad universal                                                |
| mode-line-end-spaces    | Guiones hasta el final.                                               |
+-------------------------+-----------------------------------------------------------------------+

Para ver más opciones desplegamos la variable mode-line-format

C-h v mode-line-format

22-3.png

Podemos modificar los colores del minibuffer según si este está activo o no, añadiendo a .emacs las lineas:

;;; Modificar colores de letra y fondo del minibuffer según si está activo o no.
(dolist (buf '(" *Echo Area 0*" " *Echo Area 1*"))
  (with-current-buffer (get-buffer buf)
    (make-local-variable 'face-remapping-alist)
        (add-to-list 'face-remapping-alist '(default (:background "yellow" :foreground "black")))))

Los colores, al gusto.

22-4.png

Y los colores de letra del prompt añadiendo al archivo de configuración:

;;; Modificar color de letra del prompt del  minibuffer
(set-face-foreground 'minibuffer-prompt "red")

22-5.png

En la area de eco podemos tener un pequeño monitor del sistema que se activa cuando el minibuffer está inactivo, por defecto, durante 2 segundos. Para ello tendremos que instalar el paquete symon, desde Github (https://github.com/zk-phi/symon) o Melpa con package y añadir a .emacs las lineas:

;;; Mostrar, cuando el minibuffer esta inactivo, un pequeño monitor del sistema
(require 'symon)
(symon-mode)

22-6.png

Como podemos observar, muestra 4 parámetros:

Felices orgasmos con emacs.

23 Presentaciones con beamer

En esta entrada veremos como crear una presentación con beamer a partir de un archivo org. Para no andar dejando archivos esparcidos por cualquier parte, creamos un directorio de trabajo y en su interior colocamos el archivo presentacion.org:

$ mkdir beamer
$ touch beamer/presentacion.org

Para hacer lo mismo también puedes emplear dired:

M-x d RET + beamer RET
C-x C-f presentacion.org

Visitamos el archivo presentacion.org. La forma por defecto para insertar el encabezado es pulsar C-c C-e # (en algunos casos C-c C-e t) y nos solicitará la categoria:

23-1.png

Pulsando la tecla TAB nos muestra las posibilidades:

23-2.png

Escogemos "beamer" y nos colocará en el buffer los parámetros que vienen por defecto especificados ox-beamer.el:

23-3.png

Aunque a mi me gusta más un skeleton que tengo en el archivo de configuración .emacs y que se inserta con C-c 4

(define-skeleton beamer
  "Plantilla general para presentaciones con beamer (C-c 4)"
  "beamer: "
  "\#+TITLE: \n"
  "\#+AUTHOR: \n"
  "\#+DATE: \n"
  "\#+OPTIONS: toc:nil num:nil H:2 \n"
  "\#+LATEX_CLASS: beamer \n"
  "\#+LATEX_CLASS_OPTIONS: [presentation] \n"
  "\#+BEAMER_THEME:         ;[height=20pt] \n"
  "\#+BEAMER_COLOR_THEME: \n"
  "\#+BEAMER_FONT_THEME: professionalfonts \n"
  "\#+LANGUAGE: es \n"
  "\#+LATEX_HEADER: \\usepackage[AUTO]{babel} \n")
;;; skeleton beamer:
(global-set-key (kbd "C-c 4") 'beamer)

23-4.png

Si en DATE queremos la fecha de hoy colocamos:

#+DATE: \today

Para especificar una concreta simplemente la colocamos (2017, 05-01-2017…)

En cuanto a los temas, el directorio de las plantillas instaladas por defecto puede encontrarse ejecutando:

$ kpsewhich beamerthemedefault.sty
/usr/share/texlive/texmf-dist/tex/latex/beamer/themes/theme/beamerthemedefault.sty

Kpsewhich es un front-end de la biblioteca kpathsea. Esta biblioteca se utiliza para buscar rutas, examinar variables y encontrar archivos. Un listado del directorio nos muestra las que pueden visualizarse en http://www.deic.uab.es/~iblanes/beamer_gallery/index_by_theme.html

$ ls /usr/share/texlive/texmf-dist/tex/latex/beamer/themes/theme/
beamerthemeAnnArbor.sty     beamerthemeCopenhagen.sty   beamerthemeIlmenau.sty      beamerthemePaloAlto.sty
beamerthemeAntibes.sty      beamerthemeDarmstadt.sty    beamerthemeJuanLesPins.sty  beamerthemePittsburgh.sty
beamerthemeBergen.sty       beamerthemedefault.sty      beamerthemeLuebeck.sty      beamerthemeRochester.sty
beamerthemeBerkeley.sty     beamerthemeDresden.sty      beamerthemeMadrid.sty       beamerthemeSingapore.sty
beamerthemeBerlin.sty       beamerthemeEastLansing.sty  beamerthemeMalmoe.sty       beamerthemeSzeged.sty
beamerthemeBoadilla.sty     beamerthemeFrankfurt.sty    beamerthemeMarburg.sty      beamerthemeWarsaw.sty
beamerthemeboxes.sty        beamerthemeGoettingen.sty   beamerthemeMontpellier.sty  compatibility
beamerthemeCambridgeUS.sty  beamerthemeHannover.sty

Cada una de las plantillas puede modificarse con los colores mostrados en http://deic.uab.es/~iblanes/beamer_gallery/index_by_color.html y cuyo directorio es:

ls /usr/share/texlive/texmf-dist/tex/latex/beamer/themes/color
auto                           beamercolorthemedove.sty     beamercolorthemeseahorse.sty
beamercolorthemealbatross.sty  beamercolorthemefly.sty      beamercolorthemesidebartab.sty
beamercolorthemebeaver.sty     beamercolorthemelily.sty     beamercolorthemespruce.sty
beamercolorthemebeetle.sty     beamercolorthememonarca.sty  beamercolorthemestructure.sty
beamercolorthemecrane.sty      beamercolorthemeorchid.sty   beamercolorthemewhale.sty
beamercolorthemedefault.sty    beamercolorthemerose.sty     beamercolorthemewolverine.sty
beamercolorthemedolphin.sty    beamercolorthemeseagull.sty

Crear plantillas de temas o colores para beamer es un proceso curioso. Estos archivos personalizados es preferible colocarlos en un directorio específico. Puede obtener ese directorio ejecutando:

$ kpsewhich -var-value TEXMFLOCAL
/usr/local/share/texmf

En ese directorio creamos los subdirectorios /tex/latex/beamer:

# mkdir -p /usr/local/share/texmf/tex/latex/beamer/

Y en su interior vamos a copiar un tema de color que luego modificaremos, por ejemplo el tema de color fly:

# cp /usr/share/texlive/texmf-dist/tex/latex/beamer/themes/color/beamercolorthemefly.sty /usr/local/share/texmf/tex/latex/beamer/beamercolorthemebakunin.sty

Lo visitamos con emacs usando la siguiente función (o alguna parecida) que nos permita modificar archivos de sistema:

(defun sudo-open-file (file)
  "Abrir archivo com privilegios de administrador"
  (interactive "FFind file: ")
  (set-buffer
   (find-file
    (concat "/sudo::"
            (expand-file-name file)))))

Ejecutamos:

M-x sudo-open-file /usr/local/share/texmf/tex/latex/beamer/beamercolorthemebakunin.sty

Modificamos el color de fondo en la linea "\setbeamercolor{normal text}" de bg=black!30 a bg=brown!90!yellow

23-5.png

23-6.png

Una vez guardado el buffer (C-x C-s) para recargar los temas, ejecutamos en la terminal como administrador:

# texhash
texhash: Updating /usr/local/share/texmf/ls-R...
texhash: Updating /var/lib/texmf/ls-R-TEXLIVEDIST...
texhash: Updating /var/lib/texmf/ls-R-TEXMFMAIN...
texhash: Updating /var/lib/texmf/ls-R...
texhash: Done.

Comprobamos que se ha cargado correctamente si muestra la ruta ejecutando:

$ kpsewhich beamercolorthemebakunin.sty
/usr/local/share/texmf/tex/latex/beamer/beamercolorthemebakunin.sty

Y ya podremos usar nuestro flamante tema de color "bakunin" en el encabezado de nuestros archivos org:

#+BEAMER_THEME: Singapore
#+BEAMER_COLOR_THEME: bakunin

23-7.png

Los colores predefinidos son red, green, blue, cyan, magenta, yellow, black, darkgray, gray, lightgray, orange, violet, purple y brown.

La mezcla de colores se especifica:

yellow!80!gray =  80 % amarillo + 20% gris
red!60!cyan    =  60 % rojo + 40% cyan
gray!40!blue   =  40 % gris + 60% azul

Como ejemplo, podeis descargar una presentación sobre emacs que usamos en una charla un tanto heterogénea, informal y surrealista realizada el 27-9-2014 de beamer.tar.gz

23-8.png

Figura 122: Cartel de la magnifica charla.

Fecha: 2016-17

Autor: La Pipa Plena (lapipaplena.org/emacs)

Emacs 25.1.1 (Org mode 8.2.10)