Wie kann ich verhindern, dass ein Frame geteilt wird?

16

Zur Zeit arbeite ich mit ruby ​​und rspec. Ich mag die Idee wirklich, einen separaten Frame in einem anderen Monitor zu haben, der mir den Kompilierungspuffer zeigt. Mein aktuelles Setup verwendet einen 'Code'-Frame (in dem ich die eigentliche Arbeit erledige) und einen' Testergebnis'-Frame (in dem ich die angegebenen Ergebnisse sehe).

Das Problem ist, dass wenn ich versuche, einen Kompilierungsfehler oder eine Datei im Rahmen "Testergebnis" zu öffnen, das Fenster in diesem Rahmen geteilt wird. Was ich wirklich gerne tun würde, ist, dass es in meinem 'Code'-Frame geöffnet wird.

Ich nutze die Option bereits display-buffer-reuse-frames. Ich habe auch versucht, das Fenster mit den Kompilierungsergebnissen festzulegen dedicated, aber wenn Emacs versuchen, ein neues Fenster zu öffnen, wird ein neuer Rahmen erstellt (was besonders schrecklich ist, wenn Sie Helm verwenden).

Gibt es einen einfachen Weg, dies zu erreichen?

Renan Ranelli
quelle
1
Die Verwendung von Emacs als IDE wäre um einiges praktischer, wenn ein Puffer einfach "angeheftet" werden könnte, sodass er von nun an immer an der gleichen Stelle angezeigt wird. Eine der Visual Studio-Funktionen, die ich bei der Verwendung von Emacs am meisten vermisse, ist die einfache und intuitive Möglichkeit, Fenster zu teilen, anzuheften, anzukoppeln, auszublenden und auf andere Weise zu bearbeiten.
Nispio
1
Ja. Ich komme auch aus einem Vs-Hintergrund, und das vermisse ich auch, obwohl ich der Meinung bin, dass Emacs Clean-No-Button-No-Bullshit-Oberfläche die meiste Zeit besser ist.
Renan Ranelli
@nispio Ich verwende kein VS, also kannst du angeben, was du mit "pin" meinst. Emacs-Frames sind normalerweise exklusiv und ändern sich nur, wenn Sie mit ihnen interagieren.
Vamsi
@vamsi: VS verwendet viele kleine Fenster, die Sie oben / unten / an den Seiten Ihres Rahmens anbringen können, oder Sie können sie herausziehen und einen neuen Rahmen erstellen. Sie können ein Fenster an den Rändern eines Rahmens andocken und so einstellen, dass es automatisch ausgeblendet wird. Beispielsweise wird das Kompilierungsausgabefenster beim Start der Kompilierung auf magische Weise von unten eingeblendet und versteckt sich kurz nach dem Ende der Kompilierung wieder. Wenn Sie nicht möchten, dass das Fenster automatisch ausgeblendet wird, können Sie es an der richtigen Stelle anheften und dann wieder abheften, wenn Sie mit dem Referenzieren fertig sind.
Nispio
@nispio Ich verstehe. Ich benutze popwin.elMELPA, um Popup-Kompilierungs- und Hilfspuffer aufzurufen, die bestehen bleiben, bis C-ggedrückt wird. Wenn ich sie ganztägig brauche, wechsle ich einfach in einem anderen Fenster zu ihnen. Ich habe nicht daran gedacht, Fenster festzunageln, weil Emacs es tut split-windows-sensibly.
Vamsi

Antworten:

9

Sie müssen den 600-Pfund-Gorilla konfigurieren, display-buffer-alistder festlegt, display-bufferwo ein Puffer angezeigt werden soll. Es macht display-buffer-reuse-framesin neueren Emacsen obsolet. Hier ist eine Konfiguration, die Sie führen sollte (zumindest in Emacs 24.3).

;; all buffers, try to reuse windows across all frames
(add-to-list 'display-buffer-alist
           '(".*". (display-buffer-reuse-window .
                                  ((reusable-frames . t)))))

;; except for compilation buffers where you want new and dedicated frames when necessary
(add-to-list 'display-buffer-alist
         '("^\\*Compile-Log\\*". ((display-buffer-reuse-window
                                   display-buffer-pop-up-frame) .
                                  ((reusable-frames . t)
                                  (inhibit-same-window . t)))))

Wie Sie sehen, verwende ich einen regulären Ausdruck, um den Kompilierungsprotokollpuffer abzugleichen. Die Dokumentation von display-buffersoll Ihnen eine Vorstellung davon geben, was gerade passiert. Nur ein Hinweis darauf, dass es nicht die unterhaltsamste Dokumentation ist, die Sie jemals lesen werden. Ich habe sie der Reihe nach hinzugefügt, damit der reguläre Ausdruck des Kompilierungsprotokolls vor dem generischen regulären Ausdruck abgeglichen wird. Passen Sie den regulären Ausdruck an Ihre Bedürfnisse an.

BEARBEITEN Um einen Frame nicht teilbar zu machen, können Sie ihn M-: (set-frame-parameter nil 'unsplittable t)in diesem Frame auswerten . Ersetzen Sie nil durch erforderlich, FRAMEwenn Sie dies von elisp aus tun. Zwischen diesen beiden Einstellungen sollte der Kompilierungsrahmen exklusiv sein, es sei denn, Sie finden ausdrücklich eine Datei in diesem Rahmen.

Vamsi
quelle
Die Sache ist, dass ich nicht die ganze Zeit neue Frames öffnen möchte. Ich möchte, dass alle Fenster auf den 'Code'-Frame beschränkt werden, mit Ausnahme des' Compilation-Log'-Puffers, der immer im 'Test'-Frame angezeigt werden soll. Ich konnte keine Möglichkeit finden, alle neuen Fenster auf meinen Hauptcode-Frame umzuleiten. Vielleicht war ich in der Frage nicht klar genug = (
Renan Ranelli
Dies sollte nur dann einen neuen Frame für das Kompilierungsprotokoll öffnen, wenn noch kein Frame vorhanden ist. Kannst du mir sagen, was los ist? Siehe Bearbeiten, wie ein Frame nicht mehr teilbar ist.
Vamsi