1 puntos por GN⁺ 2024-05-13 | 1 comentarios | Compartir por WhatsApp

Panorama general de la gestión de ventanas en Emacs

La reputación y el potencial de la gestión de ventanas

  • La gestión de ventanas de Emacs no tiene muy buena reputación.
  • Esto se debe en gran parte a que combina un sistema de diseño muy flexible y granular con un control tosco.
  • Esto deja espacio para crear y usar herramientas que ofrezcan mejores metáforas y affordances para manejar ventanas.

Opciones básicas de gestión de ventanas

other-window y la "siguiente ventana"

  • other-window (C-x o) ofrece la experiencia básica para cambiar entre ventanas.
  • Es lo que se enseña en el tutorial de Emacs y funciona bien cuando hay pocas ventanas.
  • La selección de ventanas recorre todo el frame en sentido horario (aproximadamente).

windmove

  • windmove es una biblioteca integrada de Emacs para mover el foco entre ventanas según la dirección y mover buffers entre ventanas.
  • Es una función que esperan los usuarios de Vim, y quienes usan evil-mode ya están usando Windmove.
  • Se usa enlazando windmove-left, -right, -up, -down a teclas asociadas con cada dirección.

frames-only-mode

  • frames-only-mode permite delegar al sistema operativo el manejo de ventanas de Emacs.
  • Si todos los buffers se abren en nuevos frames, entonces pasa a ser trabajo del gestor de ventanas.
  • Esto hace que los buffers de Emacs se comporten como ventanas del sistema operativo y puedan manejarse con las mismas teclas.

winum-mode

  • Winum es una evolución natural del esfuerzo de cambiar entre n ventanas pasando de O(n) (other-window) a O(√n) (windmove) y luego a O(1).
  • Añade números de ventana a la mode line para que puedas seleccionar ventanas por número.
  • Cuando el minibuffer está activo, siempre se le asigna el número 0.

ace-window

  • ace-window es la opción definitiva para el control de ventanas en Emacs con teclado.
  • Coloca "pistas" en la parte superior de cada ventana, y al ingresar esa tecla el foco cambia a esa ventana.
  • Permite "seleccionar" una ventana de forma general y luego el usuario decide qué hacer con ella.
  • Además de acciones integradas como eliminar, mover o intercambiar ventanas, dividirlas o mostrar buffers, también se pueden añadir acciones personalizadas.

Uso del mouse

  • Las ventajas de usar el mouse para gestionar ventanas son inmediatas y obvias.
  • Seleccionar ventanas es una extensión natural del uso básico del mouse, y redimensionarlas es sencillo.
  • El soporte para menús contextuales y arrastrar y soltar es muy intuitivo.
  • Para mitigar sus desventajas, si ya estás usando el mouse para otras tareas, manejar Emacs con el mouse suele ser el camino de menor resistencia.

transpose-frame (rotar, voltear y reflejar)

  • transpose-frame proporciona comandos para rotar o reflejar la distribución de ventanas en un frame.
  • Se usa con frecuencia enlazando rotate-frame, flip-frame, flop-frame a teclas adecuadas.

window-prefix-map

  • window-prefix-map está enlazado por defecto a C-x w y reúne varios comandos útiles para gestionar ventanas.
  • split-root-window-right y split-root-window-below dividen la ventana raíz del frame.
  • tab-detach y tear-off-window son comandos convenientes para mover una ventana a una nueva pestaña o a un nuevo frame.

other-window-prefix

  • other-window-prefix ofrece una forma de separar la selección de ventanas de la visualización de buffers y resuelve tres molestias relacionadas con las ventanas.
  • Muchos comandos de Emacs acoplan fuertemente la operación principal, el buffer y la ventana. Con other-window-prefix, puedes mostrar el buffer de un comando en otra ventana.
  • Con other-window-prefix, puedes seleccionar una ventana al activar objetos como enlaces.
  • Con other-window-prefix, puedes abrir de forma uniforme objetos tipo "enlace" sin necesidad de adaptarte al comportamiento o personalización de cada autor de paquete.

Guardar y restaurar configuraciones de ventanas

  • window-configuration-to-register es una herramienta algo torpe, pero perfecta como un gran botón rojo de reinicio.
  • En cualquier momento puedes usar este comando para guardar la configuración actual de ventanas en un registro y luego restaurarla con jump-to-register.
  • Con winner-mode, puedes hacer que Emacs mantenga una pila de disposiciones anteriores de ventanas.

Exploración más profunda

Cómo moverse hacia adelante y atrás

  • Sin importar cuántas ventanas haya abiertas al mismo tiempo, en la mayoría de los casos solo necesitas alternar entre dos ventanas.
  • Puedes usar el comando other-window-mru para cambiar entre pares de ventanas.

Mejoras a other-window

  • Puedes hacer que other-window divida el frame cuando solo hay una ventana.
  • Puedes hacer que recorra las ventanas según el orden de último uso en lugar del orden espacial (switchy-window).
  • Puedes hacer que invierta la dirección de cambio cada vez que se llama para alternar de manera natural entre dos ventanas.

Usar la magia de ventanas con el dispatch de ace-window

  • ace-window hace con las ventanas lo mismo que completing-read hace con una lista de cadenas.
  • aw-select es ideal para los dos primeros pasos —filtrar y seleccionar— al invocar cualquier operación sobre cualquier ventana.
  • ace-window-one-command te permite seleccionar una ventana con ace-window y luego ejecutar cualquier comando simple en esa ventana.
  • ace-window-prefix es similar a other-window-prefix, pero te permite seleccionar explícitamente la ventana donde se mostrará el buffer del siguiente comando.

¿Es necesario cambiar de ventana?

  • El movimiento independiente de ventanas con Avy es un caso especial de una idea más general.
  • Como contenedores de texto, las ventanas podrían ser una abstracción innecesaria.
  • mark-ring y global-mark-ring registran las posiciones a las que te moviste, permitiéndote navegar por todas las ventanas cuando sea necesario.
  • Puedes fijar manualmente posiciones a las que quieras volver más tarde con point-to-register y jump-to-register.
  • Crear y saltar entre marcadores ofrece muchas opciones para recorrer todas las ventanas usando ubicaciones significativas que Emacs o el usuario hayan identificado.

Gestionar ventanas para no tener que interactuar con ellas

  • display-buffer-alist y el comportamiento automático de ventanas pueden resolver el problema de las ventanas tipo whack-a-mole.
  • Si defines reglas para cada tipo de buffer que ves a diario en Emacs, gran parte de la gestión de ventanas queda resuelta.
  • El problema de display-buffer-alist no es que no funcione, sino que requiere mucho trabajo.
  • El paquete Shackle oculta las rarezas de display-buffer-alist y ofrece una interfaz elisp simplificada para especificar reglas de ventanas.
  • Las distribuciones de Emacs normalmente ofrecen interfaces sencillas para definir este tipo de configuración.

Popper, Popwin, shell-pop y vterm-toggle

  • Popwin y Popper parten de la observación de que no todos los buffers son iguales.
  • Estos paquetes permiten designar buffers emergentes que usan ventanas auxiliares, e invocar o cerrar esas ventanas según se necesite.

Lo que falta

window-tree

  • Existe una diferencia fundamental entre cómo Emacs representa las ventanas y cómo los enfoques discutidos arriba las manipulan.
  • Las ventanas de un frame están organizadas como un árbol: los nodos hoja son las ventanas "reales" y el resto son ventanas "internas".
  • Añadir comandos para trabajar con operaciones sobre el árbol de ventanas abriría muchas posibilidades nuevas.

Integrador con gestores de ventanas en mosaico

  • El modelo de árbol de ventanas de Emacs es casi idéntico al de gestores de ventanas en mosaico manuales como i3 o bspwm.
  • Surge de forma natural la pregunta de por qué usar otro gestor de ventanas en mosaico dentro de un gestor de ventanas en mosaico.
  • Sería mucho más fácil si Emacs ofreciera una interfaz más limpia y unificada para integrarse con todos los gestores de ventanas.

Perspectiva

  • Existen muchas formas de cambiar, mover, saltar, crear, eliminar y manipular ventanas; varias formas de controlar al vuelo cómo se muestran las ventanas al invocar comandos; y maneras de trabajar en ventanas sin tener que pensar en ellas en absoluto.
  • La gestión de ventanas no es tanto compleja como abierta.
  • Emacs proporciona los ingredientes y algunas instrucciones, y los ingredientes pueden usarse por sí solos como comida básica.
  • Pero con un poco de cocina, podemos preparar algo delicioso.

Opinión de GN⁺

  • La gestión de ventanas es una de las mayores debilidades de Emacs y no es amigable para el usuario. Especialmente para principiantes, puede resultar confusa.
  • Los métodos presentados pueden aliviar los problemas de gestión de ventanas en Emacs, pero no constituyen una solución fundamental. Se necesita un sistema de gestión de ventanas más intuitivo y fácil de usar.
  • La gestión de ventanas de Emacs es muy

1 comentarios

 
GN⁺ 2024-05-13
Comentarios en Hacker News

A continuación se presenta un resumen de los comentarios de Hacker News:

  • Se presenta un método para ajustar dos ventanas a un tamaño de 70% y 30% mediante una función personalizada de Elisp. También se incluye código Lisp.
  • Se sugiere probar paquetes como ace-window, ace-window-display-mode y frames-only-mode.
  • También hay una opinión de usar Emacs en modo de ventana única y, aunque inevitablemente se creen varias ventanas, hacer que se cierren automáticamente.
  • Se ofrece el consejo de activar windmove-mode y usar (windmove-default-keybindings 'control) para poder moverse entre ventanas con Ctrl+flechas.
  • Se presenta que, con el paquete zygospore, después de cerrar ventanas con C-x 1, si se vuelve a presionar C-x 1, se puede restaurar la disposición anterior de ventanas.
  • También hay un comentario que elogia la mención del editor Acme.
  • Se pregunta cómo, al ejecutar la función hledger-balance-sheet, dejar abierto el archivo journal a la izquierda y mostrar el resultado dividido al 30% a la derecha.