Skip to main content
By Pablo
Machón
Pablo Machón is a self taught, dedicated technologist.
Así se hace
Emacs
Fácil
Iniciación

Configuración de Emacs 1

Configuración de emacs, paso a paso

El objetivo es construir una configuración completa de emacs para todo tipo de tareas. Se va desarrollando un archivo de configuración poco a poco, comprendiendo los diversos aspectos del editor.

El plan de trabajo

Se crea un archivo en org-mode, el modo de edición de texto enriquecido de emacs. Ese archivo, de nombre emacs-configuration-org, creará y actualizará automáticamente los diversos archivos en que consiste la configuración efectiva. Es decir, se crea un archivo que a su vez genera otros archivos, y que incluye información sobre el proceso. Este mecanismo se denomina «programación literaria», inventada por Donald Knuth, y sirve para poder acumular el código y ciertas explicaciones, referencias y documentación, todo en un imsmo lugar. Org-mode incluye ese mecanismo, al que denomina tangle. Crearemos el archivo emacs-configuration-org para que funcione de ese modo, «haciendo tangle» automáticamente al grabar.

Inicialmente el archivo emacs-configuration-org va a generar dos archivos: bin/e, un script o programa que «lanzará» el emacs; y etc/init.el, el archivo de configuración que se carga y ejecuta cada vez que emacs se inicia.

Creación de la estructura de carpetas del proyecto

Se crea una carpeta de nombre Projects/emacs. Desde un terminal:

mkdir -p ~/Projects/emacs

Nos desplazamos a esa carpeta:

cd ~/Projects/emacs

Una vez en ella, creamos el resto de la estructura:

mkdir ./src ./bin ./etc ./var

Podemos comprobar que se ha creado la estructura

tree .

El resultado debe ser algo como:

Projects/
└── emacs
    ├── bin
    ├── etc
    ├── src
    └── var

El archivo src/emacs-configuration.org

El archivo principal que dará origen a los demás es emacs-configuration.org, dentro del directorio src.

1: #+title Configuracion de Emacs
2: #+auto_tangle: t
3: #+PROPERTY: header-args:emacs-lisp :tangle "../etc/init.el" :mkdirp yes
4: 
5: * Configuración de Emacs
6: Archivo de documentación y generación de la configuración de emacs.
7: 

El archivo se inicia con el título. A continuación, una línea para activar la generación automática de archivos cuando se graba. Finalmente, la definición de los datos necesarios relativos al archivo generado principal para bloques de tipo emacs-lisp, que será init.el y estará en la ruta correspondiente: ../etc/ (hay que tener en cuenta que el archivo que se está escribiendo está en Projects/emacs/src/, por lo tanto para llegar a Projects/emacs/etc/ hay que indicar ../etc/). Con :mkdirp yes se indica que deben crearse los subdirectorios indicados que no existan.

Inmediatamente después se incluye un bloque especial de programa en bash, que será el comando utilizado para iniciar el emacs:

  ** Archivo de ejecución de emacs
  Con este script de bash se inicia el emacs, ajustando los directorios y configuraciones. El script se aloja en el directorio =bin/=, y la sintaxis de uso es:

  #+BEGIN_EXAMPLE
  bin/e archivo_a_editar.txt
  #+END_EXAMPLE

  #+begin_src bash-script :tangle ../bin/e :mkdirp yes :tangle-mode (identity #o755)
  #!/bin/bash
  # Emacs startup script

  #################################################
  #  vars
  emacs_bin=/usr/bin/emacs
  emacs_base=~/Projects/emacs
  emacs_home=${emacs_base}/var
  emacs_init_el=${emacs_base}/etc/init.el

  bin=${emacs_bin}

  #################################################
  # run basic emacs

  ${bin} \
      --init-directory=${emacs_home}\
      --debug-init\
      -q --no-site-file --load "${emacs_init_el}"\
      $@ &

#+end_src

En este bloque se incica que debe grabarse como ../bin/e, y que será ejecutable (permisos 0755). También se indica que si ../bin/ no existe, debe crearse.

El programa, escrito en bash, simplemente inicia el programa emacs utilizando la configuración que se va a generar en ../etc/init.el, y utilizando como base interna el directorio ../var/. En ese directorio se almacenarán todos los paquetes de emacs que se instalen, así omo todo tipo de archivos auxiliares.

También se indica --debug-init al iniciar emacs, para se notifique cualquier error al arrancar.

Por último, un nuevo bloque de código en emacs lisp será el inicio de la configuración de emacs:

** Configuración de emacs
El archivo =etc/init.el= se cargará al iniciar emacs.
#+begin_src emacs-lisp
  ;; Emacs Configuration
  (message "Hello World!")
#+end_src

Este bloque no tiene datos para su grabación en archivo separado, por lo tanto utiliza los datos por defecto especificados al principio: se grabará en ../etc/init.el

primera generación de archivos

Dado que todavía no s eha creado el sistema de generación o actualización e archivos para cada vez que se grabe, se debe realizar todo a mano por el momento. En emacs, pulsar las teclas M-x y luego teclear org-babel-tangle, RETURN . En la consola se puede comprobar qu elos dos archivos se han creado:

tree .

El resultado debe ser algo como:

Projects/
└── emacs
    ├── bin
    │   └── e
    ├── etc
    │   └── init.el
    ├── src
    │   └── emacs-configuration.org
    │   └── emacs-configuration.org~
    └── var

El archivo emacs-configuration.org~ es una copia de seguridad que emacs genera automáticamente al editar un archivo.

Se puede salir de emacs con C-x C-c, e iniciarlo de nuevo, pero ya con nuestra configuración, con:

bin/e src/emacs-configuration.org

Emacs screen after first successful initialization
Emacs screen after first successful initialization

UI

La pantalla aparece partida por la mitad, y en su parte inferior muestra un texto de bienvenida. Para desactivarlo, creamos una sección «UI», en el archivo de configuración, dedicada a los aspectos de la interacción con el usuario.

** UI: interacción
En este bloque se configuran los aspectos visuales y de interacción con el usuario.

#+begin_src emacs-lisp
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; UI

;; inhibit initial screens
(setq inhibit-splash-screen t
      inhibit-startup-screen t)

#+end_src
(defun hello ()
  "Says hello."
  (message "Hello, world!"))