1 puntos por GN⁺ 4 시간 전 | 1 comentarios | Compartir por WhatsApp
  • 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-windows y highlight-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-mode y los keymaps de manipulación de imágenes
  • La idea central es que, aunque el directorio lisp de 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-file y dired de forma interactiva
  • Si se usa un patrón como *foo*.txt en find-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-find y embark-export, pero funciona de inmediato en la configuración base

Lista de URI dentro del buffer: M-x ffap-menu

  • ffap es 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 abrirla
  • ffap-menu recorre 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-menu no las detecta
    • Para compensarlo, se puede usar un comando personalizado inspirado en ffap-menu que también recopile la propiedad de texto shr-url
    • El comando de ejemplo my/search-occur-browse-url está configurado para buscar tanto la expresión regular normal de URL como la propiedad shr-url, convertirlas en candidatos de autocompletado y abrir la URL elegida con browse-url o browse-url-generic

Comparación de ventanas: M-x compare-windows

  • Emacs tiene muchos comandos de comparación, como diff, diff-buffers, diff-backup, dired-diff, vc-diff y varios comandos ediff-*
  • compare-windows compara 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-directories pregunta 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-mode es una función para resaltar los puntos donde cambió un archivo, y puede usarse como alternativa “en vivo” a comandos diff como diff-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-hook y after-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-mode en buffers de archivo desde text-mode-hook y 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-change y highlight-changes-previous-change se puede ir al siguiente o al anterior punto de cambio
  • Con highlight-changes-remove-highlight se 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-versions y kept-new-versions se puede ajustar la ubicación de los respaldos y cuántos conservar
    • El paquete externo backup-walker ofrece 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-diff hace diff del archivo contra la versión inmediatamente anterior o una versión especificada
    • vc-ediff ejecuta Ediff contra la versión inmediatamente anterior o una versión especificada del archivo
    • vc-revision-other-window muestra 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-diff y vc-ediff comparan el buffer con el archivo
    • En archivos versionados, vc-diff, vc-ediff y vc-revision-other-window se 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 decir C-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, apropos es muy potente y sirve como puerta de entrada para entender cómo están organizadas las funciones de Emacs cuando no sabes qué buscar
  • apropos no es un solo comando, sino una familia de comandos de búsqueda especializados como apropos-library, apropos-function, apropos-command, apropos-variable, apropos-user-option, apropos-documentation e info-apropos
  • La configuración de ejemplo agrupa estos comandos bajo un keymap en C-h a para reemplazar apropos
  • Incluso sin un asistente como which-key, al presionar C-h después de la tecla prefijo C-h a puedes ver la lista de comandos disponibles
  • customize-apropos crea 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-key o C-h k, y luego presionar s para ir al código fuente
  • find-function-on-key reduce 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-k a find-function-on-key dentro de help-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-command copia texto de la primera línea no vacía por encima de la línea actual, y es parecido a C-y de Vim
  • duplicate-dwim copia la línea actual o la región activa debajo de la línea actual, y se parece a yy<N>p de Vim
  • copy-from-above-command copia tantos caracteres como indique el argumento prefijo desde la línea superior, pero el advice de ejemplo cambia el argumento prefijo C-u para 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-dwim requiere 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-position y duplicate-line-final-position en -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 paquete dot-mode de 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 teclas
  • kmacro-edit-lossage permite 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), pero kmacro-edit-lossage es ú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-query dentro 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, GtkWindow se divide en Gtk y Window, EmacsFrameClass en Emacs, Frame, Class, y NSGraphicsContext en NS, Graphics, Context
  • En superword-mode, símbolos snake_case como this_is_a_symbol se tratan como una sola palabra
  • En el uso real, como los comandos *-sexp ya ofrecen buen soporte para manipular símbolos, superword-mode resulta menos útil que subword-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 :foo con backward-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) y modify-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 i para 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 + e i - sirven para acercar y alejar, y i r rota la imagen 90 grados
  • También puedes recortar la imagen con i c, y las teclas detalladas se pueden ver con M-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 +, - o r sin el prefijo i
  • 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 TAB suele 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-mode desactiva 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-mode está 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 a M-s i
  • En el ejemplo, se buscó zero para ir al último encabezado de un documento Org, pero saltaba a una coincidencia dentro de una región plegada; al volver a buscar y presionar M-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ásico C-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 en fill-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-margin y set-right-margin no cambian el ancho del margen de visualización; actúan más como los comandos de tipo center, 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 la header-line
  • Con S-<mouse-1> y S-<mouse-3> puedes establecer los márgenes izquierdo y derecho del búfer
  • También puedes ajustar fill-column arrastrando con <mouse-2>
  • Si quieres cambiar márgenes al vuelo en vez de alternar entre anchos predefinidos, ruler-mode puede ser más amigable que paquetes como visual-fill-column u olivetti

Rellenar texto de nuevo: M-x refill-mode

  • Emacs ofrece varios comandos fill-* para ajustar texto y auto-fill-mode para manejar saltos de línea mientras escribes
  • auto-fill-mode se 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-mode no 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-mode es la verdadera función de ajuste automático de texto de Emacs para mantener un documento alineado con fill-column
  • Puedes activar ese comportamiento con M-x refill-mode

Desplazar todas las ventanas juntas: M-x scroll-all-mode

  • scroll-other-window permite 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 actual
  • follow-mode permite ver un mismo búfer de forma continua a través de varias ventanas
  • scroll-all-mode es 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, activar scroll-all-mode y 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-window que Emacs elige
    • El master-mode integrado 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-window desplace la ventana que realmente quieres

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-mode amplí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-mode debe estar activado
  • Hace con los frames lo que winner y tab-bar-history integrados hacen con las ventanas
  • Si mantienes undelete-frame-mode activado 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-mode es un gestor de esquemas de un universo paralelo parecido a Org mode, con funciones como speed-key de Org y cifrado por subárbol
  • shadowfile implementa unison dentro de Emacs, pero su utilidad es dudosa
  • double-mode es una forma de introducir caracteres no presentes en el teclado basada en conversión de teclas, anterior a quail
  • La biblioteca bs fue un intento de crear un comando list-buffers más inteligente, pero ibuffer terminó 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, smartparens y embrace son 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 thunk que resultan útiles principalmente para desarrolladores de Elisp y requieren una recopilación aparte
  • El directorio lisp incluido con Emacs no es tan grande, pero todavía hay margen para seguir descubriendo funciones predeterminadas útiles

1 comentarios

 
GN⁺ 4 시간 전
Comentarios en Lobste.rs
  • Abrir varios archivos con comodines como *foo*.txt desde find-file (C-x C-f) suele ser un error, así que tengo un advice-add en find-file-noselect para que, si usas comodines, find-file abra dired de inmediato
    La idea es pasar a dired-noselect cuando el resultado de file-expand-wildcards sea 2 o más; si no, llamar al find-file-noselect original

  • ruler-mode es realmente divertido. Nunca imaginé que Emacs tuviera este tipo de función WYSIWYG; Emacs de verdad es un software peculiar pero muy disfrutable

  • Creía que, usando Emacs común y corriente, ya había explorado casi todo, pero todavía quedaba muchísimo por descubrir. ruler-mode está bastante bien para escribir

    • Sorprende que estas funciones vengan dentro del propio Emacs. Es fácil pensar que Emacs solo proporciona la API de elisp para construir cosas así, pero me estaba perdiendo muchas herramientas base
      Antes usaba mucho más Magit, pero ahora me pasé al vc-mode integrado y a las herramientas diff, y ambas funcionan muy bien, así que estoy satisfecho
  • Me 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?