Ich möchte manchmal Informationen im Hilfepufferstil anzeigen, daher habe ich folgenden Code verwendet:
(with-help-window (help-buffer)
(princ "Type q to exit this help buffer.\n\n")
(princ result))
Dies funktioniert gut, aber das Hilfefenster verwendet nur die Hälfte meines Frames. Normalerweise teile ich meinen Rahmen horizontal, um zwei hohe Fenster zu erhalten. Der angezeigte Hilfepuffer verwendet eines der beiden Fenster.
In einigen Fällen würde ich lieber den gesamten Frame verwenden, um mehr Informationen anzuzeigen und die Häufigkeit zu verringern, mit der ich die angezeigten Informationen durchblättern muss. Das zu lösende Problem besteht darin, den gesamten Frame vorübergehend für den with-help-window
Aufruf zu verwenden und die ursprünglichen Puffer / Fenstergrößen automatisch wiederherzustellen, wenn ich im Hilfefenster "q" eingebe.
Wie kann ich dieses Ziel am besten erreichen? Ich glaube, ich suche so etwas:
(with-FULL-FRAME-help-window (help-buffer)
...)
Ich habe mir den Winner-Modus, Lesezeichen, das Speichern von Layouts in Registern und die verschiedenen (und leistungsstarken, aber komplexen) (display-buffer ...)
Methoden angesehen. Die meisten von ihnen scheinen meiner gewünschten Absicht etwas zuwider zu sein, da sie dazu neigen, ein Layout nach einem Vollbild-Anzeigevorgang zu korrigieren / wiederherzustellen. Und es scheint mir, dass viele von ihnen erfordern, dass ich mein Fensterlayout manuell wiederherstelle (was ich lieber nicht tun würde).
Ich frage mich, ob jemand von einem Weg gehört hat, dies einfach zu lösen. Ich hoffe auf etwas Einfaches wie diese möglichen Ansätze, bei denen ich etwas mit einem Let-Frame überschreiben kann ...
(let ((help-window-width-display-option fullwidth))
(with-help-window (help-buffer)
...))
Oder diese Art von Ansatz, den ich noch nicht beherrsche und der für mein aktuelles Können etwas schwierig / knifflig aussieht.
(let ((save original configuration somehow)
(delete-other-windows)
(with-help-window (help-buffer)
...)
;; somehow, when I type "q" in the help buffer
;; - catch that action in code after the buffer is killed
;; - and restore the original window configuration
)
Es scheint mir, dass das Hauptproblem, das ich lösen muss, darin besteht, die ursprüngliche Fensterkonfiguration automatisch wiederherzustellen, wenn ich "q" in den temporären Hilfemodus-Puffer eingebe. Vielen Dank
display-buffer-pop-up-frame
: gnu.org/software/emacs/manual/html_node/elisp/... Eine weitere Idee Idee wäre ein zu erteilen ,make-frame
während Verwendungdisplay-buffer
mit einer benutzerdefinierten Funktion , um diesen neuen Rahmen Ziel. Wenn Sie daran interessiert sind, einen vorhandenen Frame zu finden und auf ihn abzuzielen,display-buffer-pop-up-frame
, da es ziemlich nahe an dem liegt, was ich suche. Aber ... der Frame erscheint an einer anderen Stelle (nicht in meinem aktuellen Frame), und ich muss ihn mit cmd-w versenden, nicht mit "q" im Hilfestil. Das Speichern / Wiederherstellen von Fensterkonfigurationen ist nicht das zugrunde liegende Problem. Derzeit neige ich dazu, die Quelle des With-Help-Fensters zu klonen und zu ändern, um ihr eine Option zu geben, die ich binden oder mit einem Defmacro oder etwas anderem umschließen kann. Ich lächle darüber, wie wählerisch wir Emacs sind, wenn es darum geht , genau das zu wollen , was wir von Emacs wollen.help-return-method
,quit-window
diequit-restore
Fensterparameter, und wahrscheinlich einige benutzerdefinierte Code zu setzen / alle diese Dinge verwenden , um die gewünschten Effekte zu erzeugen.Antworten:
Beispiel 1 : Die Tastenkombination
q
imhelp-mode
Puffer stammt von derspecial-mode-map
, die in die integriert isthelp-mode-map
. Der Standardwert istquit-window
, der nur vier (4) mögliche Aktionen bietet: " Gemäß den im Fensterparameter von WINDOW gespeicherten Informationenquit-restore
löschen Sie entweder (1) WINDOW und seinen Frame, (2) löschen Sie WINDOW, (3) stellen Sie den zuvor in WINDOW angezeigten Puffer wieder her , oder (4) lassen Sie WINDOW einen anderen Puffer als den aktuellen anzeigen. Wenn nicht Null, setzen Sie denquit-restore
Parameter auf Null zurück. "[Siehe doc-string:M-x describe-function RET quit-window RET
]Hier ist ein Überblick über die Funktionsweise dieses Beispiels:
Binden Sie die Variable
help-window-select
an,t
damit das*Help*
Fenster ausgewählt wird.Binden Sie die aktuelle Fensterkonfiguration an eine temporäre Variable namens
config
.Generieren Sie das
*Help*
Fenster.Speichern Sie die vorherige Fensterkonfiguration -
config
- in einer lokalen Variablen namensmy-stored-win-config
.Erstellen Sie eine lokale Schlüsselzuweisung für den Buchstaben
q
, an den gebunden istmy-restore-win-config
. [Diese lokale Zuordnung übertrumpft / beschattet die vorherige Zuweisung vonquit-window
.]Löschen Sie andere Fenster.
Drücken Sie den Buchstaben
q
, um die vorherige Fensterkonfiguration wiederherzustellen, und beenden Sie den*Help*
Puffer.Das folgende Snippet ist eine Beispielverwendung, jedoch keine vollständige interaktive Funktion. Es kann im
*scratch*
Puffer ausgewertet werden , um es in Aktion zu sehen.Beispiel 2 :
Hier ist ein in sich geschlossenes Makro, das alles wie im obigen Beispiel ausführt und drei mögliche Situationen in Bezug auf vorhandene Hook-Werte behandelt - z. B.
nil
Symbol oder Liste von Symbolen.Und hier ist das Beispiel-Snippet, das im
*scratch*
Puffer ausgewertet werden soll .quelle
my-help-quit
Funktion erstellt, während ich versuchte, den Help-Map-Schlüssel innerhalb von neu zu bindenwith-help-window
. Aber es hat nicht funktioniert. Ich sehe dich jetzt binden Sie den Schlüssel in dem Help - Puffer (nicht das Hilfefenster wie ich tat) , nachdem der Puffer eingerichtet ist. Ich denke, meine Bindung wurde durch das Puffer-Setup blockiert. Eine Lektion gelernt. Alles funktioniert jetzt. Danke vielmals.*Help*
Puffer zu reagieren, bevor dieser beendet ist - die,temp-buffer-window-setup-hook
die ausgeführt wird,help-mode-setup
und dann alles andere, was dem Hook bereits / zuvor zugewiesen wurde; und dann dastemp-buffer-window-show-hook
was läufthelp-mode-finish
und alles was schon / vorher dem hook zugeordnet ist.help-mode-setup
sollte zuerst in der Zeit bleiben, aber Sie könnten etwas dahinter hinzufügen, indem Sie einen der oben genannten Haken mit benutzerdefinierten Sachen binden. In diesem Szenario würden Sie nicht benötigenwith-current-buffer
.help-mode-setup
undhelp-mode-finish
, aber beide liefen, bevor der Puffer angezeigt wurde. Das Hauptproblem bestand darin, die Tastenkombination "q" umzuleiten, und Sie haben mir gezeigt, wie das im Puffer funktioniert (nicht im Fenster, was ich versucht habe). PS. Ich habe versucht, eine Lösung als zu schreiben(defmacro with-full-frame-help-window
, aber das Makro benötigt immer noch eine separate Funktion, um die Aktion "q" und die Fensterwiederherstellung durchzuführen. Ich werde meine abgeschlossenen Funktionen unten veröffentlichen.... (kill-buffer (current-buffer))))))
. Das Makro hat einen Puffernamen als Argument verwendet und " Help " beendet, sodass ein Problem auftreten kann, wenn der Aufrufer einen Puffer verwendet, dessen Name unterschiedlich ist. Ich habe mein Makro geändert, um denbuffer-name
Parameter zu entfernen , und denselben Puffer im defmacro generiert / beendet.Basierend auf der hervorragenden Antwort von @lawlist sind hier meine abgeschlossenen Funktionen für den nächsten Mann ...
Die lange Kette von Kommentaren oben führte mit fortgesetzter Hilfe von @lawlist zu dieser Version eines Makros, das keinen Puffernamen benötigt, die ursprünglichen Setup- / Show-Hook-Listen ordnungsgemäß behandelt und keine Probleme mit dem "q" verursacht "Taste in anderen Help - Modus Puffer.
Verwenden Sie das Makro folgendermaßen:
quelle