Más baterías incluidas por defecto en Emacs
(karthinks.com)- Las funciones básicas de Emacs incluyen muchas herramientas que pueden usarse sin paquetes adicionales pero que no son muy visibles, y aun en Emacs moderno 28.1+ se siguen descubriendo funciones prácticas que se pueden aprender en menos de 5 minutos
- Tareas cotidianas como abrir archivos, recopilar URL, comparar y rastrear cambios pueden resolverse en gran medida solo con
find-file,dired,ffap-menu,compare-windowsyhighlight-changes-mode - Los archivos de respaldo y los archivos de control de versiones pueden agruparse en un mismo modelo de trabajo de comparar con una versión anterior ampliando la familia de comandos
vc-diff - Las tareas de edición, navegación y visualización mejoran rápidamente con funciones ya incluidas como la familia
apropos,find-function-on-key,kmacro-edit-lossage,subword-modey los keymaps de manipulación de imágenes - La idea central es que, aunque el directorio
lispde Emacs no sea enorme, todavía queda mucho margen para ampliar el flujo de trabajo solo con las funciones integradas por defecto
Resumen y alcance
- Las funciones de Emacs tienen un problema de descubribilidad, y este artículo intenta reducirlo mostrando una por una funciones integradas útiles pero poco conocidas
- Este es el tercer artículo sobre funciones útiles pero menos conocidas incluidas por defecto en Emacs
- “Menos conocidas” es un juicio subjetivo y, a grandes rasgos, significa funciones mencionadas menos de cinco veces o nunca vistas en 20 años de seguir el discurso en línea sobre Emacs
- A los usuarios nuevos de Emacs no les conviene empezar por aquí; esta lista se vuelve más útil después de familiarizarse con los conceptos básicos y los paquetes más recomendados
- Los criterios son usar solo Emacs puro sin paquetes, evitar curvas de aprendizaje pronunciadas, excluir funciones de juguete y las que se mencionan con frecuencia, y asumir Emacs moderno 28.1+
Diccionario al pasar el mouse: M-x dictionary-tooltip-mode
- Al activar
dictionary-tooltip-mode, se puede ver el significado de una palabra en un tooltip al pasar el mouse sobre ella - También debe estar activado
tooltip-mode, pero viene habilitado por defecto - Si hay un diccionario local configurado, se usa primero; el diccionario de Emacs normalmente también puede encontrar términos modernos y jerga a través de Wiktionary
Comodines en find-file y dired
- También se pueden usar comodines al usar
find-fileydiredde forma interactiva - Si se usa un patrón como
*foo*.txtenfind-file, se pueden abrir varios archivos a la vez - Al abrir un directorio en Dired, si se especifica un comodín de nombre de archivo, se puede crear una lista personalizada con solo ciertos archivos
- El flujo de ejemplo consiste en buscar archivos temporales de AucTeX en subdirectorios con el patrón
*/*_region_*, seleccionarlos en Dired y borrarlos, y luego volver a usar un comodín para abrir varios archivos TeX de los subdirectorios - Esta función se aprecia en la firma de la función al llamarla desde código, pero para notar que también puede usarse de forma interactiva normalmente hay que leer el docstring completo
- La función de comodines de Dired puede verse desplazada por flujos modernos de Dired creados con
consult-findyembark-export, pero funciona de inmediato en la configuración base
Lista de URI dentro del buffer: M-x ffap-menu
ffapes la función de find-file-at-point que comprueba si la posición del cursor corresponde a una ruta de archivo o URL válida y permite abrirlaffap-menurecorre todo el buffer y ofrece una lista de elementos que parecen rutas de archivo o URL- Como usa la interfaz
completing-read, se puede exportar la lista filtrada de candidatos a un buffer, o copiar, abrir o procesar con Embark una parte o el total -
Listar enlaces con propiedades
- Algunas aplicaciones de Emacs, como EWW, insertan las URL como propiedades de texto en lugar de enlaces de texto plano, y
ffap-menuno las detecta - Para compensarlo, se puede usar un comando personalizado inspirado en
ffap-menuque también recopile la propiedad de textoshr-url - El comando de ejemplo
my/search-occur-browse-urlestá configurado para buscar tanto la expresión regular normal de URL como la propiedadshr-url, convertirlas en candidatos de autocompletado y abrir la URL elegida conbrowse-urlobrowse-url-generic
- Algunas aplicaciones de Emacs, como EWW, insertan las URL como propiedades de texto en lugar de enlaces de texto plano, y
Comparación de ventanas: M-x compare-windows
- Emacs tiene muchos comandos de comparación, como
diff,diff-buffers,diff-backup,dired-diff,vc-diffy varios comandosediff-* compare-windowscompara el texto desde la posición del cursor en dos ventanas, se detiene en el siguiente punto de discrepancia y lo informa- Los objetos de comparación son la ventana activa y la que seleccionaría
other-window; tiene menos funciones que Ediff o diff, pero es más fácil y rápido de ejecutar - Compara únicamente el texto real visible en las dos ventanas, sin importar el tipo de buffer, el estado de modificación, el archivo o el estado de control de versiones
- Si se muestran distintas partes del mismo buffer en dos ventanas, también se pueden comparar dos fragmentos de texto dentro del mismo buffer
- También puede comparar listados de directorio, y en el ejemplo la primera discrepancia detectada es la hora de modificación del archivo
- Si se le da un argumento prefijo, puede ignorar diferencias de espacios en blanco
Comparar directorios con Dired: M-x dired-compare-directories
dired-compare-directoriespregunta en Dired qué directorio comparar y marca en las dos listas de Dired los archivos cuyos nombres difieren- Este enfoque puede cubrir el caso de uso más común al comparar directorios
- Como es una comparación a nivel de archivo, se pueden dar condiciones de coincidencia personalizadas que incluyan atributos del archivo como hora de modificación o tamaño
- La condición
(> mtime2 mtime1)puede marcar los archivos modificados más recientemente - La condición
(/= size1 size2)puede marcar archivos con el mismo nombre pero distinto tamaño - Si se necesita una comparación más interactiva, también puede usarse
ediff-directories
Resaltar cambios en el buffer: M-x highlight-changes-mode
highlight-changes-modees una función para resaltar los puntos donde cambió un archivo, y puede usarse como alternativa “en vivo” a comandos diff comodiff-buffer-with-file- Su comportamiento por defecto resalta los cambios desde que el modo se activa hasta que se desactiva; no resalta automáticamente solo los cambios no guardados
- Si se usan
before-save-hookyafter-save-hook, se puede crear un flujo que desactive el resaltado antes de guardar y lo vuelva a activar después, de modo que solo se resalten los cambios previos al guardado - El código de ejemplo activa
highlight-changes-modeen buffers de archivo desdetext-mode-hooky ajusta el estado del resaltado con hooks antes y después de guardar - Si se convierte en una forma independiente de
highlight-unsaved-mode, pasa a ser un modo menor que resalta todos los cambios hasta guardar - Con
highlight-changes-next-changeyhighlight-changes-previous-changese puede ir al siguiente o al anterior punto de cambio - Con
highlight-changes-remove-highlightse puede quitar el resaltado visual y usar solo la navegación basada en el seguimiento de cambios
Hacer que los archivos de respaldo sean realmente útiles: familia vc-diff
-
El problema de los respaldos de Emacs
- Emacs crea periódicamente, por defecto, respaldos de los archivos que editas y guardas
- Este sistema de respaldos suele mencionarse como una molestia que hay que desactivar con
make-backup-files - Puede haber preocupaciones de seguridad si archivos sensibles se copian a otro lugar del disco
- Fuera de eso, el problema principal es que los respaldos quedan dispersos en el directorio de trabajo y falta una UI fácil para revisarlos o manejarlos
- Con opciones de usuario como
backup-directory-alist,kept-old-versionsykept-new-versionsse puede ajustar la ubicación de los respaldos y cuántos conservar - El paquete externo
backup-walkerofrece una interfaz para explorar respaldos como si fuera un viaje en el tiempo
-
Extender la interfaz de VC
- El paquete VC integrado en Emacs ofrece una interfaz para ver versiones anteriores de archivos bajo control de versiones
vc-diffhace diff del archivo contra la versión inmediatamente anterior o una versión especificadavc-ediffejecuta Ediff contra la versión inmediatamente anterior o una versión especificada del archivovc-revision-other-windowmuestra la versión anterior inmediata o una versión pasada especificada junto al archivo actual- Esta interfaz no está limitada a Git, pero no funciona con archivos que no están bajo control de versiones
- Si se sobrecargan los tres comandos de VC, se pueden unificar buffers sin guardar, archivos versionados y respaldos de archivos no versionados bajo el modelo de “comparar con una versión anterior”
- En archivos sin guardar,
vc-diffyvc-ediffcomparan el buffer con el archivo - En archivos versionados,
vc-diff,vc-ediffyvc-revision-other-windowse ejecutan tal como están - En archivos no versionados, comparan o muestran el respaldo con número más reciente, o el respaldo numerado elegido con un argumento prefijo
Familia apropos
describe-key, es decirC-h k, es una tecla de ayuda muy útil porque permite ver directamente qué función invoca una combinación de teclas- Como segunda función de ayuda para aprender,
aproposes muy potente y sirve como puerta de entrada para entender cómo están organizadas las funciones de Emacs cuando no sabes qué buscar aproposno es un solo comando, sino una familia de comandos de búsqueda especializados comoapropos-library,apropos-function,apropos-command,apropos-variable,apropos-user-option,apropos-documentationeinfo-apropos- La configuración de ejemplo agrupa estos comandos bajo un keymap en
C-h apara reemplazarapropos - Incluso sin un asistente como
which-key, al presionarC-hdespués de la tecla prefijoC-h apuedes ver la lista de comandos disponibles customize-aproposcrea un buffer de customize personalizado que reúne opciones, faces y grupos que coinciden con el término de búsqueda
Herramientas find-func: M-x find-function-on-key, M-x find-function
- Si no te gusta un keybinding o quieres saber cómo funciona, puedes ir a la definición del comando que esa tecla invoca para leer su comportamiento o modificarlo
- El flujo habitual es verificar primero qué comando invoca la tecla con
describe-keyoC-h k, y luego presionarspara ir al código fuente find-function-on-keyreduce ese segundo paso y va directamente desde el keybinding al código fuente de la función- La configuración de ejemplo vincula
C-h M-kafind-function-on-keydentro dehelp-map
copy-from-above-command y duplicate-dwim
- En Emacs se agregaron recientemente varios comandos para duplicar texto que muchos usuarios ya venían usando desde hace mucho tiempo
copy-from-above-commandcopia texto de la primera línea no vacía por encima de la línea actual, y es parecido aC-yde Vimduplicate-dwimcopia la línea actual o la región activa debajo de la línea actual, y se parece ayy<N>pde Vimcopy-from-above-commandcopia tantos caracteres como indique el argumento prefijo desde la línea superior, pero el advice de ejemplo cambia el argumento prefijoC-upara que signifique “copiar toda la línea superior y comentarla”- Si usas un argumento prefijo numérico
C-<N>, puedes seguir copiando como antes una cantidad determinada de caracteres desde arriba duplicate-dwimrequiere elegir si, tras duplicar, el cursor debe quedarse en el original o moverse al duplicado, y eso puede definirse con una opción de usuario- La configuración de ejemplo establece
duplicate-region-final-positionyduplicate-line-final-positionen-1, para que el cursor y la región se muevan al texto duplicado
Convertir el historial de teclas en una macro: M-x kmacro-edit-lossage
- Las macros de teclado de Emacs pueden capturar y reproducir no solo transformaciones de texto, sino cualquier secuencia de acciones en Emacs, incluyendo clics del mouse
- Las macros de teclado son potentes, pero implican una carga cognitiva porque hay que anticipar la posibilidad de repetición antes de empezar a grabar y realizar una acción generalizada sin errores
- El comando
.de Vim y el paquetedot-modede Emacs alivian el problema de repetir ediciones, pero su alcance no es el mismo que el de una macro de teclado completa view-lossage(C-h l) muestra el historial de las últimas ~300 pulsaciones de teclaskmacro-edit-lossagepermite convertir ese historial de teclas en una macro en cualquier momento- En realidad, lossage se puede editar, así que al crear una macro puedes insertar comandos nuevos dentro del historial
- Las macros ya definidas pueden editarse más a menudo con
edit-kbd-macro(C-x C-k e), perokmacro-edit-lossagees útil en situaciones poco frecuentes para volver repetible una tarea compleja que acabas de hacer - Para crear una macro generalizable, muchas veces hay que insertar una llamada a
kbd-macro-querydentro de lossage
subword-mode, superword-mode y gramática de palabras
- Los comandos de movimiento y edición basados en palabras de Emacs usan la syntax table de cada major mode, y el usuario puede ajustar qué se considera una palabra
- En
subword-mode, cada componente de un símbolo CamelCase se trata como una palabra - Por ejemplo,
GtkWindowse divide enGtkyWindow,EmacsFrameClassenEmacs,Frame,Class, yNSGraphicsContextenNS,Graphics,Context - En
superword-mode, símbolos snake_case comothis_is_a_symbolse tratan como una sola palabra - En el uso real, como los comandos
*-sexpya ofrecen buen soporte para manipular símbolos,superword-moderesulta menos útil quesubword-mode - Modificar la syntax table de un major mode por apenas unos minutos puede reducir molestias en el movimiento estructural
- En contextos de la familia Lisp, si
:se convierte en un carácter constituyente de palabra, es más fácil manejar keywords como:fooconbackward-kill-word - En Org mode, se puede cambiar el comportamiento para tratar los delimitadores
=y~como caracteres constituyentes de palabra - La forma de especificar la sintaxis de caracteres puede revisarse en
describe-syntax(C-h s) ymodify-syntax-entry
Manipular la visualización de imágenes
- En casi cualquier lugar donde Emacs muestre una imagen, puedes poner el cursor sobre ella y presionar
ipara manipular su visualización - La misma manipulación puede usarse también en la vista previa de enlaces de imagen de Org mode y en las imágenes dentro del buffer de entradas de Elfeed
i +ei -sirven para acercar y alejar, yi rrota la imagen 90 grados- También puedes recortar la imagen con
i c, y las teclas detalladas se pueden ver conM-x describe-keymap RET image-map - También se puede usar el atajo
C-<wheel>conocido de navegadores y otras aplicaciones - Si usas
repeat-mode, después de la primera invocación puedes repetir+,-orsin el prefijoi - Esta función se ofrece mediante un keymap sobre la imagen y no requiere activación aparte
- Lo que se manipula no es el archivo de imagen en disco, sino solo el estado de visualización
- En páginas web y buffers HTML renderizados,
z(shr-zoom-image) divide la imagen en varias franjas horizontales y va alternando el tamaño para aliviar las limitaciones al mostrar imágenes grandes
Mostrar todo el texto: M-x visible-mode
- Emacs puede hacer que el texto del búfer sea invisible de forma selectiva, y esta función es la base del plegado en cosas como las secciones de Magit, Outline mode y Org mode
- Los modos que ofrecen plegado normalmente también dan atajos de teclado para cambiar el estado del plegado, y
TABsuele funcionar - Si te cuesta aprender los atajos de cada modo o no los usas con suficiente frecuencia, puedes ver todo el texto oculto con
visible-mode visible-modedesactiva la invisibilidad del texto en todo el búfer y, al ejecutarlo otra vez, restaura el estado anterior de invisibilidad- En búferes con una UI de plegado dinámica, la pantalla puede verse rota mientras
visible-modeestá activado - Esta función se parece más a una medida temporal o a una herramienta de depuración, pero permite revelar de manera uniforme todo el texto del búfer con un solo comando
Ignorar texto invisible: isearch-toggle-invisible
- Algunos comandos de Emacs, como Isearch, ignoran por defecto la invisibilidad del texto para que sea fácil buscar en todo el documento real
- Cuando el estado visible del búfer sirve como guía de navegación, una búsqueda que revela automáticamente texto plegado puede comportarse de forma distinta a lo esperado
- Si usas Isearch como herramienta de navegación más que de búsqueda, moverte a una coincidencia dentro de una región plegada puede ser un problema
- Durante Isearch puedes alternar si se busca en texto invisible con
isearch-toggle-invisible, enlazado aM-s i - En el ejemplo, se buscó
zeropara ir al último encabezado de un documento Org, pero saltaba a una coincidencia dentro de una región plegada; al volver a buscar y presionarM-s i, solo se movió entre coincidencias dentro del texto visible - Las teclas para alternar el comportamiento de Isearch están bajo el keymap
M-s, que corresponde al binding básicoC-s
Regla: M-x ruler-mode
- En Emacs quedan funciones como los comandos
center-*como rastro de sus antiguas capacidades de procesamiento de texto WYSIWYG - Los comandos
center-*centran líneas, párrafos o regiones con base enfill-column, y pueden servir para cosas como comentarios decorativos en código - Los márgenes de visualización y el ancho del fringe son espacio de pantalla donde caben muchas funciones, pero cambiar directamente el ancho de los márgenes de visualización no es algo sencillo
set-left-marginyset-right-marginno cambian el ancho del margen de visualización; actúan más como los comandos de tipocenter, sangrando el texto real del búfer- No hay un comando directo para configurar los márgenes de visualización, y además existe el problema de que el efecto no se aplica hasta que la ventana se vuelve a mostrar
- Al activar
ruler-mode, puedes ver cómo usarlo en un tooltip sobre laheader-line - Con
S-<mouse-1>yS-<mouse-3>puedes establecer los márgenes izquierdo y derecho del búfer - También puedes ajustar
fill-columnarrastrando con<mouse-2> - Si quieres cambiar márgenes al vuelo en vez de alternar entre anchos predefinidos,
ruler-modepuede ser más amigable que paquetes comovisual-fill-columnuolivetti
Rellenar texto de nuevo: M-x refill-mode
- Emacs ofrece varios comandos
fill-*para ajustar texto yauto-fill-modepara manejar saltos de línea mientras escribes auto-fill-modese trata bastante temprano en el tutorial de Emacs, hasta el punto de presentar el ajuste de texto como una función de edición importante- En la práctica,
auto-fill-modeno es completamente automático: solo envuelve la línea actual, y los desajustes en párrafos anteriores causados por acciones como pegar texto deben corregirse a mano refill-modees la verdadera función de ajuste automático de texto de Emacs para mantener un documento alineado confill-column- Puedes activar ese comportamiento con
M-x refill-mode
Desplazar todas las ventanas juntas: M-x scroll-all-mode
scroll-other-windowpermite desplazar otra ventana no seleccionada sin cambiar a ella, y es útil para ver material de referencia en la siguiente ventana mientras trabajas en la ventana actualfollow-modepermite ver un mismo búfer de forma continua a través de varias ventanasscroll-all-modees menos conocido, pero desplaza al mismo tiempo todas las ventanas del frame- Es útil al revisar búferes que necesitas comparar de forma sincronizada, y en el ejemplo se usa para comparar visualmente dos versiones de un archivo sin entrar en una sesión de Ediff
- El flujo del ejemplo consiste en abrir una copia de respaldo anterior concreta del archivo actual con
vc-revision-other-window, activarscroll-all-modey luego desplazarse como siempre para que todas las ventanas se muevan al mismo tiempo -
Desplazamiento de otras ventanas y
master-mode- Puede haber problemas cuando hay más de dos ventanas en pantalla y la ventana que quieres desplazar no es la
next-windowque Emacs elige - El
master-modeintegrado permite predefinir o asignar al vuelo qué búfer se puede desplazar desde otro búfer - Un método más inmediato es configurar la estrategia para encontrar la ventana que se va a desplazar
(setq other-window-scroll-default #'get-lru-window)hace que siempre se desplace la ventana usada hace más tiempo- Este enfoque es útil cuando quieres desplazar una ventana con material de referencia que casi nunca seleccionas
- Si entre varias ventanas hay dos que editas con frecuencia, puedes configurar una función lambda para que la otra ventana a desplazar sea la usada más recientemente
- Combinar este tipo de configuraciones ayuda a que
scroll-other-windowdesplace la ventana que realmente quieres
- Puede haber problemas cuando hay más de dos ventanas en pantalla y la ventana que quieres desplazar no es la
Negarse a salir: M-x emacs-lock-mode
- Cuando hay archivos sin guardar, Emacs se niega a salir hasta que respondas qué hacer con cada archivo
emacs-lock-modeamplía esa idea y permite que el usuario bloquee cualquier búfer- Hasta que se quite el bloqueo, ese búfer se negará a ser eliminado y mostrará mensajes como
Buffer "*scratch*" is locked and cannot be killed - Si hay un búfer bloqueado, Emacs también se negará a salir y mostrará mensajes como
Emacs cannot exit because buffer "*scratch*" is locked - Esto sirve para no perder por accidente información guardada en búferes que no visitan archivos, o para recordar que todavía queda trabajo pendiente en ese búfer
- Después de Org-capture, el primer problema es raro hoy en día, pero sigue siendo útil para no perder la salida o el estado de búferes de shell, compilación, sitios web y otras aplicaciones especiales
Recuperar frames: M-x undelete-frame-mode, M-x undelete-frame
- Si cierras por accidente un frame de Emacs que habías configurado con cuidado, puedes recuperarlo con
undelete-frame - Para usar esta función,
undelete-frame-modedebe estar activado - Hace con los frames lo que
winnerytab-bar-historyintegrados hacen con las ventanas - Si mantienes
undelete-frame-modeactivado junto con Emacs, puedes preocuparte menos por cerrar frames por error - Se pueden restaurar hasta 16 frames eliminados
Funciones restantes y funciones descartadas
- De las funciones encontradas en los últimos 6 años, 20 han sobrevivido a la realidad de usar Emacs en 2026
- Muchas bibliotecas de Emacs descubiertas por casualidad tenían más interés arqueológico que valor como solución estable para necesidades de usuarios comunes
allout-modees un gestor de esquemas de un universo paralelo parecido a Org mode, con funciones como speed-key de Org y cifrado por subárbolshadowfileimplementaunisondentro de Emacs, pero su utilidad es dudosadouble-modees una forma de introducir caracteres no presentes en el teclado basada en conversión de teclas, anterior aquail- La biblioteca
bsfue un intento de crear un comandolist-buffersmás inteligente, peroibufferterminó siendo mejor y ya no hay mucha razón para usarla - Incluso funciones aparentemente útiles, como envolver regiones con delimitadores usando
electric-pair-mode, quedaron fuera porque su utilidad no compensa lo engorroso que resulta - Para esos casos, paquetes externos como
wrap-region,smartparensyembraceson mejores - Las bibliotecas integradas relacionadas con Org y cercanas a Org, como
appt, son interesantes, pero tienen suficiente alcance como para tratarlas en un artículo aparte - También hay bibliotecas como
thunkque resultan útiles principalmente para desarrolladores de Elisp y requieren una recopilación aparte - El directorio
lispincluido con Emacs no es tan grande, pero todavía hay margen para seguir descubriendo funciones predeterminadas útiles
1 comentarios
Comentarios en Lobste.rs
Abrir varios archivos con comodines como
*foo*.txtdesdefind-file(C-x C-f) suele ser un error, así que tengo unadvice-addenfind-file-noselectpara que, si usas comodines,find-fileabradiredde inmediatoLa idea es pasar a
dired-noselectcuando el resultado defile-expand-wildcardssea 2 o más; si no, llamar alfind-file-noselectoriginalruler-modees realmente divertido. Nunca imaginé que Emacs tuviera este tipo de función WYSIWYG; Emacs de verdad es un software peculiar pero muy disfrutableCreía que, usando Emacs común y corriente, ya había explorado casi todo, pero todavía quedaba muchísimo por descubrir.
ruler-modeestá bastante bien para escribirAntes usaba mucho más Magit, pero ahora me pasé al
vc-modeintegrado y a las herramientasdiff, y ambas funcionan muy bien, así que estoy satisfechoMe gustan este tipo de publicaciones. Cuando usas editores complejos y personalizables como Emacs o Neovim, muchas veces instalas primero una distribución inflada y vas demasiado rápido antes de entender lo que puede hacer el editor base
Si tienes tiempo, leer el manual e ir armando tu configuración desde cero puede ser bastante gratificante. Hay una función poco conocida de Emacs,
finder-list-keywords, que al ejecutarla muestra un menú para explorar funciones de Emacs difíciles de encontrar. Por ejemplo, ¿sabías que trae 24 juegos integrados?