El blog de Shackra

Catolicismo Emacs Software libre

“No seas tan abierto de mente o tu cerebro se caerá” ~G.K. Chesterton

GNU Emacs: Primeros pasos (I)

Soy usuario de GNU Emacs desde 2011 (a mediados de año, quizás). He llevado un camino largo de aprendizaje del que estoy muy contento porque ha rendido sus frutos, uso Emacs profesionalmente en el desarrollo de software para distintos clientes, en él reviso mi correo electrónico y además puedo escribir éste blog. Emacs puede hacer mil y un cosas, en él el refrán «El que mucho abarca poco aprieta» es una mentira prácticamente, así que las cosas que he mencionado no son lo único que Emacs puede hacer por usted, el usuario.

<div id="fb-root"></div><script>(function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = "/connect.facebook.net/es_LA/sdk.js#xfbml=1&version=v2.3"; fjs.parentNode.insertBefore(js, fjs);}(document, 'script', 'facebook-jssdk'));</script><div class="fb-post" data-href="https://www.facebook.com/100000335518512/posts/1053339288020578" data-width="500"><div class="fb-xfbml-parse-ignore"><blockquote cite="https://www.facebook.com/100000335518512/posts/1053339288020578/">Posted by <a href="https://www.facebook.com/jorgejavieran">Jorge Araya Navarro</a> on&nbsp;<a href="https://www.facebook.com/100000335518512/posts/1053339288020578/">viernes, 25 de diciembre de 2015</a></blockquote></div></div>

Y ya que GNU Emacs de maravilloso también lo tiene de bestia y salvaje, he decidido escribir una serie de guías para ayudar a la nueva generación de usuarios a comprender más rápidamente Emacs y evitarles así las malas practicas y los dolores de cabeza que yo sufrí tiendo más novato.

En ésta guía vamos a instalar Emacs en tu sistema, así como también veremos algunos conceptos propios de éste maravilloso editor de texto de 30 años de edad y, ¡Preparar algunas cuestiones en la configuración para el primer uso!.

En ésta guía, y el las entradas posteriores se hace la suposición sobre el lector que:

  1. Su sistema operativo es GNU/Linux, o algún hijo de Unix (MacOs X, FreeBSD, etc). Si éstas en Windows, no te preocupes, aun puedes usar Emacs desde Windows.
  2. Tienes un interés por conocer y usar activamente piezas de software míticos, porque, sabrá usted, Emacs es mítico.
  3. No te da miedo afrontar retos, porque ciertamente, ¡usar Emacs al principio es todo un reto!.
  4. Quieres usar el editor de texto que apareció en la película Tron: Legacy.
  5. Sabes nada o sabes poco de programación/desarrollo de software.

Instalar GNU Emacs

El primer paso es por supuesto instalar Emacs si aun no lo tienes instalado en tu sistema.

en GNU/Linux

Yo recomiendo encarecidamente instalar la versión más actualizada y disponible para tu distribución de GNU/Linux, esto porque algunas distribuciones de GNU/Linux como Debian o Ubunto ofrecen versiones algo viejas, y si usas una versión vieja de Emacs no podrás disfrutar de las mejoras y características que ofrecen las versiones nuevas. Ya que yo uso Parabola GNU/Linux-libre siempre tengo disponible la ultima versión de todos los paquetes que ofrece mi repositorio de software, incluido Emacs.

Si efectivamente estas usando Ubunto o Trisquel lo mejor es que agregues éste repositorio de software a tu lista de fuentes. Acá no explicare cómo hacer eso, las instrucciones están en la sección Adding this PPA to your system, y además, ya deberías saber eso.

en MacOS X

Buscando Emacs MacOS X updated da muchos resultados, entre ellos, Emacs for Mac OS X. Debería ser suficiente para los usuarios de Mac. No olvides visitar ese sitio web una vez al mes cuando mucho por si acaso hay actualizaciones de Emacs.

en Windows

Puedes descargar un archivo comprimido que contiene Emacs, te interesa el archivo que se llama emacs-x.y-bin-i386.zip, naturalmente x representa la version mayor (24 al momento de escribir ésta entrada) y la y representa la versión menor (3 al momento de escribir ésta entrada), siempre busca por el archivo que contenga la versión mayor de entre todos los ofrecidos. Aquí no hay instalador, pero puedes descomprimir ese archivo en tu unidad C:\, entrar en el, ir a la carpeta bin y ejecutar el binario addpm.exe, eso agregara Emacs a tu barra de menú como con cualquier otra aplicación.

También ten en cuenta que en Windows el directorio ~ existe, pero a veces no apunta a donde te gustaría que apuntase. Por ejemplo, tu carpeta de usuario esta en C:\Users\shackra sin embargo ~ expande a C:\Users\shackra\AppData\Roaming o algo similar, y te digo que tu de verdad deseas que ~ expanda a C:\Users\shackra. Para saber más detalles sobre esto y configurar Windows para corregir este comportamiento lee el manual de Emacs. Has estos cambios antes de continuar con ésta guía.

Iniciando GNU Emacs por primera vez

Al arrancar Emacs por primera vez, deberías de ver algo similar a esto:

{{http://i.imgur.com/0TaM9LU.png}}

así es como se ve mi Emacs afilado y configurado a mis necesidades:

{{http://i.imgur.com/pNhxyck.png}}

¡Muy bien! Tienes Emacs instalado en tu sistema de manera exitosa. Acá hay otra captura de pantalla pero esta vez delineando las partes del programa y su nombre:

{{http://wikemacs.org/images/b/b5/Emacs_parts.png}}

Tenemos:

  • El cuadro o frame: es la ventana de Emacs en sí. Todos los usuarios nos referimos a ésta parte de Emacs con el nombre de cuadro o frame. Si de repente usas el termino ventana o window para referirte a ella puedes causar confusión para los demás usuarios y tener problemas al momento de pedir ayuda. Puedes tener más de un cuadro abierto (luego te explicare cómo se hace).
  • La ventana o window: son esas áreas que muestran el contenido de los búfers o buffer, en otros editores de texto un búfer vendría a ser un documento o un espacio de trabajo y pueden estar o no asociados con archivos. Puedes dividir Emacs en varias ventanas para visualizar el mismo buffer o varios buffers diferentes. (luego te explicare cómo se hace).
  • El mode line: te muestra información valiosa sobre el modo mayor y los modos menores activos en determinada ventana, información sobre el estado del contenido de cada buffer, posición del cursor, etc. Es posible cambiar cómo se muestra la información en ésta área de Emacs así como también que datos se muestran y cuales no. (luego te explicare cómo se hace).
  • La barra de herramientas o tool bar: como en cualquier otro editor de texto, te presenta atajos para algunas funciones de Emacs como crear un nuevo buffer, visitar un archivo, cerrar un buffer, copiar, cortar, pegar, etc. Al principio yo le daba uso a susodicha barra, pero al tiempo la deje de usar y reclame de vuelta el espacio para cosas de mayor importancia.
  • El mini buffer: el mini buffer es un buffer especial que sirve para ingresar comandos. Usualmente aparece al fondo del cuadro, aunque también puede ocupar un cuadro para sí mismo. Esta area no sirve sólo para ingresar comandos, también sirve para mostrar mensajes al usuario, cuando el mini buffer es usado de esta manera se le llama Área de Eco o Echo Area.

Instalando paquetes iniciales y actualizando existentes

Desde la versión 23 de Emacs existe el paquete package.el, es un gestor de paquetes para Emacs, similar al gestor de paquetes de tu distribución de GNU/Linux. Todo lo que instales desde package.el estará disponible solo para tu cuenta de usuario.

Puedes ejecutar un comando extendido en Emacs para llamar a la lista de paquetes disponibles y así instalar algunos paquetes que necesitaremos para ésta primer guía. Pero el proceso de escribir paso a paso qué paquetes instalar puede ser engorroso. Lo que mejor haremos sera que copies y pegues un fragmento de código Emacs lisp (elisp, desde ahora) en el buffer \*scratch* y le pidas a Emacs que lo evalué, definiendo así primero la lista de fuentes de paquetes y segundo la instalación de algunos de ellos. Para cambiar de buffer, presiona la combinación de teclas C-x b (C se refiere a la tecla CTRL en tu teclado) seguido luego de la tecla x, sueltas ambas (por eso el espacio) y finalmente presionas la tecla b). El área de eco te dirá Switch to buffer (default *scratch*):, ya que por defecto iremos al buffer \*scratch* nada más presione RET (que es lo mismo que decir Enter↵) y Emacs nos dirigirá ahí. Copie y pegue (con M-y (La tecla M se refiere a la tecla ALT izquierdo o ESC de tu teclado)) el siguiente fragmento de código Elisp.

;; definimos las fuentes de paquetes
(setf package-archives (list '("gnu" . "http://elpa.gnu.org/packages/")
                             '("marmalade" . "http://marmalade-repo.org/packages/")
                             '("melpa" . "http://melpa.milkbox.net/packages/")
                             '("org" . "http://orgmode.org/elpa/")))

;; inicializamos package.el
(package-initialize)

;; actualizamos la "base de datos"
(package-refresh-contents)

;; actualizamos org-mode
(package-install 'org)

;; instalamos paquetes
(package-install 'highlight-blocks)
(package-install 'highlight-escape-sequences)
(package-install 'highlight-indentation)
(package-install 'highlight-numbers)
(package-install 'helm)
(package-install 'helm-descbinds)
(package-install 'helm-swoop)
(package-install 'powerline)
(package-install 'pretty-mode)
(package-install 'pretty-mode-plus)
(package-install 'yasnippet)
(package-install 'company)
(package-install 'autopair)
(package-install 'diminish)
(package-install 'dired+)
(package-install 'discover-my-major)
(package-install 'flycheck)

(message "instalación de paquetes terminada!")

Para evaluarlo, use el comando extendido eval-buffer con M-x eval-buffer RET. El proceso puede tardar unos minutos y es posible que Emacs abra otra ventana mostrando información sobre los paquetes que se van instalando, ignora eso. Al terminar, puedes hacer clic sobre esa ventana abierta y presionar q, eso la cerrara.

No es la gran cosa ¿Verdad? aunque quizás nunca hayas escrito una sola linea de código en tu vida pero el fragmento anterior debería de ser comprensible para cualquier persona que hable un mínimo de inglés. Los comentarios que deje en el fragmento deberían de ser suficientes para explicar lo que hace cada parte.

La selección de paquetes que he hecho es, según mi manera de ver, la selección ideal para esta guía. Mi idea es proveer al usuario con nuevas funcionalidades que aumenten su productividad en Emacs, así como la apariencia de ciertas partes, o funcionalidades que se usaran luego en otras entregas de ésta serie.

También hice la introducción al modo en que muchas cosas funcionan en Emacs: con combinación de teclas. No pienses que tienes la imperiosa necesidad de memorizar todas y cada una de las combinaciones de teclas en Emacs, la verdad no es necesario, con el mero uso iras memorizando de manera muscular ciertas combinaciones de teclas. Si olvidaste una combinación determinada puedes recurrir a discover-my-major que abrirá un buffer con la lista completa de combinación de teclas disponibles en el modo mayor que estés usando.

Emacs se puede extender con Elisp

Hay cierta parte de Emacs que es fija, como si estuviese escrito en piedra desde el punto de vista del usuario. Pero otra parte del editor no lo esta. Gran parte de Emacs esta escrito en Emacs lisp, lo que quiere decir que puedes cambiar el comportamiento de muchas partes del editor, o extenderlo para que haga virtualmente lo que quieras, en serio, lo que quieras. Por esta razón yo digo que Emacs puede hacer mil y un cosas. El lenguaje de programación Elisp puede parecer dificultoso con todos esos paréntesis en todas partes, incluso para mi que soy un programador experimentado es confuso a veces y no entiendo muy bien ciertas funciones o partes de la sintaxis del lenguaje. Lo que sé de Elisp lo he ido aprendiendo con la lectura de guías, leyendo código de otros y escribiendo el mío propio. Ya que estoy casado con esta pieza de software lo más conveniente para mi es dominar el lenguaje de programación porque así puedo adaptar Emacs a los nuevos retos que traiga el futuro.

Configurando Emacs

Aquí es donde empieza lo bueno. vamos a ensuciar nuestras manos escribiendo una configuración para el editor. Hay dos formas de hacer esto, la primera es escribiendo todo dentro de un sólo archivo (dentro de ~/.emacs o ~/.emacs.d/init.el) o en un archivo org. También existe la tercera opción que es dividir la configuración en varios archivos Emacs lisp (que tienen extensión .el) cada uno con una porción de la misma, mientras podría parecer que hace fácil el mantenimiento de la configuración, lo cierto es que hace difícil la navegación del mismo porque debes visitar varios archivos para cambiar partes de la configuración.

Entonces lo que haremos sera escribir la configuración en un archivo org. Así es como los chicos cool de hoy día lo hacen (yo lo hago). Las ventajas que provee es una mayor facilidad para navegar en la configuración, facilidad para recoger o expandir partes de la configuración debido a las características de org-mode y la capacidad de ejecutar código de otros lenguajes de programación para hacer cosas concretas (yo, por ejemplo uso unas cuantas lineas de codigo en Python para listar los paquetes que tengo instalado y guardarlo como código Elisp que los instalara en caso de faltar en el sistema donde mi configuración sea usada).

Visitaremos un archivo que aun no existe en tu sistema de archivos, hazlo con C-x C-f ~/.emacs.d/configuracion.org RET.

Lo siguiente es un contenido que aunque opcional, es buena idea que este presente. Copia, pega y modifica lo siguiente:

#+TITLE: el titulo que quieras
#+AUTHOR: tu nombre, sobre nombre o lo que desees
#+EMAIL: tu@email.com
#+OPTIONS: toc:3 num:nil ^:nil
#+STARTUP: showall
#+STARTUP: indent
#+STARTUP: hidestars

Esto establece el titulo del archivo org, su autor, el e-mail del autor, así como unas opciones que modifican la manera en que el archivo se muestra.

Presiona un par de veces RET y luego agrega un asterisco (*) seguido de un espacio en blanco, eso lo que desea significar es que estas agregando un titulo de primer nivel al documento, el nivel del titulo aumento en cuanto más asteriscos tiene. El titulo le puedes colocar como gustes, yo en éste caso le colocare algo original como la configuración. Tu archivo org debe parecerse a esto:

#+TITLE: el titulo que quieras
#+AUTHOR: tu nombre, sobre nombre o lo que desees
#+EMAIL: tu@email.com
#+OPTIONS: toc:3 num:nil ^:nil
#+STARTUP: showall
#+STARTUP: indent
#+STARTUP: hidestars

* La configuración
puedes colocar texto si lo deseas.

de varios párrafos, también. En fin.

Debido a que el modo mayor org-mode automáticamente te muestra el documento indentado puede que no veas el texto debajo de * La configuración pegado a la orilla del fringe izquierdo como en el ejemplo anterior, así que no te preocupes.

Ahora, vamos a crear un par de subtítulos (o títulos de nivel 2), estando en el fondo del buffer presiona otras dos veces RET y luego escribe un asterisco seguido de un espacio en blanco, para hacer ese titulo uno de segundo nivel, presiona la tecla TAB (que es lo mismo decir Tab↹). Emacs es muy inteligente así que no importa cuantas veces presione TAB, cambiara el nivel del encabezado de primero a segundo nivel y viceversa.

Bajo éste encabezado de segundo nivel vamos a agregar una porción de código que vimos anteriormente, así que como titulo colocaremos algo como Fuentes de paquetes para Emacs o lo que gustes. Dejamos dos lineas vacías (que seria lo mismo que presionar dos veces RET) y escribimos <s e seguidamente presionamos TAB para expandir una plantilla de org-mode ¿No es genial como apareció todo ese texto?.

Ahí mismo donde quedó el cursor posicionado luego de la expansión de la plantilla, escriba emacs-lisp, seguidamente presione C-c '. Esto dividirá Emacs en dos ventanas, una de ellas con un buffer diferente dentro del cual podemos escribir código Emacs lisp. Pegue el siguiente código Elisp:

(setf package-archives (list '("gnu" . "http://elpa.gnu.org/packages/")
                               '("marmalade" . "http://marmalade-repo.org/packages/")
                               '("melpa" . "http://melpa.milkbox.net/packages/")
                               '("org" . "http://orgmode.org/elpa/")))

Las etiquetas #+BEGIN_SRC y #+END_SRC demarcan un bloque de codigo, org-mode sabe qué hacer con ese bloque. org-babel, una extension de org-mode, permite embrollar (tangle) esos bloques de codigo en un sólo archivo, lo que buscamos con esta caracteristica es embrollar varios bloques de codigo que luego sera interpretado por Emacs. Esos bloques conforman nuestra configuración.

Dentro del archivo org podemos escribir texto cualquiera, espero lo haya notado, esta característica nos permite guardar anotaciones sobre nuestra configuración o cualquier clase de descripción o texto que queramos. Si usted desea ver un archivo org antes de embrollar sus bloques de código y el archivo que resulta luego de tal embrollo, revise mi mi archivo org y el resultante archivo Emacs lisp.

Hacemos un nuevo subtitulo en el archivo, esta vez para ingresar una configuración de fabrica sana (o sane defaults) para Emacs, el titulo puede ser como usted más guste. Haga lo mismo, <s, luego TAB, luego emacs-lisp y luego C-c ', pegue lo siguiente:

(powerline-center-theme)
;; Elimina elementos de la interfaz. descomentelo cuando se sienta bien hacker
;;(menu-bar-mode -1)
;;(tool-bar-mode -1)
;;(scroll-bar-mode -1)
;;(tooltip-mode -1)
(recentf-mode 1)
(savehist-mode 1)
;; Establece la tipografia que Emacs debe usar. La tipografia debe estar
;; instala en su sistema. Yo uso Source Code Pro porque es una tipografia muy
;; buena para programación.
;;(set-frame-font "SourceCodePro 11")
;;(add-to-list (quote default-frame-alist) (quote (font . "SourceCodePro-11")))
(fset 'yes-or-no-p 'y-or-n-p)
(global-auto-revert-mode 1)
(column-number-mode 1)
(global-subword-mode 1)
(show-paren-mode t)
(delete-selection-mode 1)

(setf
 bookmark-default-file (expand-file-name "bookmarks" user-emacs-directory)
 bookmark-save-flag 1
 inhibit-startup-message t
 initial-scratch-message nil
 line-spacing 1
 make-backup-files nil
 global-auto-revert-non-file-buffers t
 auto-revert-verbose nil
 echo-keystrokes 0.1
 shift-select-mode nil
 byte-compile-warnings '(not nresolved
                           free-vars
                           callargs
                           redefine
                           obsolete
                           noruntime
                           cl-functions
                           interactive-only)
 fill-column 80
 blink-matching-paren nil
 uniquify-buffer-name-style (quote forward)
 recentf-max-saved-items 100
 history-length 1000
 x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)
 enable-recursive-minibuffers t
 gc-cons-percentage 0.125
 ediff-diff-options "-w"
 ediff-split-window-function 'split-window-horizontally
 ediff-window-setup-function 'ediff-setup-windows-plain
 custom-file (expand-file-name "custom.el" user-emacs-directory)
 flyspell-issue-message-flag nil
 )

(set-default 'indent-tabs-mode nil)
(set-default 'indicate-empty-lines t)
(setq-default truncate-lines t)

(prefer-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)

(if
    (boundp 'buffer-file-coding-system)
    (setq-default buffer-file-coding-system 'utf-8)
  (setf default-buffer-file-coding-system 'utf-8))

(load custom-file)

Se puede comentar mucho de este fragmento de código, básicamente activa algunos modos menores, establece nuevos valores por defecto, entre otras cosas. Ciertamente no deseo extenderme mucho acá.

cambiando el comportamiento de algunos modos mayores o menores en Emacs

Los modos mayores o menores hacen uso de algo llamado gancho (hook) el cual es usado para ejecutar código Elisp cuando se activan, resultando así por ejemplo en la activación de modos menores a gusto del usuario, entre otras cosas.

También puedes usar combinaciones de teclas personalizadas a nivel global o a nivel de modo mayor. En el segundo caso, cada modo mayor tiene un keymap o mapa de teclas al cual le puedes asignar una combinación de teclas a determinado comando extendido.

Lo ideal seria agrupar la configuración especifica a cada paquete instalado en Emacs bajo un sólo subtitulo, debido a que pueden ser muchos, lo más seguro es que desearas tenerlos en un mismo lugar.

Como titulo de nivel dos puedes poner modos de Emacs, y por cada configuración agrega un titulo de nivel tres con el nombre del modo o paquete al cual pertenece la configuración.

Luego de que Emacs carga su configuración llama a un gancho llamado after-init-hook, lo que haremos sera pedirle a Emacs que nos active un par de modos mayores y menores. También vamos a asignar un comando extendido a una combinación de teclas de tu preferencia y a nivel global, crea un subtitulo de nivel tres y has lo que ya sabes hacer por los párrafos anteriores, pega lo siguiente en el bloque de código:

(add-hook 'after-init-hook (lambda ()
                             (helm-mode 1)
                             (helm-descbinds-mode)
                             (global-flycheck-mode)
                             (autopair-global-mode)
                             (global-pretty-mode t)
                             (global-company-mode)
                             )
          )

;; establecemos combinaciones de teclas a nivel global para accesar a algunos
;; comandos extendidos desde el teclado. Si alguna combinacion no es de tu
;; agrado, cambiala. Asegurate de que la combinacion de teclas que deseas usar
;; no este ya ocupada, eso lo puedes comprobar presionando la combinación de
;; teclas, si en el area de eco aparece la combinación seguido de `is
;; undefined` entonces la puedes usar.

;; el comando undo hace lo mismo que en cualquier programa hace CTRL+z yo he
;; escojido la combinacion C-ç debido a que uso emacs mayor mente en una
;; portatil, y ademas que la combinación C-z ya esta ocupada.
(global-set-key (kbd "C-ç") 'undo)

;; Mover el cursor entre ventanas es mas facil si haces M-o en lugar de C-x o.
(global-set-key (kbd "M-o") 'other-window)

;; La siguiente combinacion sirve para dividir una ventana a la mitad, ya sea
;; horizontal o verticalmente, sin embargo acá le hacemos un hackeo para que
;; ademas de dividir la ventana, mueva el cursor a la ventana recien creada
(global-set-key (kbd "C-x 2") (lambda ()
                                (interactive)
                                (split-window-vertically)
                                (other-window 1)))

(global-set-key (kbd "C-x 3") (lambda ()
                                (interactive)
                                (split-window-horizontally)
                                (other-window 1)))

;; Al usar la siguiente combinación de teclas, un buffer listando las
;; combinaciones de teclas disponibles se abrira. Util si has olvidado alguna
;; combinación en particular
(global-set-key (kbd "C-h C-m") 'discover-my-major)

¡Muy bien! Puede que hayas aprendido dos combinaciones de teclas nuevas e interesantes, como lo son C-x 2 y C-x 3, pues bien, para hacer que la ventana donde se encuentra el cursor sea más grande y oculte todas las demás ventanas puedes hacer uso de la combinación C-x 1, o si necesitas cerrarla en lugar de maximizarla puedes usar C-x 0.

Y ya que estamos aquí, cabe decir que la combinación de teclas para guardar los cambios hechos en el archivo es C-x C-s.

Los ganchos padres

Los modos mayores o menores suelen llamar a otros ganchos además de los propios. Esto nos permite activar o desactivar otros modos menores para muchísimos modos mayores, si esta característica no existiera, estaríamos repitiéndonos las mismas lineas de código dentro de diferentes ganchos.

Para los modos mayores dedicados a la programación (como python-mode para programar en Python o go-mode para hacerlo en Go) existe un gancho llamado prog-mode-hook. Para los modos mayores dedicados a escribir texto plano (como org-mode para Org mode) existe el gancho text-mode-hook (text-mode es el modo mayor para escribir en puro texto plano). haremos lo mismo que hicismos para el gancho after-init-hook, copia y pega en el sitio adecuado los siguientes fragmentos de código elisp:

(add-hook 'prog-mode-hook (lambda ()
                            ;; Estas variables seran locales al buffer donde el
                            ;; gancho sea activado.
                            (set (make-local-variable 'fill-column) 79)
                            ;; Esta variable local le indica a Emacs que los
                            ;; comentarios que hagamos pongamos en nuestro
                            ;; codigo fuente de cualquier modo mayor de
                            ;; programación se rompa al llegar a la columna
                            ;; 79. Basicamente tu solo te preocupas de escribir
                            ;; el comentario y Emacs te lo acomodara para que
                            ;; quede bonito ;)
                            (set (make-local-variable 'comment-auto-fill-only-comments) t)
                            (auto-fill-mode t)
                            (toggle-truncate-lines)
                            (highlight-numbers-mode)
                            (hes-mode)
                            (highlight-blocks-mode)
                            (hlinum-activate)
                            (hlinum-highlight-current-line)
))

;; redefinimos la tecla RET para que se comporte de otra manera en los modos de
;; programación.
(define-key prog-mode-map (kbd "RET") 'newline-and-indent)
(add-hook 'text-mode-hook (lambda ()
                            ;; la columan limite para los modos que llamen al
                            ;; gancho text-mode-hook pueden ser un poco más
                            ;; largos. 79 es poco.
                            (set (make-local-variable 'fill-column) 110)
                            (auto-fill-mode)
                            ;; tienes que tener instalado ispell instalado en
                            ;; tu sistema sino éste modo menor te causara
                            ;; problemas, comentaló y reinicia emacs si es así
                            (flyspell-mode)
                            ;; flyspell lo que hace es revisar tu
                            ;; ortografia. Lo puedes activar también para que
                            ;; revise la ortografia de cadenas y comentarios en
                            ;; los modos mayores para programación con
                            ;; (flyspell-prog-mode) en el gancho prog-mode-hook
))

Y con esto acabamos con el archivo por hoy. ¡Pero aun falta algo más!

El archivo ~/.emacs.d/init.el

Para que se enrolle los bloques de código de nuestra configuración en un archivo emacs lisp y sea leído por Emacs es necesario agregar unas cuantas lineas de código elisp al archivo init.el, por favor visite el archivo ~/.emacs.d/init.el y pegue lo siguiente:

(package-initialize)
(require 'ob-tangle)
(org-babel-load-file
 (expand-file-name "configuracion.org"
                   user-emacs-directory))

el archivo ~/.emacs.d/custom.el

En Emacs existe otra manera de cambiar la configuración y es desde customize, los cambios que hagas desde ese comando se guardan generalmente en el archivo init.el, sin embargo y para ser más limpios, la nueva ubicación de esos cambios es en ~/.emacs.d/custom.el, así lo definimos en la sección sane defaults más arriba.

Hay un problema, es que cuando el archivo no existe Emacs se quejara con un error y detendrá el cargado de la configuración. Puedes crearlo como mejor veas conveniente. Una manera es visitándolo desde Emacs y salvando el buffer vació.

El aspecto de tu archivo configuracion.org

Llegado a éste punto, tu archivo de configuración originalmente llamado configuracion.org debe tener un aspecto y contenido algo similar al siguiente:

#+TITLE: el titulo que quieras
#+AUTHOR: tu nombre, sobre nombre o lo que desees
#+EMAIL: tu@email.com
#+OPTIONS: toc:3 num:nil ^:nil
#+STARTUP: showall
#+STARTUP: indent
#+STARTUP: hidestars

* La configuración
** Fuentes de paquetes para Emacs

#+BEGIN_SRC emacs-lisp
  (setf package-archives (list '("gnu" . "http://elpa.gnu.org/packages/")
                                 '("marmalade" . "http://marmalade-repo.org/packages/")
                                 '("melpa" . "http://melpa.milkbox.net/packages/")
                                 '("org" . "http://orgmode.org/elpa/")))
#+END_SRC

** Sane defaults
#+BEGIN_SRC emacs-lisp
  (powerline-center-theme)
  ;; Elimina elementos de la interfaz. descomentelo cuando se sienta bien hacker
  ;;(menu-bar-mode -1)
  ;;(tool-bar-mode -1)
  ;;(scroll-bar-mode -1)
  ;;(tooltip-mode -1)
  (recentf-mode 1)
  (savehist-mode 1)
  ;; Establece la tipografia que Emacs debe usar. La tipografia debe estar
  ;; instala en su sistema. Yo uso Source Code Pro porque es una tipografia muy
  ;; buena para programación.
  ;;(set-frame-font "SourceCodePro 11")
  ;;(add-to-list (quote default-frame-alist) (quote (font . "SourceCodePro-11")))
  (fset 'yes-or-no-p 'y-or-n-p)
  (global-auto-revert-mode 1)
  (column-number-mode 1)
  (global-subword-mode 1)
  (show-paren-mode t)
  (delete-selection-mode 1)

  (setf
   bookmark-default-file (expand-file-name "bookmarks" user-emacs-directory)
   bookmark-save-flag 1
   inhibit-startup-message t
   initial-scratch-message nil
   line-spacing 1
   make-backup-files nil
   global-auto-revert-non-file-buffers t
   auto-revert-verbose nil
   echo-keystrokes 0.1
   shift-select-mode nil
   byte-compile-warnings '(not nresolved
                             free-vars
                             callargs
                             redefine
                             obsolete
                             noruntime
                             cl-functions
                             interactive-only)
   fill-column 80
   blink-matching-paren nil
   uniquify-buffer-name-style (quote forward)
   recentf-max-saved-items 100
   history-length 1000
   x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)
   enable-recursive-minibuffers t
   gc-cons-percentage 0.125
   ediff-diff-options "-w"
   ediff-split-window-function 'split-window-horizontally
   ediff-window-setup-function 'ediff-setup-windows-plain
   custom-file (expand-file-name "custom.el" user-emacs-directory)
   flyspell-issue-message-flag nil
   )

  (set-default 'indent-tabs-mode nil)
  (set-default 'indicate-empty-lines t)
  (setq-default truncate-lines t)

  (prefer-coding-system 'utf-8)
  (set-default-coding-systems 'utf-8)
  (set-terminal-coding-system 'utf-8)
  (set-keyboard-coding-system 'utf-8)

  (if
      (boundp 'buffer-file-coding-system)
      (setq-default buffer-file-coding-system 'utf-8)
    (setf default-buffer-file-coding-system 'utf-8))

  (load custom-file)
#+END_SRC

** Configuración por paquetes instalados en Emacs
la configuración respectiva a cada modo o paquete instalado en Emacs.

*** after-init
#+BEGIN_SRC emacs-lisp
  (add-hook 'after-init-hook (lambda ()
                               (helm-mode 1)
                               (helm-descbinds-mode)
                               (global-flycheck-mode)
                               (autopair-global-mode)
                               (global-pretty-mode t)
                               (global-company-mode)
                               )
            )

  ;; establecemos combinaciones de teclas a nivel global para accesar a algunos
  ;; comandos extendidos desde el teclado. Si alguna combinacion no es de tu
  ;; agrado, cambiala. Asegurate de que la combinacion de teclas que deseas usar
  ;; no este ya ocupada, eso lo puedes comprobar presionando la combinación de
  ;; teclas, si en el area de eco aparece la combinación seguido de `is
  ;; undefined` entonces la puedes usar.

  ;; el comando undo hace lo mismo que en cualquier programa hace CTRL+z yo he
  ;; escojido la combinacion C-ç debido a que uso emacs mayor mente en una
  ;; portatil, y ademas que la combinación C-z ya esta ocupada.
  (global-set-key (kbd "C-ç") 'undo)

  ;; Mover el cursor entre ventanas es mas facil si haces M-o en lugar de C-x o.
  (global-set-key (kbd "M-o") 'other-window)

  ;; La siguiente combinacion sirve para dividir una ventana a la mitad, ya sea
  ;; horizontal o verticalmente, sin embargo acá le hacemos un hackeo para que
  ;; ademas de dividir la ventana, mueva el cursor a la ventana recien creada
  (global-set-key (kbd "C-x 2") (lambda ()
                                  (interactive)
                                  (split-window-vertically)
                                  (other-window 1)))

  (global-set-key (kbd "C-x 3") (lambda ()
                                  (interactive)
                                  (split-window-horizontally)
                                  (other-window 1)))

  ;; Al usar la siguiente combinación de teclas, un buffer listando las
  ;; combinaciones de teclas disponibles se abrira. Util si has olvidado alguna
  ;; combinación en particular
  (global-set-key (kbd "C-h C-m") 'discover-my-major)
#+END_SRC
*** prog-mode
#+BEGIN_SRC emacs-lisp
  (add-hook 'prog-mode-hook (lambda ()
                              ;; Estas variables seran locales al buffer donde el
                              ;; gancho sea activado.
                              (set (make-local-variable 'fill-column) 79)
                              ;; Esta variable local le indica a Emacs que los
                              ;; comentarios que hagamos pongamos en nuestro
                              ;; codigo fuente de cualquier modo mayor de
                              ;; programación se rompa al llegar a la columna
                              ;; 79. Basicamente tu solo te preocupas de escribir
                              ;; el comentario y Emacs te lo acomodara para que
                              ;; quede bonito ;)
                              (set (make-local-variable 'comment-auto-fill-only-comments) t)
                              (auto-fill-mode t)
                              (toggle-truncate-lines)
                              (highlight-numbers-mode)
                              (hes-mode)
                              (highlight-blocks-mode)
                              (hlinum-activate)
                              (hlinum-highlight-current-line)
  ))

  ;; redefinimos la tecla RET para que se comporte de otra manera en los modos de
  ;; programación.
  (define-key prog-mode-map (kbd "RET") 'newline-and-indent)
#+END_SRC
*** text-mode
#+BEGIN_SRC emacs-lisp
  (add-hook 'text-mode-hook (lambda ()
                              ;; la columan limite para los modos que llamen al
                              ;; gancho text-mode-hook pueden ser un poco más
                              ;; largos. 79 es poco.
                              (set (make-local-variable 'fill-column) 110)
                              (auto-fill-mode)
                              ;; tienes que tener instalado ispell instalado en
                              ;; tu sistema sino éste modo menor te causara
                              ;; problemas, comentaló y reinicia emacs si es así
                              (flyspell-mode)
                              ;; flyspell lo que hace es revisar tu
                              ;; ortografia. Lo puedes activar también para que
                              ;; revise la ortografia de cadenas y comentarios en
                              ;; los modos mayores para programación con
                              ;; (flyspell-prog-mode) en el gancho prog-mode-hook
  ))
#+END_SRC

Compara con lo que tu tengas en tu archivo y corrige o agrega si es necesario.

Disfrutando de nuestro Emacs tunea y to chungo

Habiendo guardado todos los archivos (para eso existe una combinación de teclas, ¡ja! usa C-x s y ahórrate el paseo de mirar todos tus buffers abiertos), cierra Emacs ya sea desde File o usando las teclas C-x C-c, y finalmente vuélvelo a abrir.

¡Felicidades! Y disfruta Emacs.

Algunas notas finales

Helm-mode

Ahora tienes helm-mode, es un paquete que esta verdaderamente en su propia liga. Lo puedes usar para realizar búsquedas, por ejemplo, cuando vas a cambiar de buffer te mostrara la lista de buffers, y puedes ir eliminando candidatos al escribir el nombre del buffer que deseas ver.

Es posible que te sientas tentado de auto completar algún nombre con la tecla TAB, lo cierto es que esa tecla te mostrara una lista de acciones que puedes realizar sobre la selección de archivos que hayas hecho o sobre el archivo que has seleccionado. Esto es así porque HELM te auto completa de forma automática, aunque en mis pruebas parece que esta característica esta apagada. Para auto completar presiona C-z. Y sí, puedes cambiar la combinación de teclas de vuelta a TAB, pero eso es cuento para una próxima guía.

Temas para Emacs

Desde hace unas cuantas versiones Emacs posee una serie de diferentes temas, hay de colores muy variados, así que no sera difícil encontrar uno que te guste. Emacs ya trae algunos temas, los puedes revisar de uno en uno con M-x load-theme RET.

Si esos temas no te gustan, puedes probar los que vienen en el paquete sublime-themes, puedes instalar ese paquete con M-x package-install RET sublime-themes RET. Si deseas cargar un tema en especifico al iniciar Emacs, lo puedes conseguir con las siguientes instrucciones:

(load-theme 'brin t) ;; brin es un tema del paquete sublime-themes

Cancelar un comando o su ejecución

Para cancelar la ejecución de un comando, o un comando cualquiera que espera ordenes, puedes usar la combinación de teclas C-g, así de simple.

¿Donaciones?

Escribir esta guía me ha tomado una verdadera cantidad de tiempo y esfuerzo (mis dedos duelen ;) si deseas agradecerme de manera especial, no me quejare :)

Paypal

<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top"> <input type="hidden" name="cmd" value="_s-xclick"> <input type="hidden" name="hosted_button_id" value="8AEFX38J24746"> <input type="image" src="btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal, la forma más segura y rápida de pagar en línea."> <img alt="" border="0" src="pixel.gif" width="1" height="1"> </form>

Okpay

<form method="post" action="https://www.okpay.com/process.html"><input type="hidden" name="ok_receiver" value="OK451899253"/> <input type="hidden" name="ok_item_1_name" value="Guias Emacs"/> <input type="hidden" name="ok_currency" value="USD"/> <input type="hidden" name="ok_item_1_type" value="donation"/> <input type="image" name="submit" alt="OKPAY Payment" src="https://www.okpay.com/img/buttons/en/donate/d10o121x47en.png%22/></form>

¡Cryptomonedas!

<script src="http://coinwidget.com/widget/coin.js"></script> <script> CoinWidgetCom.go({ wallet_address: "LKy5Kto1dw39kvWWTS91zrTYqf3wRwgV3o" , currency: "litecoin" , counter: "count" , alignment: "bl" , qrcode: true , auto_show: false , lbl_button: "Donar" , lbl_address: "Mi dirección Litecoin:" , lbl_count: "donaciones" , lbl_amount: "LTC" }); </script>

<script src="http://coinwidget.com/widget/coin.js"></script> <script> CoinWidgetCom.go({ wallet_address: "1En3JBzQdMUSeGDusmGfFeCoSA8UnEWSz2" , currency: "bitcoin" , counter: "count" , alignment: "bl" , qrcode: true , auto_show: false , lbl_button: "Donar" , lbl_address: "Mi dirección Bitcoin:" , lbl_count: "donaciones" , lbl_amount: "BTC" }); </script>

/