No es la primera vez que se publica en el blog una chuleta de algo:



La de hoy va sobre Emacs. La idea es que esta chuleta la creemos entre todos. Que cada uno aporte su granito de arena para crear la chuleta de atajos de teclado/comandos/paquetes para emacs definitiva.

A lo largo del poco tiempo que llevo usando emacs, ya he ido descubriendo los atajos que me resultan más útiles para mi día a día, empecemos:

Índice

Paquetes útiles

Yasnippet

YaSnippet es un sistema de plantillas para emacs, es uno de los paquetes que recomiendo instalar, ya que te facilita mucho la vida. Por defecto ya trae configurados muchos snippets para todos los lenguajes, pero podemos configurar más a nuestro gusto. Por ejemplo:

Una de las plantillas que tengo para escribir en el blog es:

# -*- mode: snippet -*-
# name: Modified
# key: mod
# --
modified: 2016-$1-$2T$3:$4$0

En los comentarios se especifica el nombre del snippet, la palabra que lo lanzará (mod) en este caso. Así, al escribir mod y pulsar el tabulador se insertará en el editor:

modified: 2016-$1-$2T$3:$4$0

Y con el tabulador me podré ir moviendo a los distintos $n que ahí se ven. Otro ejemplo:

# -*- mode: snippet -*-
# name: CodeBlock
# key: code
# --
\`\`\`$1
$2
\`\`\`

Este otro snippet lo uso para insertar código en Markdown, al escribir code y pulsar el tabulador, me inserta en el texto las tres tildes ``` con el cursor situado en $1 para que escriba el lenguaje en el que resaltará la sintáxis, y al volver a pulsar el tabulador el cursor se posiciona dentro del bloque de código para que comience a escribir.

Miscelánica / Taréas habituales

Buscar y reemplazar en varios ficheros

Problema:

Queremos buscar por una expresión regular o un texto simple en varios ficheros a la vez, o un directorio completo, y reemplazar el texto encontrado por otro.

Solución:

  1. Ejecutar M-x find-name-dired: e introducir el directorio en el que están los ficheros.
  2. Pulsar t para “marcar” todos los ficheros del directorio.
  3. Pulsar Q para ejecutar el comando query-replace para todos los ficheros marcados.
  4. Una vez escrita la expresión regular, se nos pide confirmación para cada fichero, podemos pulsar espacio para reemplazar la expresión en el fichero, n para descartarla, o A para reemplazar la expresión en todos los ficheros.

Fuente: Using Emacs to recursively find and replace in text files not already open

Selección rectangular

Problema:

A veces queremos seleccionar una región de texto y realizar una acción sobre ella, por ejemplo eliminar espacios en blanco, añadir algún texto delante de cada frase etc.

Solución:

Supongamos que tenemos el siguiente texto:

línea 1
línea 2
línea 3
línea 4

Y queremos transformarla a:

- línea 1
- línea 2
- línea 3
- línea 4

Para ello seleccionamos la región, y pulsamos C-x r t, nos preguntará qué texto queremos introducir, le damos a enter y listo. Otras combinaciones para operar en selecciones rectangulares:

Fuente: GNU Emacs Manual

Reemplazar un carácter con un salto de línea

Problema:

Supongamos que tenemos un texto mal formateado, y queremos reemplazar un caracter en concreto por un salto de línea. Esto suele pasar por ejemplo al leer ficheros con codificaciones distintas. En los que el salto de línea se interpreta de otro modo. A modo de ejemplo, supongamos que vamos a reemplazar el caracter ^N por un salto de línea. Tenemos este texto:

Lorem ipsum dolor sit amet^N, consectetur adipiscing elit.^N Fusce vestibulum.

Solución:

  1. Pulsar M-x replace-string.
  2. Introducimos el texto que queremos reemplazar, en este caso ^N.
  3. Insertamos el salto de línea, para ello, pulsar:
    1. C-q: Para decirle a emacs que vamos a insertar un caracter en crudo (raw).
    2. C-j: Esta combinación se corresponde con el salto de línea
  4. Pulsamos Enter y deberíamos tener el siguiente texto:
Lorem ipsum dolor sit amet
, consectetur adipiscing elit.
 Fusce vestibulum.

Fuente: How to replace a character with a newline in Emacs?

Eliminiar los espacios en blanco sobrantes al final de una línea

Basta ejecutar M-x delete-trailing-whitespace.

Guardar comandos que usamos usualmente

Este tema se trató en más profundidad en el artículo Cómo crear comandos personalizados en Emacs.

Administar las copias de seguridad de emacs

Problema:

Emacs por defecto guarda una copia de seguridad del fichero en un fichero del mismo nombre pero acabado en ~, aunque es bastánte útil, a veces molesta tener ficheros desperdigados a lo largo de las carpetas acabando en ~. Es posible almacenarlos todos en una carpeta. Veamos.

Solución:

En el fichero de configuración (~/.emacs/init.el) añadimos

;; Set a directory for backup files
(setq backup-directory-alist `(("." . "~/.saves")))
(setq delete-old-versions t
    kept-new-versions 6
    kept-old-versions 2
    version-control t)

Donde podemos sustituir ~/.saves por el directorio deseado.

Fuente: How do I control how Emacs makes backup files?

Ejecutar una acción para todos los buffers abiertos

Problema:

Algunos comandos que hemos visto aquí, como buscar y reemplazar texto en varios ficheros a la vez, realizan la acción pero no guardan los cambios en el fichero. Para guardarlos tenemos que seleccionarlos uno a uno en el buffer y ejecutar la acción de guardar. Para hacernos la vida más fácil, podemos usar ibuffer

Solución:

Para sustituir el modo buffer, por ibuffer debemos añadir a nuestra configuración:

;; make ibuffer the default
(global-set-key "\C-x\C-b" 'ibuffer) 

A partir de ahora, cada vez que visitemos la pestaña del buffer, se abrirá ibuffer. Para seleccionar todos los ficheros abiertos y guardarlos:

  1. Pulsar t, para seleccionar todos los ficheros.
  2. Pulsar S, para guardar los ficheros seleccionados

Fuente: Execute a particular command on multiple emacs buffers

Alinear verticalmente código en base al signo =

Convertir texto a mayúscula/minúscula

Reemplazar tabulador por espacios y viveversa

Fuente: mdk.fr

Tu Turno

El propósito de este artículo es que crezca con las contribuciones de todos nosotros, para ello he subido el código de este artículo a github. Para aportar vuestro granito de arena, mandad Pull Requests al siguiente gist: Chuleta De Comandos/Atajos De Teclado/Paquetes/ más útiles para Emacs.md

Esperamos vuestras colaboraciones!