1 puntos por GN⁺ 2024-05-13 | 1 comentarios | Compartir por WhatsApp
  • La gestión de ventanas en Emacs se basa en una estructura flexible donde buffers y ventanas están separados, pero con operaciones básicas algo rudimentarias encima, por lo que el usuario debe combinar herramientas y hábitos para construir su flujo de trabajo
  • El texto no se centra en reglas de display-buffer ni en espacios de trabajo basados en pestañas, sino en operaciones manuales dentro de un frame de Emacs: mover el foco, organizar buffers, dividir y eliminar ventanas, y manejar tareas temporales
  • other-window, windmove, winum, ace-window, el mouse, transpose-frame, window-prefix-map, other-window-prefix y winner-mode se reparten tareas como navegación cíclica, movimiento direccional, selección por número, selección por pista, transformación de layouts y recuperación
  • Con ace-window y Avy se puede elegir una ventana concreta y luego ejecutar un comando, o saltar directamente a una posición de texto para reducir el cambio de ventanas en sí
  • La gestión de ventanas en Emacs no es tanto un sistema fijo y complejo, sino más bien un problema abierto; display-buffer-alist, Popper·Popwin, la manipulación del árbol de ventanas y la integración con WM en mosaico son potentes, pero también implican un costo de configuración alto y puntos ciegos

Qué significa la gestión de ventanas en Emacs

  • En Emacs, una ventana (window) es un viewport o panel dentro de un frame, mientras que un buffer (buffer) es un bloque continuo de texto que puede corresponder o no al contenido de un archivo
  • Muchos IDE y editores prácticamente fusionan los conceptos de ventana y buffer para reducir la carga cognitiva, pero Emacs los separa para permitir disposiciones más flexibles
    • Ver el mismo archivo dos veces es sencillo
    • También se pueden manejar de forma natural buffers que no corresponden directamente a un archivo
    • Los buffers indirectos de Emacs son algo parecido a una copia “viva” de todo el buffer
  • Esta separación tiene un costo para los usuarios nuevos
    • Hay que ubicar las ventanas donde uno quiere dentro del frame
    • Hay que poner el buffer deseado en la ventana deseada
    • Al principio, la carga operativa se nota antes que las ventajas que aporta esta separación

Áreas que este artículo no cubre

  • Las reglas automáticas de visualización de buffers para controlar por completo display-buffer no son el tema central
  • Las pestañas, los espacios de trabajo, el aislamiento de buffers y la persistencia de sesiones también quedan fuera del alcance principal
  • También se dejan fuera del texto las alternativas radicales que funcionan dentro de Emacs como un gestor de ventanas aparte
    • Edwina impone un layout automático en mosaico de estilo DWM, con master-and-stack
    • HyControl ofrece, entre otras cosas, un panel de control para acciones de layout de ventanas y visualización en grilla uniforme
  • El foco real está en las operaciones manuales y cotidianas
    • Cambiar el foco entre ventanas
    • Mover buffers entre ventanas
    • Dividir y eliminar ventanas
    • Controlar la ventana de destino durante la ejecución de comandos

Movimiento básico: other-window y la “siguiente ventana”

  • other-window es el comando básico de cambio de ventana que se aprende en el tutorial de Emacs, y su tecla predeterminada es C-x o
  • El orden de selección suele recorrer las ventanas dentro del frame en sentido horario
    • Cuando hay pocas ventanas, es simple y suficientemente usable
    • A medida que aumentan las ventanas, hay que invocarlo varias veces hasta llegar al lugar deseado
  • También hay ajustes prácticos
    • Se puede enlazar a una tecla más fácil de presionar, como M-o
    • Con argumentos numéricos se pueden saltar varias posiciones o moverse en sentido inverso
    • Si se activa repeat-mode, se pueden ingresar repeticiones como C-x o o o... o M-o o o...
  • Si se configura el parámetro de ventana no-other-window, other-window salta esa ventana específica
    • Esta es la razón por la que ventanas laterales tipo gestor de archivos, como dired-sidebar o dirvish-side, quedan fuera de los destinos de other-window
  • El concepto de “siguiente ventana” también es el destino predeterminado de comandos que actúan sobre otra ventana, como scroll-other-window

Movimiento basado en dirección: windmove

  • windmove es una biblioteca integrada que mueve el foco de ventana según una dirección
    • Se parece al movimiento izquierda·derecha·arriba·abajo que esperan los usuarios de Vim
    • Los usuarios de evil-mode también usan Windmove internamente
  • windmove-left, windmove-right, windmove-up y windmove-down se pueden enlazar a WASD, HJKL, las flechas, etc.
  • Los comandos windmove-swap-states-left/right/up/down intercambian los buffers de las ventanas según la dirección
    • En ese caso, el foco se mueve junto con el buffer
  • También se puede eliminar una ventana en una dirección específica con la familia windmove-delete-*, pero el texto trata más abajo otros métodos
  • En entornos con WM en mosaico, se puede integrar el movimiento entre ventanas internas de Emacs y ventanas del SO usando las mismas teclas
    • Como ejemplo de integración entre Emacs e i3wm está i3 integration
    • Un ejemplo de configuración para qtile se puede ver en emacs-wm.el

Delegar las ventanas de Emacs a ventanas del SO

  • frames-only-mode abre todos los buffers en frames nuevos, no en ventanas de Emacs, para que los gestione el gestor de ventanas del SO
  • Este enfoque permite tratar los buffers de Emacs al mismo nivel que las ventanas del SO y administrarlos a ambos con las mismas teclas
  • Herramientas como Avy, winum, ace-window y scroll-other-window pueden aplicarse no solo a ventanas, sino también a frames completos
  • Algunos comandos de Emacs asumen que pueden dividir frames a voluntad, por lo que pueden aparecer casos excepcionales
    • Esa tendencia se ve especialmente en comandos de org-mode
  • No hay experiencia usando frames-only-mode en compositores Wayland

Seleccionar al instante con números y pistas

  • winum muestra números de ventana en la línea de modo y permite seleccionar ventanas por número
    • Mientras other-window se acerca a O(n) y windmove depende de la disposición espacial, winum se acerca a un acceso O(1) cuando conoces el número
    • Si invocas el comando de selección con un argumento prefix negativo, elimina esa ventana
    • Cuando el minibúfer está activo, siempre recibe el número 0
    • Funciona a través de frames de Emacs
  • La tecla predeterminada C-x w <n> puede resultar larga, por lo que hay ejemplos de configuración que usan de M-0 a M-9 para seleccionar ventanas
  • ace-window se presenta como una herramienta potente para controlar ventanas de Emacs desde el teclado
    • Muestra pistas sobre cada ventana y permite seleccionarla presionando la tecla correspondiente
    • Al activar ace-window-display-mode, las pistas pueden mostrarse de forma continua en la línea de modo, como con winum
    • Al presionar ?, se abre el menú de dispatch
  • La fortaleza de ace-window está menos en la selección simple y más en elegir una ventana y luego ejecutar una acción
    • Eliminar una ventana
    • Mover e intercambiar ventanas
    • Dividir ventanas
    • Mostrar un búfer específico
    • Aplicar una operación a otra ventana sin salir de la ventana seleccionada

Mouse y transformación de layouts

  • En Emacs, el mouse encaja de forma natural para seleccionar ventanas, ajustar tamaños, usar menús contextuales y hacer drag and drop
    • context-menu-mode y la barra de menú aumentan la capacidad de descubrimiento
  • Si ya quitaste las manos del teclado, manejar Emacs con el mouse puede ser el camino de menor resistencia
  • También hay operaciones que pueden hacerse con gestos del mouse
    • Divisiones verticales y horizontales del frame
    • Eliminar ventanas
    • Recorrer búferes dentro de una ventana
    • Intercambiar ventanas hacia la derecha o la izquierda
    • Alternar entre los dos últimos búferes en una ventana
  • Al configurar mouse-autoselect-window, se puede activar el comportamiento focus-follows-mouse
  • transpose-frame ofrece comandos para rotar o voltear el layout de ventanas de un frame
    • rotate-frame, flip-frame y flop-frame se consideran comandos útiles con frecuencia
    • Se evalúa que transpose-frame en sí, al transponer respecto de la diagonal principal, tiene poca utilidad práctica

window-prefix-map y el árbol de ventanas

  • window-prefix-map es el conjunto de comandos de gestión de ventanas asociado a la tecla predeterminada C-x w de Emacs
  • split-root-window-right y split-root-window-below dividen la ventana raíz del frame
    • Están vinculados a C-x w 3 y C-x w 2, respectivamente
    • A diferencia de los comandos de división normales, que subdividen más la ventana actual, son útiles para crear un espacio de trabajo separado
  • Las ventanas de Emacs se organizan en una estructura de árbol
    • Las ventanas reales son nodos hoja
    • Una división convierte una hoja en el nodo padre de dos ventanas
    • Es similar a la disposición de gestores de ventanas en mosaico manuales como i3 o bspwm
  • tab-window-detach y tear-off-window mueven la ventana actual a una pestaña nueva o a un frame nuevo
    • Sus teclas predeterminadas, C-x w ^ t y C-x w ^ f, respectivamente, se consideran largas
    • Pueden reemplazarse con acciones de dispatch de ace-window o bindings de mouse

other-window-prefix: cambiar dónde se muestra el siguiente comando

  • other-window-prefix es un comando integrado vinculado a C-x 4 4, y hace que el búfer que muestra el siguiente comando aparezca en la siguiente ventana
  • Este comando separa los comandos que muestran búferes, como abrir archivos, cambiar de búfer o saltar a un marcador, de la selección de la ventana de destino
    • Reduce la necesidad de memorizar cada vez familias de comandos como find-file-other-window, find-file-other-tab o find-file-other-frame
    • Puedes anteponer el prefix a comandos básicos como find-file, find-file-read-only o switch-to-buffer para cambiar solo la ubicación de visualización
  • En el ejemplo de Forge, permite evitar con other-window-prefix el problema de que la ventana actual sea reemplazada al presionar RET en la lista de issues
  • También ofrece un comportamiento uniforme cuando cada paquete —como Magit, Org mode, Notmuch, Elfeed o EWW— tiene una forma distinta de “abrir en otra ventana”
  • También hay prefixes relacionados
    • same-window-prefix fuerza que el búfer del siguiente comando se muestre en la ventana actual
    • other-frame-prefix hace que se abra en un frame nuevo
    • other-tab-prefix hace que se abra en una pestaña nueva

Guardar y restaurar configuraciones de ventanas

  • window-configuration-to-register es el comando predeterminado que guarda la configuración actual de ventanas en un registro, y su tecla predeterminada es C-x r w
  • jump-to-register restaura la configuración guardada, y su tecla predeterminada es C-x r j
  • A nivel de Elisp, se puede guardar el resultado de current-window-configuration en una variable y aplicarlo con set-window-configuration
    • Si se guarda en disco mediante métodos como prin1, persist o multisession, se convierte en la semilla de una función para restaurar entre sesiones
    • Sin embargo, que también se restaure la posición del cursor en cada ventana puede ser un comportamiento normalmente no deseado
  • También hay opciones tipo “oops” que acumulan automáticamente configuraciones anteriores
    • winner-mode: cuando no se usan pestañas, permite deshacer o rehacer cambios en la configuración de ventanas con winner-undo y winner-redo
    • tab-bar-history-mode: proporciona una pila de historial separada por pestaña
    • undelete-frame-mode y tab-undo: recuperan frames o pestañas cerrados por accidente
  • Usar winner-undo como forma de arreglar cada vez que Emacs muestra un búfer en un lugar equivocado es más bien una solución provisoria
    • El problema de fondo es que las reglas de visualización de búferes no están configuradas como se desea

Optimizar para dos ventanas entre las que se alterna con frecuencia

  • En el trabajo real, aunque haya varias ventanas en pantalla, la mayoría de las veces se alterna con frecuencia entre dos ventanas
    • Código y REPL
    • Código y Grep
    • Texto y notas
    • Lista y elemento
  • Las demás ventanas pueden ser áreas de referencia que se miran con frecuencia pero a las que casi no se cambia, como documentación, información de depuración, logs, salida de comandos, índice, explorador de archivos o vista previa
  • Hay un ejemplo de other-window-mru que usa get-mru-window para cambiar a la ventana usada más recientemente
    • Aunque la segunda ventana se elija con el mouse, ace-window, winum o cualquier otro método, después se puede ir y volver rápidamente
  • También hay formas de mejorar other-window en sí
    • Hacer que se divida automáticamente si solo hay una ventana
    • Recorrer ventanas en orden de uso reciente, como switchy-window
    • Hacer que, como other-window-alternating, la dirección se invierta cada vez que no sea una llamada consecutiva, para que alternar entre dos ventanas resulte natural

Extender ace-window con ejecución de comandos

  • ace-window permite usar por separado solo la etapa de selección de una ventana específica mediante aw-select
  • Si se realiza la operación deseada sobre la ventana devuelta por aw-select, se puede crear el patrón “seleccionar ventana → ejecutar operación → conservar la ventana original”
  • Los comandos de ejemplo son los siguientes
    • ace-tear-off-window: separa en un frame nuevo la ventana elegida con ace-window
    • ace-tab-window-detach: mueve la ventana elegida a una pestaña nueva
  • ace-window-one-command permite ejecutar un único comando arbitrario en la ventana seleccionada
    • Primero se elige una ventana con ace-window
    • Lee una secuencia de teclas y ejecuta el comando correspondiente
    • Puede aplicar una operación a otra ventana sin cambiar la ventana seleccionada originalmente
  • ace-window-prefix funciona como una versión más directa de other-window-prefix
    • Permite elegir directamente con ace-window la ventana de destino del búfer que mostrará el siguiente comando
    • Si hace falta, se puede crear una ventana nueva al vuelo con una acción de ace-window y mostrarlo allí
    • El binding de teclas propuesto es C-x 4 o

¿Es imprescindible cambiar de ventana?

  • El objetivo de cambiar de ventana se divide, en términos generales, en dos casos
    • Switch and stay: seguir editando o trabajando en la ventana de destino
    • Switch and return: hacer algo breve, como desplazarse, buscar, copiar o borrar, y volver a la ubicación original
  • En el primer caso, Avy puede combinar el cambio de ventana y el movimiento del cursor en una sola acción
    • avy-goto-char-timer trata varias ventanas y frames de Emacs visibles en pantalla como un único conjunto de candidatos para saltar
    • Al saltar a una cadena específica o a una posición de carácter, la ventana también cambia automáticamente
    • Si Avy no atraviesa ventanas y frames, hay que revisar la configuración de avy-all-windows
  • pop-global-mark es un medio para volver a una ubicación anterior y, si hace falta, también puede ocurrir un cambio de ventana
    • De forma predeterminada cambia el buffer en la ventana actual, por lo que existe un advice para hacer que use pop-to-buffer
  • En el segundo caso, se puede automatizar el flujo “cambiar → actuar → volver” envolviéndolo en un comando
    • ace-window-one-command es una forma genérica de hacerlo
    • Las acciones específicas pueden convertirse en comandos dedicados o macros

Desplazamiento, búsqueda y cambio de buffer en otra ventana

  • scroll-other-window y scroll-other-window-down desplazan otra ventana sin salir de la ventana actual
    • El destino predeterminado es la “siguiente ventana” en sentido horario desde la ventana actual
    • Si hay tres o más ventanas, puede desplazarse otra ventana en lugar de la ventana de referencia esperada
  • Se puede configurar other-window-scroll-default para cambiar las reglas de selección del destino de desplazamiento
    • Si se usa get-lru-window, se desplaza la ventana usada menos recientemente
    • Si se usa get-mru-window, se puede tomar como destino la ventana usada recientemente
  • Al configurar other-window-scroll-buffer, se puede designar como destino de desplazamiento la ventana que muestra un buffer específico
    • Se trata principalmente como una opción útil para autores de paquetes
  • El ejemplo de isearch-other-window inicia una búsqueda en la ventana destino del desplazamiento y, al terminar la búsqueda, vuelve a la ventana original
    • Hay un ejemplo de uso conjunto de un shell y un buffer de Man
  • next-buffer, previous-buffer y switch-to-buffer también pueden extenderse combinando un argumento prefix con other-window-for-scrolling para ejecutarlos en otra ventana
    • Si se crea un keymap para repeat-mode, con n, p y b se puede recorrer de forma continua o seleccionar buffers de otra ventana

master-mode, scroll-all-mode, with-other-window

  • master-mode designa el buffer actual como “master” y otro buffer como “slave”, lo que permite enviar acciones al buffer slave sin abandonar la posición actual
    • En general se evalúa como una alternativa menos transparente que el método anterior de other-window-scroll-default
    • Mediante master-says se pueden crear teclas que ejecuten acciones arbitrarias, como recenter, en el buffer slave
  • scroll-all-mode agrupa el comportamiento de desplazamiento de todas las ventanas dentro del frame
    • Es útil cuando se quiere ver varias vistas de ventana sincronizadas
  • La macro with-other-window es un helper de Elisp que ejecuta el código del cuerpo en la ventana elegida por other-window-for-scrolling
    • Permite crear fácilmente comandos como isearch-other-window e isearch-other-window-backwards
    • Se usa como contraparte en Elisp del ace-window-one-command interactivo

Estrategias para reducir la cantidad de ventanas

  • Las UI de editores modernos suelen converger hacia una ventana principal, una barra de pestañas superior, una barra lateral izquierda de directorios o índice, un panel derecho opcional y una terminal inferior
  • En Emacs también se puede crear ese tipo de layout, pero también es posible concentrar la pantalla en un solo buffer y reemplazar el cambio de ventana por cambios de buffer
  • Si se relaja la restricción hasta permitir dos ventanas, se conserva la mayor parte de la simplicidad y se puede usar la segunda ventana como referencia en vivo
    • La configuración predeterminada de Emacs soporta bastante bien este patrón mediante comandos como scroll-other-window
  • También existe la estrategia de ver las ventanas solo como contenedores de texto e ignorarlas
    • Saltar directamente con Avy a una posición de texto en pantalla
    • Volver sobre ubicaciones anteriores con mark-ring y global-mark-ring
    • dogears puede ofrecer una UI de retorno más detallada
  • Para fijar ubicaciones manualmente se pueden usar point-to-register y jump-to-register; para registros más permanentes, bookmark-set y bookmark-jump

Reglas de visualización automática y gestión de popups

  • display-buffer-alist es una variable que, cuando código Elisp intenta mostrar un buffer, empareja buffers con reglas para decidir cómo mostrarlos
  • En teoría, si se crean reglas de tamaño, posición, rol y foco para cada tipo de buffer que se ve a diario, se resuelve una parte considerable de la gestión de ventanas
  • El problema es el costo de configuración
    • Predicados de buffers y modos
    • Tipos de ventana y slots
    • Funciones action de display-buffer
    • Parámetros de ventana
    • Es difícil expresar con facilidad una intención simple como “no toques mi disposición de ventanas”
  • También hay herramientas auxiliares
    • Shackle cubre la complejidad de display-buffer-alist y ofrece una interfaz sencilla en Elisp
    • Doom Emacs ofrece comandos de conveniencia como set-popup-rule!
  • Popwin y Popper parten de la observación de que no todos los buffers son iguales
    • Distinguen entre buffers principales de trabajo y buffers popup temporales
    • Muestran documentación, shell, estado de tareas, resultados de compilación, resultados de búsqueda, mensajes, etc. en pequeñas ventanas auxiliares, y permiten cerrarlas o recorrerlas fácilmente
    • Popper se centra en subir y bajar con una sola tecla los buffers popup designados
    • Popwin es una implementación más antigua y abarcadora, pero también agrupa su propia configuración de display-buffer
    • Si solo se quiere abrir y cerrar rápidamente un shell, shell-pop o vterm-toggle pueden ser suficientes

La pieza faltante: manipulación del árbol de ventanas

  • Emacs representa las ventanas dentro de un frame como un árbol, pero la mayoría de los comandos de usuario actúan mirando solo la posición espacial, no la estructura del árbol
  • Por esta discrepancia, al dividir o borrar pueden aparecer comportamientos distintos de los esperados, o pueden surgir restricciones en las estructuras de división que es posible crear
  • Si existiera un paquete hipotético como window-tree, podría permitir la manipulación a nivel de nodos internos
    • Dividir, transponer o reflejar solo una parte del frame
    • Seleccionar varias ventanas como una composición parcial
    • Pasar la parte seleccionada a una pestaña o a un frame
    • Duplicar o guardar una composición parcial
    • Proteger una branch específica del árbol frente a comandos de la familia display-buffer
  • También hay elementos de Elisp que ya existen
    • window-tree devuelve el árbol en sí
    • frame-root-window devuelve la raíz
    • Existen window-parent, window-child y window-*-sibling
    • Se puede recorrer con walk-window-tree y walk-windows
  • Las carencias también son claras
    • No hay funciones básicas para transformar el árbol más allá de split/delete generales
    • No existe el concepto de seleccionar una ventana interna, por lo que hay que simularlo mediante la UI

La pieza que falta: integración con gestores de ventanas en mosaico

  • El modelo de árbol de ventanas de Emacs es muy similar al de gestores de ventanas en mosaico manuales como i3 o bspwm
  • Si usas Emacs dentro de i3, bspwm o tmux, es natural querer moverte entre ventanas internas y externas de Emacs con los mismos atajos de teclado
  • Entre los casos existentes están i3-integration de Pavel Korytov y emacs-wm.el para qtile
  • Una interfaz de integración más limpia necesita los siguientes elementos
    • El gestor de ventanas debe identificar la clase de la ventana activa y ofrecer movimiento y manipulación de ventanas de forma programática
    • El método de comunicación puede ser comandos de shell, sockets, IPC basado en servidor, D-Bus en Linux, etc.
    • Del lado de Emacs hace falta una interfaz independiente del método de comunicación que imite las operaciones propias de un gestor de ventanas
    • Al cambiar de ventana del SO, se debe verificar si la ventana activa es Emacs y, si es necesario, Emacs debe encargarse de la operación dentro del frame interno

Conclusión

  • La gestión de ventanas en Emacs ofrece opciones en distintos niveles, desde other-window hasta ace-window, Avy, Popper y display-buffer-alist
  • No hace falta usar todos los métodos; como hay muchas alternativas para resolver el mismo problema, puedes elegir una y omitir las demás
  • Es probable que las herramientas integradas básicas se mantengan por mucho tiempo, pero el estado de los paquetes de terceros puede cambiar según su desarrollo, abandono u orfandad
  • La gestión de ventanas en Emacs se parece más a una estructura abierta que ofrece ingredientes y recetas que a un sistema fijo y complejo
  • Con poca configuración ya es posible tener una experiencia básica, y con algunas combinaciones y ajustes en Elisp se puede crear un flujo de trabajo mucho más personalizado

1 comentarios

 
GN⁺ 2024-05-13
Opiniones en Hacker News
  • El artículo es bueno, y las explicaciones y guías también son excelentes. A veces las ventanas divididas en partes iguales no alcanzan, así que puse la siguiente función en init.el y la vinculé a C-x 7 para ajustar la ventana actual y su ventana pareja a un tamaño vertical de 70%/30%
    La orientación horizontal también la manejo de la misma forma con una vinculación a C-x 8

    (defun partial-size-window ()
    "Set the two split windows to 70% and 30% vertically."
    (interactive)
    (let ((size (- (truncate (* .70 (frame-height))) (window-height))))
    (if (> size 0)
    (enlarge-window size))))

    (defun partial-size-window-h ()
    "Set the two split windows to 70% and 30% horizontally."
    (interactive)
    (let ((size (- (truncate (* .70 (frame-width))) (window-width))))
    (if (> size 0)
    (enlarge-window-horizontally size))))

    • golden-ratio también puede usarse para esto
  • Fue una buena exploración. Ahora estoy en el móvil y no puedo probarlo de inmediato, pero tengo muchas ganas de probar ace-window, ace-window-display-mode y frames-only-mode
    Si soy honesto, aunque llevo unos 40 años usando Emacs, en general solo he usado next-window, crear una ventana nueva abajo o al lado, y apoyarme en tmux cuando trabajo en servidores remotos

    • A mí me pasa algo parecido. Durante 30 años, C-x 1/2/3 y C-x o fueron casi todo lo que usé
      Aun así, la verdad es que es bastante potente y suficiente para mi uso; ojalá varios gestores de ventanas en mosaico fueran más o menos así
    • A mí también me pasa algo parecido. C-x o es un poco engorroso, así que tengo la configuración de abajo, pero no siento que estos paquetes adicionales sean imprescindibles
      (global-set-key (kbd "M-o") #'other-window)
      Aun así, está bueno tener un artículo de referencia tan profundo, y los textos de Karthik siempre son educativos e interesantes
  • Para agregar a la nota de Karthink sobre windmove-mode, se puede configurar windmove-default-keybindings para moverse entre ventanas con Ctrl-<flecha>
    (windmove-default-keybindings 'control)
    Lo tengo en mi configuración y también lo incluí en un starter kit minimalista; de verdad es un cambio radical
    https://codeberg.org/ashton314/emacs-bedrock

    • Revisé mi .emacs y resulta que uso exactamente lo mismo. Lo prefiero porque requiere una tecla menos que C-x O y es más flexible
  • Tengo configurado Emacs para que no divida un frame en varias ventanas. Es parecido a cómo un navegador web no divide una ventana del navegador en varios viewports
    Mi Emacs tampoco crea un segundo frame. La forma de implementarlo ha cambiado año tras año a medida que los métodos antiguos dejaron de funcionar
    Con el método actual, en ciertas situaciones sí se divide el frame, por ejemplo cuando Emacs muestra el búfer *Completions*, pero, si no recuerdo mal, no tuve que llamar manualmente a delete-window para eliminar la segunda ventana y siempre desapareció sola

    • Los navegadores web también pueden dividir la ventana así, si son de los que permiten ver varias páginas a la vez, como Vivaldi
    • Me pregunto si impedir que un frame se divida en varias ventanas tenía como objetivo resolver algún problema en particular
      Yo uso bastante los frames con varias ventanas. En macOS reciente y Emacs reciente, a veces un frame con varias ventanas parece quedarse colgado y no responde al teclado ni al trackpad, incluso después de presionar Ctrl-G varias veces
      Pero crear un frame nuevo con C-x 5 2 sí funcionaba, y al volver al frame colgado podía cerrarlo con C-x 5 0
  • El artículo es muy profundo, y me gustó mucho que el autor se haya tomado el tiempo de hacer buenos diagramas

  • Buen artículo; quiero compartir un paquete excelente para usar junto con esto. Para mí, zygospore fue una herramienta indispensable
    “zygospore permite deshacer C-x 1 (delete-other-window) volviendo a presionar C-x 1
    https://github.com/LouisKottmann/zygospore.el

    • Para rehacer o deshacer todos los cambios de configuración de ventanas, vale la pena mirar winner mode
      https://www.emacswiki.org/emacs/WinnerMode
    • Idealmente, creo que debería ser undo
      Aunque sería raro, C-u C-x 1 parece coherente
  • Si el autor ve esto, quiero decirle que me alegró la pequeña mención a Acme editor

  • Cuando invoco hledger-balance-sheet, quiero que no reemplace el .hledger.journal existente, sino que se abra a la derecha con un 30% de ancho
    Me gustaría que .hledger.journal siguiera abierto a la izquierda y permaneciera seleccionado