Índice
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:
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
# --
lastmod = "`(format-time-string "%Y-%m-%dT%H:%M:%S+01:00")`"$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:
lastmod = "2017-03-08T16:58:45+01:00"
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:
- Ejecutar
M-x find-name-dired
: e introducir el directorio en el que están los ficheros. - Pulsar
t
para “marcar” todos los ficheros del directorio. - Pulsar
Q
para ejecutar el comandoquery-replace
para todos los ficheros marcados. - 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, oA
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:
C-x r k
: Kill el texto de la región seleccionada.C-x r d
: Borra el texto de la región seleccionada.C-x r y
: Pega (Yank) la última región borrada (Con kill)C-x r o
: Inserta espacios en blanco para rellenar el espacio de la región seleccionada.M-x clear-rectangle
: Reemplaza la selección con espacios.M-x delete-white-spaces-rectangle
: Elimina los espacios en blanco a la izquierda.C-x r t string RET
: Reemplaza el contenido del rectángulo con string en cada línea. (El ejemplo visto)M-x string-insert-rectangle RET string RET
: Inserta string en cada línea del rectángulo.
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:
- Pulsar
M-x replace-string
. - Introducimos el texto que queremos reemplazar, en este caso
^N
. - Insertamos el salto de línea, para ello, pulsar:
C-q
: Para decirle a emacs que vamos a insertar un caracter en crudo (raw).C-j
: Esta combinación se corresponde con el salto de línea
- 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:
- Pulsar
t
, para seleccionar todos los ficheros. - Pulsar
S
, para guardar los ficheros seleccionados
Fuente: Execute a particular command on multiple emacs buffers
Alinear verticalmente código en base al signo =
M-x align-regex =
Convertir texto a mayúscula/minúscula
C-x C-u
: Convertir la región seleccionada a mayúsculas.C-x C-l
: Convertir la región seleccionada a minúsculas.M-l
: Convertir la siguiente palabra a minúscula.M-u
: Convertir la siguiente palabra a mayúscula.M-c
: Convertir a mayúscula la primera letra de la palabra – Capitalizar –.
Reemplazar tabulador por espacios y viceversa
M-x tabify
: Sustituye en la región seleccionada espacios por tabuladores.M-x untabify
: Proceso contrario, reemplaza en la región selecionada tabuladores por espacios.
Fuente: mdk.fr
Prelude
Tal y como dice la descripción de su repositorio en Github:
Prelude is an enhanced Emacs 24 distribution that should make your experience with Emacs both more pleasant and more powerful.
es decir:
Prelude es una distribución mejorada de Emacs 24 que debería hacer tu experiencia con emacs más agradable y potente.
Aunque la descripción menciona la versión 24, personalmente yo estoy usando la versión 25 en Gentoo y funciona perfectamente.
La instalación de Prelude es muy sencilla, toda la documentación necesaria se encuentra en su repositorio de Github.
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 Request.
Esperamos vuestras colaboraciones!
¿Has visto algún error?: Por favor, ayúdame a corregirlo contactando conmigo o comentando abajo.