1 Punkte von GN⁺ 2024-05-13 | 1 Kommentare | Auf WhatsApp teilen

Überblick über die Emacs-Fensterverwaltung

Ruf und Potenzial der Fensterverwaltung

  • Die Fensterverwaltung von Emacs hat keinen guten Ruf
  • Das liegt größtenteils daran, dass sie ein sehr flexibles und fein granular aufgebautes Layout-System mit grober Steuerung kombiniert
  • Dadurch bleibt Raum, Werkzeuge zu entwickeln und zu nutzen, die bessere Metaphern und bessere Bedienmöglichkeiten für den Umgang mit Fenstern bieten

Grundlegende Optionen zur Fensterverwaltung

other-window und „nächstes Fenster“

  • other-window (C-x o) bietet die grundlegende Erfahrung zum Wechseln zwischen Fenstern
  • Es wird im Emacs-Tutorial vermittelt und funktioniert gut, wenn es nur wenige Fenster gibt
  • Die Fensterauswahl durchläuft den gesamten Frame (ungefähr) im Uhrzeigersinn

windmove

  • windmove ist eine integrierte Emacs-Bibliothek, um den Fokus abhängig von der Richtung zwischen Fenstern zu verschieben und Buffer zwischen Fenstern zu bewegen
  • Das ist eine Funktion, die Vim-Nutzer erwarten, und evil-mode-Nutzer verwenden Windmove in der Regel bereits
  • Man verwendet es, indem man windmove-left, -right, -up, -down auf Tasten bindet, die mit den Richtungen verknüpft sind

frames-only-mode

  • frames-only-mode erlaubt es, die Behandlung von Emacs-Fenstern dem Betriebssystem zu überlassen
  • Wenn alle Buffer in neuen Frames geöffnet werden, wird das zur Aufgabe des Window-Managers
  • Dadurch werden Emacs-Buffer im Grunde zu OS-Fenstern und können mit denselben Tasten verwaltet werden

winum-mode

  • Winum ist die natürliche Weiterentwicklung des Aufwands, zwischen n Fenstern zu wechseln: von O(n) (other-window) über O(√n) (windmove) zu O(1)
  • Es fügt der Mode-Line Fensternummern hinzu, sodass Fenster per Nummer ausgewählt werden können
  • Wenn der Minibuffer aktiv ist, wird ihm immer die Nummer 0 zugewiesen

ace-window

  • ace-window ist die Königsklasse der tastaturbasierten Emacs-Fenstersteuerung
  • Es platziert „Hinweise“ am oberen Rand jedes Fensters, und nach Eingabe der entsprechenden Taste wechselt der Fokus zu diesem Fenster
  • Es „wählt“ Fenster auf allgemeine Weise aus, und der Nutzer entscheidet anschließend, was mit diesem Fenster geschehen soll
  • Zusätzlich zu eingebauten Aktionen wie Fenster löschen, verschieben oder austauschen, teilen oder Buffer anzeigen lassen sich auch benutzerdefinierte Aktionen hinzufügen

Verwendung der Maus

  • Die Vorteile der Maus für die Fensterverwaltung sind unmittelbar und offensichtlich
  • Ein Fenster auszuwählen ist eine natürliche Erweiterung der grundlegenden Mausnutzung, und das Ändern der Fenstergröße ist einfach
  • Kontextmenüs und Drag-and-Drop-Unterstützung sind sehr intuitiv
  • Um die Nachteile abzumildern: Wenn die Maus ohnehin bereits für andere Aufgaben genutzt wird, ist die Bedienung von Emacs mit der Maus tatsächlich oft der Weg des geringsten Widerstands

transpose-frame (drehen, spiegeln und kippen)

  • transpose-frame bietet Befehle, um das Fensterlayout in einem Frame zu drehen oder zu spiegeln
  • rotate-frame, flip-frame, flop-frame werden häufig verwendet, wenn sie auf passende Tasten gebunden sind

window-prefix-map

  • window-prefix-map ist standardmäßig an C-x w gebunden und bündelt einige nützliche Befehle zur Fensterverwaltung
  • split-root-window-right und split-root-window-below teilen das Root-Fenster eines Frames
  • tab-detach und tear-off-window sind praktische Befehle, um ein Fenster in einen neuen Tab oder einen neuen Frame zu verschieben

other-window-prefix

  • other-window-prefix bietet eine Möglichkeit, die Fensterauswahl von der Buffer-Anzeige zu entkoppeln, und löst drei Unannehmlichkeiten rund um Fenster
  • Viele Emacs-Befehle koppeln Standardaktion, Buffer und Fenster eng miteinander. Mit other-window-prefix kann der Buffer eines Befehls in einem anderen Fenster angezeigt werden
  • Mit other-window-prefix kann beim Aktivieren von Objekten wie Links das Ziel-Fenster ausgewählt werden
  • Mit other-window-prefix lassen sich „Link“-Objekte einheitlich öffnen, ohne sich an die Arbeitsweise jedes Paketautors anpassen oder sie anpassen zu müssen

Fensterkonfiguration speichern und wiederherstellen

  • window-configuration-to-register ist ein etwas stumpfes Werkzeug, aber perfekt als großer roter Reset-Knopf
  • Mit diesem Befehl kann jederzeit die aktuelle Fensterkonfiguration in einem Register gespeichert und anschließend mit jump-to-register wiederhergestellt werden
  • Mit winner-mode kann Emacs einen Stack früherer Fensteranordnungen verwalten

Tiefergehende Betrachtung

Vor und zurück wechseln

  • Unabhängig davon, wie viele Fenster gleichzeitig offen sind, muss man in den meisten Fällen nur zwischen zwei Fenstern wechseln
  • Mit dem Befehl other-window-mru kann zwischen Fensterpaaren umgeschaltet werden

other-window verbessern

  • other-window kann so angepasst werden, dass es den Frame teilt, wenn nur ein einzelnes Fenster vorhanden ist
  • Es kann Fenster nach der zuletzt erfolgten Nutzung statt nach räumlicher Reihenfolge durchlaufen (switchy-window-Paket)
  • Die Wechselfolge kann bei jedem Aufruf umgekehrt werden, sodass sich natürlich zwischen zwei Fenstern alternieren lässt

Fenstermagie mit ace-window-Dispatch nutzen

  • ace-window verhält sich zu Fenstern so, wie completing-read zu Listen von Strings
  • aw-select ist ideal für die ersten beiden der drei Schritte — Filtern und Auswählen — um jede Aktion auf jedes Fenster anzuwenden
  • Mit ace-window-one-command kann man per ace-window ein Fenster auswählen und dann jeden einfachen Befehl in diesem Fenster ausführen
  • ace-window-prefix ähnelt other-window-prefix, erlaubt aber die explizite Auswahl des Fensters, in dem der Buffer des nächsten Befehls angezeigt werden soll

Muss man überhaupt Fenster wechseln?

  • Fensterunabhängige Navigation mit Avy ist ein Spezialfall einer allgemeineren Idee
  • Fenster als Textcontainer könnten eine unnötige Abstraktion sein
  • mark-ring und global-mark-ring verfolgen besuchte Positionen, sodass man bei Bedarf fensterübergreifend navigieren kann
  • Mit point-to-register und jump-to-register lassen sich Positionen, zu denen man später springen möchte, manuell festhalten
  • Das Erstellen und Anspringen von Lesezeichen bietet viele Möglichkeiten, fensterübergreifend zu bedeutungsvollen Positionen zu navigieren, die Emacs oder der Nutzer markiert haben

Fenster behandeln, ohne mit Fenstern zu interagieren

  • Mit display-buffer-alist und automatischem Fensterverhalten lässt sich das Problem der Whac-A-Mole-Fenster lösen
  • Wenn Regeln für alle Buffer-Typen festgelegt werden, die man täglich in Emacs sieht, ist der Großteil der Fensterverwaltung bereits gelöst
  • Das Problem von display-buffer-alist ist nicht, dass es nicht funktioniert, sondern dass es viel Arbeit erfordert
  • Das Paket Shackle überdeckt die Eigenheiten von display-buffer-alist und bietet eine vereinfachte Elisp-Schnittstelle zum Festlegen von Fensterregeln
  • Emacs-Distributionen bieten in der Regel einfache Oberflächen, um solche Einstellungen festzulegen

Popper, Popwin, shell-pop und vterm-toggle

  • Popwin und Popper basieren auf der Beobachtung, dass nicht alle Buffer gleich sind
  • Mit diesen Paketen können Popup-Buffer definiert werden, die Hilfsfenster verwenden und bei Bedarf ein- und ausgeblendet werden können

Was fehlt

window-tree

  • Es gibt einen grundlegenden Unterschied zwischen der Art, wie Emacs Fenster intern darstellt, und der Art, wie Fenster mit den oben diskutierten Ansätzen manipuliert werden
  • Die Fenster eines Frames sind als Baum organisiert; die Blattknoten sind die „echten“ Fenster, der Rest sind „interne“ Fenster
  • Das Hinzufügen von Befehlen für Operationen auf dem Fensterbaum würde viele neue Möglichkeiten eröffnen

Integrator für Tiling-Window-Manager

  • Das Fensterbaum-Modell von Emacs ist nahezu identisch mit dem Modell manueller Tiling-Window-Manager wie i3 oder bspwm
  • Dadurch stellt sich ganz natürlich die Frage, warum man einen weiteren Tiling-Window-Manager innerhalb eines Tiling-Window-Managers verwenden sollte
  • Eine sauberere und einheitlichere Schnittstelle in Emacs zur Integration mit beliebigen Window-Managern könnte vieles deutlich einfacher machen

Ausblick

  • Es gibt viele Möglichkeiten, Fenster zu wechseln, zu bewegen, zu überspringen, zu erzeugen, zu löschen und zu manipulieren, verschiedene Methoden, die Fensteranzeige beim Aufruf von Befehlen spontan zu steuern, Wege, in Fenstern zu arbeiten, und sogar Wege, überhaupt nicht über Fenster nachzudenken
  • Fensterverwaltung ist weniger kompliziert als vielmehr offen
  • Emacs liefert die Zutaten und einige Hinweise, und die Zutaten können für sich genommen bereits als einfache Mahlzeit dienen
  • Mit ein wenig Zubereitung lässt sich daraus jedoch etwas Köstliches machen

Meinung von GN⁺

  • Die Fensterverwaltung ist eine der größten Schwächen von Emacs und nicht benutzerfreundlich. Besonders für Einsteiger kann sie verwirrend sein.
  • Die vorgestellten Methoden können die Probleme der Emacs-Fensterverwaltung abmildern, stellen aber keine grundlegende Lösung dar. Es braucht ein intuitiveres und leichter nutzbares System zur Fensterverwaltung.
  • Die Fensterverwaltung von Emacs ist sehr u

1 Kommentare

 
GN⁺ 2024-05-13
Hacker-News-Kommentare

Im Folgenden eine Zusammenfassung der Kommentare auf Hacker News:

  • Es wird gezeigt, wie sich zwei Fenster mit einer benutzerdefinierten Elisp-Funktion auf 70 % zu 30 % Größe anpassen lassen. Lisp-Code wird ebenfalls bereitgestellt.
  • Es wird vorgeschlagen, Pakete wie ace-window, ace-window-display-mode und frames-only-mode auszuprobieren.
  • Einige nutzen Emacs im Single-Window-Modus und sorgen dafür, dass unvermeidlich geöffnete mehrere Fenster automatisch wieder geschlossen werden.
  • Es wird der Tipp gegeben, windmove-mode zu aktivieren und mit (windmove-default-keybindings 'control) die Fensterbewegung per Strg+Pfeiltasten zu ermöglichen.
  • Es wird erklärt, dass man mit dem Paket zygospore nach dem Schließen eines Fensters mit C-x 1 durch erneutes Drücken von C-x 1 das vorherige Fensterlayout wiederherstellen kann.
  • Es gibt auch einen Kommentar, der die Erwähnung des Acme-Editors lobt.
  • Es wird gefragt, wie sich beim Ausführen der Funktion hledger-balance-sheet die Journal-Datei links geöffnet halten lässt, während das Ergebnis rechts in einer auf 30 % geteilten Ansicht angezeigt wird.