Wenn Sie an einem maximierten Emacs-Frame arbeiten, ist der Inhalt des Minibuffer / Echo-Bereichs am unteren Rand des Bildschirms möglicherweise nur schwer zu erkennen, verliert jedoch beim Eingeben eines Befehls den Fokus auf den zu bearbeitenden Text Problem in Bezug auf die Benutzerfreundlichkeit.
Gibt es eine Möglichkeit, den Minibuffer / Echo-Bereich in der Mitte des aktuellen Emacs-Puffers über den zu bearbeitenden Text zu verschieben, wenn der Minibuffer aktiv ist, oder besser den Inhalt des Minibuffers zu erfassen und ihn auch in der Mitte anzuzeigen? des aktuellen Puffers während der Eingabe des Befehls?
minibuffer
Sébastien Le Callonnec
quelle
quelle
Antworten:
Popup Minibuffer in der Mitte
So können Sie genau das tun, was Sie gefragt haben: Zeigen Sie den Minipuffer in der Mitte des Bildschirms an .
Das ist relativ einfach zu erreichen und wird mit dem
oneonone.el
Paket geliefert (wie @Drew hervorhebt). Das Problem bei diesem Ansatz ist, dass der Minipuffer auch für Nachrichten verwendet wird, so dass es nicht sehr praktisch ist, ihn versteckt zu halten. Keine Sorgen machen! Ich habe eine andere Lösung gefunden.Implementierung
Um dies zu implementieren, müssen wir den Minibuffer-Frame beim Start von emacs erstellen.
Dann patchen wir
read-from-minibuffer
, um diesen zweiten Minibuffer anstelle des Minibuffers des ursprünglichen Frames zu verwenden.Dies könnte nicht mit absolut alles funktioniert, aber es funktionierte auf alles , was ich bisher versucht ---
find-file
,ido-switch-buffer
,eval-expression
. Wenn Sie tun , alle Ausnahmen finden, können Sie diese Funktionen auf einer Fall-zu-Fall - Basis Patch durch den Aufrufuse-popup-minibuffer
auf sich.Position in der Nähe des Punktes
Um diesen Minipufferrahmen in der Nähe der Höhe des Punktes zu positionieren, definieren Sie einfach so etwas wie die folgende Funktion. Es ist nicht perfekt (in der Tat ist es in vielen Fällen schrecklich), aber es leistet gute Arbeit bei der Schätzung der Punkthöhe.
quelle
(setf (symbol-function function) ...)
es besser,advice-add
(oder die älteread-add-advice
) zu verwenden.Minipuffer oben
Die Anzeige des Minipuffers in der Mitte des Bildschirms ist kompliziert. Eine sinnvolle Alternative (die Sie vielleicht besser lesen können oder auch nicht) besteht darin, sie nach oben zu verschieben.
Sie können die Position (oder das Vorhandensein) des Minipuffers eines Frames mit dem
minibuffer
Frame-Parameter in derinitial-frame-alist
Variablen konfigurieren .Separater Rahmen
Wenn Sie den Parameter so
nil
einstellen, dass der Frame keinen Minibuffer enthält, erstellt Emacs automatisch einen separaten Minibuffer-Frame für Sie. Sie können diese beiden Frames mit dem Fenstermanager Ihres Betriebssystems oder über Emacs positionieren.Das folgende Snippet zeigt, wie Sie den Minibuffer-Frame oben platzieren. Der reguläre Frame befindet sich direkt darunter. Sie müssen die Zahlen jedoch auf jeden Fall ändern, um die Monitorgröße zu berücksichtigen.
Am schnellsten können Sie dies anpassen, indem Sie die Größe der Frames in Ihrem Fenstermanager ändern und dann auswerten
(frame-parameters)
, um die von Ihnen eingegebenen Parameterwerte anzuzeigen.Gleicher Frame
Eine andere Möglichkeit besteht darin, den
minibuffer
Parameter auf ein Fenster zu setzen. Leider konnte ich dies nicht für ein Fenster im selben Frame zum Laufen bringen.quelle
Die Bibliothek
oneonone.el
bietet Ihnen dies sofort.1on1-minibuffer-frame-top/bottom
Passen Sie die Option einfach an die Position an, die Sie für den Standalone-Minipufferrahmen wünschen. Der Wert ist die Anzahl der Pixel von der Oberseite (falls nicht negativ) oder der Unterseite (falls negativ) Ihrer Anzeige. Stellen Sie den Wert beispielsweise auf Ihre Bildschirmhöhe geteilt durch 2 ein, um ihn vertikal zu zentrieren.Wenn Sie stattdessen möchten, dass es dynamisch positioniert wird, beispielsweise in der vertikalen Mitte des aktuellen Frames, können Sie dies tun, indem Sie (a)
1on1-minibuffer-frame-top/bottom
= verlassennil
und (b) die Funktion1on1-set-minibuffer-frame-top/bottom
anweisen, diese Variable dynamisch an die entsprechende Position zu binden. Beispielsweise:(Definieren Sie die Funktion
my-dynamic-position
zur Berechnung der gewünschten Position anhand der gewünschten Kriterien (aktuelle Fenster- / Rahmengröße und -position, Mondphase, ...).quelle