Geteiltes Fenster am äußersten Rand

8

Ich suche nach einer Möglichkeit, einer vorhandenen (geteilten) Fensterkonfiguration eine neue Fensteraufteilung in voller Höhe hinzuzufügen. Da ich nicht weiß, wie ich es richtig erklären soll, werde ich nur einige ASCII-Grafiken veröffentlichen, die das gewünschte Verhalten für zwei Beispielfensterkonfigurationen zeigen:

             from                              to  

  +-------------------------+      +---------------------+---+  
  |                         |      |                     |   |  
  |                         |      |                     |   |  
  |            A            |  =>  |           A         | E |  
  |                         |      |                     |   |  
  |                         |      |                     |   |  
  +-------------------------+      +---------------------+---+  

  +------------+------------+      +----------+----------+---+  
  |            |     B      |      |          |   B      |   |
  |     A      +------------+      |     A    +----------+   |
  |            |     C      |  =>  |          |   C      | E | 
  +------------+------------+      +----------+----------+   |
  |            D            |      |          D          |   |
  +-------------------------+      +---------------------+---+  

wo übernimmt die Funktion die gewünschte Breite des neuen Fensters Eund schrumpft die Breiten A, B, C, und sich Dentsprechend. Bearbeiten2 : Beachten Sie, dass die beiden obigen Zeichnungen Beispiele für das erwartete Verhalten für einen konkreten Fall sind. Ich suche nach einer allgemeinen Funktion, die dies unabhängig von der Konfiguration in der from- Spalte ausführt (dh die Anzahl der Fenster [Teilungen] in der from-Spalte sollte beliebig sein).

Ich suche diese Funktionalität auch auf der linken Seite und oben und unten in einem Rahmen.

Bearbeiten: Aus @ Nsukamis Kommentar wurde mir klar, dass die Funktionalität, die ich suche, ein Sonderfall eines abstrakteren Problems ist. Also werde ich dieses Problem formulieren:

Wie speichert man eine Fensterkonfiguration (bestehend aus einer beliebigen Anzahl von Fenstern und Puffern) und "fügt" die gespeicherte Konfiguration in ein vorhandenes Fenster ein?

Das "Einfügen" sollte dann die relativen Fenstergrößen und die Aufteilung beibehalten; Natürlich ist die resultierende eingefügte Konfiguration eine skalierte Kopie.

elemakil
quelle
Das erste Verhalten kann erhalten werden, indem das Größenargument an split-window-rightas übergeben wird C-u -width C-x 3. Ändern Sie das widthzu was Sie wollen und notieren Sie das negative Vorzeichen.
Vamsi
Ich denke darüber nach, einige Layouts vorab zu definieren, bin mir aber nicht sicher.
Nsukami _
@Nsukami_ Ist es möglich , ein Fenster - Layout zu speichern (zB das Layout A, B, C, und D) und dann Einsatz dieses Layouts in ein neues Fenster? Dann könnte mein Problem gelöst werden, indem 1) die aktuelle Fensterkonfiguration gespeichert wird, 2) das Layout so geändert wird, dass nur ein Fenster angezeigt wird, das dann horizontal geteilt wird [im Wesentlichen das Fenster für Eund das Platzhalterfenster für die anderen bilden, nennen wir es Z], 3 ) Endlich Einfügen des ursprünglichen Layouts in das linke Fenster ( Z)
elemakil
Sie müssen das Layout vor dem Einfügen anpassen, da diese auch die Fenstergrößen enthalten. Auch das Einfügen eines Layouts in ein bestimmtes Fenster ist ohne benutzerdefiniertes elisp AFAIK
Vamsi

Antworten:

5

Die folgende Funktion sollte tun, was Sie wollen. Der Trick besteht darin, das Stammfenster des aktuellen Frames zu teilen.

(defun my-split-main-window (direction size)
  "Split the main window in the DIRECTION where DIRECTION is a symbol with
possible values of right, left, above or below and SIZE is the final size of the
windows, if the window is split horizontally (i.e. in DIRECTION below or above)
SIZE is assumed to be the target height otherwise SIZE is assumed to be the
target width"
  (let* ((new-window (split-window (frame-root-window) nil direction))
         (horizontal (member direction '(right left))))
    (save-excursion 
      (select-window new-window)
      (enlarge-window (- size (if horizontal
                                  (window-width)
                                (window-height)))
                      horizontal))
    new-window))

Rufen Sie die Funktion mit der Richtung auf, in die Sie das Fenster und die Größe des neuen Fensters teilen möchten. Das obige gibt das neu erstellte Fenster zurück. Das Konzept sowie die Fenster und Rahmen werden im GNU Emacs Lisp-Referenzhandbuch sehr gut erklärt .

Iqbal Ansari
quelle
Perfekt! Das ist genau das, was ich wollte.
Elemakil
0

Ich bin mir nicht sicher, ob die beste Lösung, da sie nicht ausreichend abstrahiert ist, tatsächlich nur einen Anwendungsfall löst. Der Trick besteht darin, eine Funktion zu schreiben, um von layoutX zu layoutY zu wechseln, und eine andere, um von layoutY zu layoutX zu wechseln

(defun from-x-to-y ()
 (interactive)
 (delete-other-windows)
 (split-window-vertically) ;;
 (let ((current-prefix-arg 10)) ;; emulate C-u
   (call-interactively 'enlarge-window) ;; resize
   )
 (split-window-horizontally) ;; -> |
 (next-multiframe-window)
 (split-window-vertically) ;;  -> --
 (previous-multiframe-window)
)

(defun from-y-to-x ()
  (interactive)
  (delete-other-windows)
  (split-window-horizontally) ;; -> |
  (let ((current-prefix-arg -60)) ;; emulate C-u
    (call-interactively 'shrink-window-horizontally) ;; resize
    )
  (split-window-vertically) ;; -> --
  (let ((current-prefix-arg 10)) ;;
    (call-interactively 'enlarge-window) ;;
    )
  (split-window-horizontally) ;;
  (next-multiframe-window)
  (split-window-vertically) 
  (previous-multiframe-window)
)

Ich hoffe, dass diese Lösung helfen wird

Wie speichert man eine Fensterkonfiguration (bestehend aus einer beliebigen Anzahl von Fenstern und Puffern) und "fügt" die gespeicherte Konfiguration in ein vorhandenes Fenster ein?

Ich habe gerade ein Paket mit dem Namen layout.el gefunden . Ich habe es noch nie verwendet, aber es scheint das zu sein, wonach Sie suchen. Sie werden uns sagen, ob es in Ordnung ist.

BEARBEITEN:

Wenn Sie versuchen, eine allgemeinere Lösung zu finden, können Sie anscheinend M-x switch-to-buffer-other-framevon einem Puffer in einem Frame, beispielsweise mit einem Layout X, zu einem anderen Puffer in einem anderen Frame mit einem Layout Y wechseln.

Sie können sich auch in einem Layout X befinden, dieses Layout in einem Register speichern C-x r f(Frame-Konfiguration-zu-Register), zu einem anderen Layout wechseln und bei Bedarf zum vorherigen zurückschalten und das, was sich im Register befindet, aufrufen C-x r j (jump- zu registrieren)

Nsukami _
quelle
Soweit ich das beurteilen kann, layout.elgeschieht Folgendes winner: (erneutes) Speichern der Fensterkonfiguration des gesamten Frames, nicht Speichern der vollständigen Konfiguration und Wiederherstellen in einem vorhandenen Fenster. Die Funktion, die Sie andererseits geschrieben haben, sind in der Tat nicht die allgemeinen Lösungen, nach denen ich suche. Sie lösen mein zweites Beispiel, das nicht als konkretes Problem gedacht war, sondern nur als Beispiel. Ich suche nach einer Lösung, die im allgemeinen Fall funktioniert.
Elemakil
Immer noch graben, und ich denke, die allgemeine Lösung könnte sein, switch-to-buffer-other-framewenn 'von' ein Rahmen und 'bis' ein anderer Rahmen ist
Nsukami _