Frage
Ich möchte eine Benutzeroberfläche in Form eines Popup-Menüs erstellen , ein Popup-Menü ähnlich dem in Magit verwendeten .
Eigenschaften
Definition von Popup
Popup im Kontext dieser Frage bedeutet ein kleines temporäres Fenster, das eine Sammlung von Menüelementen enthält, sodass der Benutzer nur eines dieser Elemente auswählen kann.
Position auf dem Bildschirm
Das Popup darf in jedem Teil des Bildschirms angezeigt werden, es ist jedoch wünschenswert, dass es ganz offensichtlich ist und daher neben dem derzeit aktiven Fenster angezeigt wird.
Inhalt des Popup-Puffers
Elemente sollten in Form einer hübschen Tabelle angezeigt werden. Hübsch ist der Kontext der Frage bedeutet optisch ansprechend, dieser Effekt kann am einfachsten erzielt werden, indem Menüpunkte in gerade Reihen gesetzt werden, siehe
complete--insert-string
zum Beispiel. Dieser Absatz dient der zusätzlichen Klarstellung. Sie können dies auf Ihre eigene Weise tun. Dadurch wird Ihre Antwort nicht falsch.
Auswahl des Menüpunktes
Die Auswahl wird voraussichtlich durch einmaliges Drücken einer Taste oder optional mit einer Maus durchgeführt (obwohl dies nicht so wichtig ist, sind Antworten mit Aussagen, die keine Maus unterstützen, legal). Wenn Sie eine Lösung vorschlagen, die Maus unterstützt, beachten Sie bitte, dass der Benutzer in der Lage sein sollte, einen Menüpunkt auf intuitive Weise auszuwählen, dh indem Sie mit der linken Maustaste auf die gewünschte Auswahl klicken.
NB Maus kann auf viele Arten verwendet werden und alternative Möglichkeiten, um eine Auswahl anzuzeigen, sind ebenfalls willkommen.
Beseitigung von Popup
Sobald der Benutzer einen Menüpunkt auf die oben beschriebene Weise ausgewählt hat, sollte der Puffer und damit sein Fenster nicht mehr angezeigt und nicht mehr angezeigt werden. Das Fenster, das vor dem Aufrufen des Popup-Menüs aktiv war, sollte wieder fokussiert werden (dh aktiv werden).
Rückgabewert und Argumente
Vorzugsweise sollte diese Konsequenz von Aktionen dazu führen, dass ein Lisp-Objekt zurückgegeben wird. Das Lisp-Objekt kann entweder:
nil
- Dies zeigt an, dass der Benutzer das Popup-Menü entweder durch Drücken C-goder auf andere Weise abgebrochen hat †.string
- Zeichenfolge (es darf ein Symbol verwendet werden) solltestring-equal
eine der Zeichenfolgen sein, die im Popup-Menü als Sammlung der tatsächlichen Elemente angegeben sind.
Alternative Möglichkeiten, den Rest des Programms über die Wahl des Benutzers oder möglicherweise über dessen Abwesenheit zu informieren, sind akzeptabel. Wenn jedoch nicht klar ist, wie es sonst durchgeführt werden kann, bitte ich alle Antwortenden, zu improvisieren, und bitte mich nicht um weitere Klärung dieses Aspekts.
Dies ist alles für den zurückgegebenen Wert. Die Eingabeparameter sollten mindestens eine Sammlung von Zeichenfolgen enthalten, die mögliche Auswahlmöglichkeiten darstellen (dh Menüelemente).
Akzeptable Antworten
Die erwartete Antwort kann folgende Formen annehmen:
Ausreichendes Code-Snippet, mit dem gebildete Leser Funktionen wie die oben beschriebene schreiben können; Es ist nicht zu erwarten oder notwendig, die gesamte Arbeitsfunktion zu schreiben. Um jedoch Unsicherheiten zu vermeiden (können erhebliche Teile des Codes weggelassen werden?), Sollte ich beachten, dass fehlende Teile des Snippets in der Textkomponente der Antwort beschrieben werden sollten.
Ein Link zu einer vorhandenen Bibliothek, die ähnliche Funktionen implementiert. Um Unsicherheiten zu vermeiden, sollte ich beachten, dass in unserem Fall ähnlich bedeutet, dass die Bibliothek zum Erstellen von Popups (siehe Definition oben) verwendet werden kann, die mindestens zwei oder drei oben beschriebene Funktionen aufweisen. Wenn sich die vorgeschlagene Bibliothek von dem Punkt unterscheidet, an dem die zuvor angegebene Bedingung nicht erfüllt werden kann, wird jeder dieser Fälle unabhängig beurteilt und immer bewertet, wenn OP dies für nützlich hält.
Beschreibung der integrierten Emacs-Funktionen oder Funktionen von Drittanbietern, mit denen alle im Abschnitt «Funktionen» beschriebenen Funktionen implementiert werden können, siehe oben. Um zu vermeiden , Unsicherheit, bitte angeben klar , wie Ihre Antwort kann für zukünftige Leser nützlich sein , die implementieren möchten Popup , Popup - Menü ähnlich dem in Magit verwendet .
† Alternative Möglichkeiten zum Abbrechen des Popup-Menüs können Folgendes sein (sind jedoch nicht darauf beschränkt):
Klicken außerhalb des Popup-Menüfensters;
Töten des Puffers, der das Popup enthält, ohne eine Wahl zu treffen.
magit-popup
. Das neue Paket heißttransient
und wird in aktuellen Versionen von verwendetmagit
. Dokumentation finden Sie unter magit.vc/manual/transient .Hydras sind ziemlich einfach zu schreiben:
Hydra ist eine tastaturzentrierte Oberfläche und in ihrer Grundform nicht schwieriger als
easy-menu-define
(eingebaut). Und es ist ziemlich erweiterbar, wenn Sie es komplexer machen wollen.Schauen Sie sich diese Twitter-Oberfläche an. Das untere Fenster ist eine benutzerdefinierte Hydra, die nicht viel schwieriger zu schreiben ist als die oben genannte:
Der Code dafür ist im Wiki verfügbar , zusammen mit vielen weiteren Beispielen.
quelle
Nach einigen Recherchen habe ich eine Redewendung gefunden, mit der ein Fenster am unteren Rand (oder an einer beliebigen Stelle) des derzeit aktiven Fensters erstellt werden kann. Dies selbst hat die Wirkung eines temporären Hilfsfensters:
Sie können ein wenig mit dem
action
Argument spielen,with-current-buffer-window
ob das Popup in einem anderen Teil des Bildschirms angezeigt werden soll.Die Beendigungsfunktion wird in der Dokumentzeichenfolge von beschrieben
with-current-buffer-window
. Sie kann verwendet werden, um Eingaben vom Benutzer abzurufen. Wie @tarsius vorgeschlagen hat,read-char-choice
ist ein guter Kandidat zum Experimentieren.Der Popup-Puffer selbst kann wie jeder andere Puffer generiert werden. Ich denke immer noch an Schaltflächen, weil der Benutzer mit der Maus einen Eintrag im Popup-Menü auswählen kann, nicht nur die Tastatur. Dies erfordert jedoch zusätzlichen Aufwand, wenn Sie es gut machen möchten.
Wenn Ihr Popup etwas ad-hoc ist und Sie es nicht mehr als einmal benötigen, können Sie mit dieser Lösung davonkommen. Schauen Sie sich auch an
completion--insert-strings
. Ich fand es sehr nützlich als Beispiel dafür, wie man hübsche Reihen von Menüelementen generiert. Sie können es sogar unverändert verwenden, wenn Sie nichts Besonderes benötigen.quelle
Hier ist eine Lösung von Drittanbietern, die Eiszapfen verwendet .
Ihr Code öffnet ein Fenster mit den Kandidaten, die übersichtlich als Menü angeordnet sind. Wie, siehe unten.
Sie stellen jedem Menüpunkt ein eindeutiges Zeichen voran. ZB a, b, c ... oder 1, 2, 3 ... Der Benutzer drückt das Zeichen, um den Gegenstand auszuwählen.
Sie binden einige Variablen um einen Aufruf an
completing-read
. Sie übergeben ihm eine Liste Ihrer Menüpunkte. Sie können optional eines der Elemente als Standard festlegen, das ausgewählt wird, wenn der Benutzer nur trifftRET
.Die variablen Bindungen sagen
completing-read
:Sie können die Menüpunkte so ausgefallen gestalten, wie Sie möchten (nicht gezeigt).
mouse-3
Popup-Menü, um etwas mit dem Element zu tunSie können auch wirklich Multiple-Choice-Menüs erstellen, dh Menüs , in denen ein Benutzer mehrere Elemente gleichzeitig auswählen kann (wählen Sie eine Teilmenge der möglichen Auswahlmöglichkeiten).
quelle
Vielleicht interessiert Sie auch das Paket
makey
. Es soll ähnliche Funktionen bieten wiemagit-popup
, und es ist eine Abzweigung des Vorgängers vonmagit-popup
(magit-key-mode
, im Kommentar erwähnt) aus der Zeit, als es noch kein separat erhältliches Paket warmagit
.Lassen Sie mich auch erwähnen
discover
: Das ist ein Beispiel für die Verwendungmakey
(und auch die Existenzberechtigung). Dieses Paket soll Neulingen helfen, Emacs-Bindungen zu entdecken.Verweise
makey
unddiscover
von seinem Autor.magit-popup
Zeitpunkt, an dem ein eigenes Paket erstellt wurde.quelle
Guide-Key funktioniert für mich gut für alle konfigurierten Präfixe.
quelle
Basierend auf der Antwort von @ Drew (Eiszapfen) mit Änderungen, um die Menüimplementierung von den Menüdaten zu trennen, können mehrere Menüs mit jeweils eigenen definiert werden: (Inhalt, Eingabeaufforderung, Standard).
Hierbei wird optional Efeu verwendet (sofern verfügbar), das über erweiterte Funktionen verfügt, z. B. die Möglichkeit, Elemente zu aktivieren, während das Menü geöffnet bleibt.
Generisches Popup.
Beispiel: Weisen Sie der Taste f12 einige Aktionen zu:
quelle