Zwischen Fensterlayouts wechseln

24

Wenn ich ein benutzerdefiniertes Layout konfiguriere und dann nur vorübergehend in eine Datei im Vollbildmodus schauen muss und dieses Layout wieder angezeigt werden soll, muss es manuell neu formatiert werden.

Ich möchte einen Plugin / Elisp-Code, um meine Layouts zu speichern und zwischen gespeicherten Layouts wechseln zu können.

AKTUALISIEREN

Danke euch allen.

Der Vorschlag von abo-abo , den Gewinnermodus zu verwenden, ist wirklich nett und ich habe es in null Zeit zum Laufen gebracht.

Wasamasa schlug eine Reihe großartiger Plugins vor, von denen ich noch nie gehört habe, und lieferte Informationen zur Verwendung von Registern.

Jordon Biondo erklärte mir den Umgang mit den Registern und dieses Zeug wollte ich eigentlich auf einfachste Weise.

Danke euch allen.

lukas.pukenis
quelle

Antworten:

23

Der eingebaute Weg, dies zu tun, ist mit Registern.

Zum Beispiel C-xrwazum Speichern der aktuellen Fensterkonfiguration zum Registrieren von a.

Dann können Sie die eingebaute Bindung C-x1zum Ausführen verwendendelete-other-windows

Nachdem Sie die einzelne Datei angesehen haben, kehren Sie mit C-xrjazu der gespeicherten Fensterkonfiguration in Register a zurück.

Zusamenfassend:

C-xrwa (Konfiguration im Register speichern)

C-x1 (andere Fenster löschen)

C-xrja (gespeicherte Fensterkonfiguration erneut anwenden)


Ich finde Register jedoch unhandlich. Ich verwende einen benutzerdefinierten Fenster-Konfigurationsstapel, um meine Konfigurationen zu verwalten.

Ich habe zwei Bindungen, die die aktuelle Konfiguration auf den Stapel schieben und die oberste Konfiguration einfügen und anwenden.

In Ihrem Szenario würde ich also zuerst meine Push-Bindung, dann Cx 1 und dann meine Pop-Bindung ausführen.

Hier ist der Code:

(defvar winstack-stack '()
  "A Stack holding window configurations.
Use `winstack-push' and
`winstack-pop' to modify it.")

(defun winstack-push()
  "Push the current window configuration onto `winstack-stack'."
  (interactive)
  (if (and (window-configuration-p (first winstack-stack))
         (compare-window-configurations (first winstack-stack) (current-window-configuration)))
      (message "Current config already pushed")
    (progn (push (current-window-configuration) winstack-stack)
           (message (concat "pushed " (number-to-string
                                       (length (window-list (selected-frame)))) " frame config")))))

(defun winstack-pop()
  "Pop the last window configuration off `winstack-stack' and apply it."
  (interactive)
  (if (first winstack-stack)
      (progn (set-window-configuration (pop winstack-stack))
             (message "popped"))
    (message "End of window stack")))

Anschließend können Sie binden winstack-pushan so etwas wie C-cC-u, und winstack-popzu C-cC-oleicht zu springen herum.

Jordon Biondo
quelle
Das ist sehr sehr sehr schön!
lukas.pukenis
20

Ich benutze winner-mode. Hier ist mein Setup:

(winner-mode)
(global-set-key [f7] 'winner-undo)
(global-set-key [C-f7] 'winner-redo)
(global-set-key [f9] 'delete-other-windows)
(global-set-key [C-f9] 'delete-window)

Ich weiß nicht, ob es eine Möglichkeit gibt, ein Layout oder etwas mit einem Lesezeichen zu versehen, aber es reicht mir aus, ständig zum vorherigen Layout zurückzuschalten.

abo-abo
quelle
Wow, nur in der Lage zu sein, zum vorherigen Layout zurückzukehren, bringt mir eine Menge. Vielen Dank!
lukas.pukenis
11

Emacs bietet Register zum Speichern und Anwenden von Daten wie Ihrer aktuellen Fensterkonfiguration. Dies kann mit C-x r wund erfolgen C-x r j. Dieser Ansatz wird jedoch unhandlich, da Sie sich die Fensterregister merken müssen.

Es gibt einige Pakete, um dies zu verbessern. iregister macht diese grundlegende Funktion inspizierbarer und interaktiver. Die anderen, von denen ich weiß, dass sie die Register nicht beeinflussen, wie z. B. elscreen und escreen, die die Kopfleiste zum Anzeigen von Registerkarten verwenden. Arbeitsgruppen und Arbeitsgruppen2 sind zwei neuere und umfassendere Ansätze für dieses Problem. Ich persönlich mochte auch nicht und schrieb daher meine eigene , die irgendwo dazwischen liegt und hoffentlich weniger Bugs und Komplexität hat.

Wasamasa
quelle
Das ist großartig an Registern, aber wie soll ich sie in diesem Fall verwenden? Ich werde die Plugins überprüfen, die du aufgelistet hast, um zu sehen, ob sie für mich erfolgreich sind :)
lukas.pukenis
Sie speichern Ihr aktuelles Layout in einem Register, nehmen einige Änderungen vor und stellen das Layout aus dem Register wieder her, sobald Sie in den alten Zustand wechseln möchten. Die Pakete, die ich aufgelistet habe, nehmen Ihnen die mentale Last, dies jedes Mal zu tun, wenn Sie das Layout wechseln möchten.
Wasamasa
Ist es möglich, beim Start eine bestimmte Fensterkonfiguration (in meiner .emacs-Datei) zu erstellen und diese dann in einem Register zu speichern? Ich habe es (window-configuration-to-register "1")als Befehl in meinen .emacs versucht , aber es hat nicht funktioniert
Uhr
Versuchen Sie es mit desktop.el, es wurde zuvor erfolgreich mit eyebrowse kombiniert.
Wasamasa
2

Sie können das aktuelle Fensterlayout in einem Register speichern und es dann mit wiederherstellen jump-to-register. Der Befehl window-configuration-to-registerist C-x r wstandardmäßig an gebunden .

Wenn Sie Ihre Fenster beispielsweise auf nützliche Weise angeordnet haben, können Sie sie speichern, um sie erneut zu registrieren. iVerwenden Sie dazu: C-x r w iund stellen Sie das Layout später mit wieder her C-x r j i.

Glucas
quelle
1
Ha, drei von uns haben gleichzeitig über Register geantwortet.
Glucas
1

Zygospore bietet eine schnelle Lösung für den Fall, dass Sie mehrere Fenster geöffnet haben und eines davon vorübergehend maximieren möchten. Es ändert das Verhalten von C-x 1. Wenn Sie mehrere Fenster geöffnet haben, verhält es sich wie die Standardeinstellung delete-other-windowsund entfernt alle Fenster mit Ausnahme des Fensters, das Sie gerade anzeigen. Wenn Sie erneut darauf klicken, werden die anderen Fenster wiederhergestellt.

Der Gewinner-Modus bietet eine allgemeinere Lösung, aber Zygospore eignet sich hervorragend zum vorübergehenden Vergrößern eines einzelnen Fensters in einem Frame. Das Beste ist, dass keine neuen Tastenkombinationen verwendet werden. Sie werden C-x 1auf sehr intuitive Weise neu definiert , sodass keine neuen Tastenkombinationen zu lernen sind.

Tyler
quelle
1

Das ist eine interessante Frage. Vor einigen Jahren habe ich alle Lösungen untersucht. Nur workgroups2.el ist schwer genug, um alle Eckkoffer abzudecken.

Die Benutzeroberfläche von Workgroups2 ist jedoch eine Katastrophe. Wenn Sie beispielsweise den Arbeitsgruppenmodus aktivieren (wie in der README-Datei vorgeschlagen), wird das vorherige Layout beim Start von Emacs automatisch geladen. Das macht das Starten JEDES Mal extrem langsam.

Meine Lösung besteht darin, workgroups2 als eine Sammlung von APIs zu behandeln, anstatt als ein sofort einsetzbares Tool. Daher ändere ich die standardmäßige Benutzeroberflächeninteraktion mithilfe des Efeu-Modus ( https://github.com/abo-abo/swiper ) von @ abo-abo

Bildbeschreibung hier eingeben

Das Umschalten des gesamten Fensters ist einfach, es reicht aus, APIs aus dem Winner-Modus zu verwenden.

Hier ist der vollständige Code (ich benutze nur M-x toggle-full-window, M-x wg-create-workgroupund M-x my-wg-switch-workgroupSie müssen auch Swiper installieren, wie ich oben erwähnt habe),

(defun toggle-full-window()
  "Toggle the full view of selected window"
  (interactive)
  ;; @see http://www.gnu.org/software/emacs/manual/html_node/elisp/Splitting-Windows.html
  (if (window-parent)
      (delete-other-windows)
    (winner-undo)))

(setq wg-use-default-session-file nil)
;; don't open last workgroup automatically in `wg-open-session',
;; I only want to check available workgroups! Nothing more.
(setq wg-load-last-workgroup nil)
(setq wg-open-this-wg nil)

;(workgroups-mode 1) ; put this one at the bottom of .emacs
;; by default, the sessions are saved in "~/.emacs_workgroups"
(autoload 'wg-create-workgroup "workgroups2" nil t)

(defun my-wg-switch-workgroup ()
  (interactive)
  (let (group-names selected-group)
    (unless (featurep 'workgroups2)
      (require 'workgroups2))
    (setq group-names
          (mapcar (lambda (group)
                    ;; re-shape list for the ivy-read
                    (cons (wg-workgroup-name group) group))
                  (wg-session-workgroup-list (read (f-read-text (file-truename wg-session-file))))))
    (ivy-read "work groups" group-names
              :action (lambda (group)
                        (wg-find-session-file wg-default-session-file)
                        (wg-switch-to-workgroup group)))))

(eval-after-load 'workgroups2
  '(progn
     ;; make sure wg-create-workgroup always success
     (defadvice wg-create-workgroup (around wg-create-workgroup-hack activate)
       (unless (file-exists-p (wg-get-session-file))
         (wg-reset t)
         (wg-save-session t))

       (unless wg-current-session
         ;; code extracted from `wg-open-session'.
         ;; open session but do NOT load any workgroup.
         (let ((session (read (f-read-text (file-truename wg-session-file)))))
           (setf (wg-session-file-name session) wg-session-file)
           (wg-reset-internal (wg-unpickel-session-parameters session))))
       ad-do-it
       ;; save the session file in real time
       (wg-save-session t))

     (defadvice wg-reset (after wg-reset-hack activate)
       (wg-save-session t))

     ;; I'm fine to to override the original workgroup
     (defadvice wg-unique-workgroup-name-p (around wg-unique-workgroup-name-p-hack activate)
       (setq ad-return-value t))))
chen bin
quelle