Przełączanie między układami okien

24

Kiedy konfiguruję niestandardowy układ, a następnie muszę tylko tymczasowo zajrzeć do jednego pliku na pełnym ekranie, a gdy chcę go przywrócić - muszę ręcznie go przepełnić.

Chciałbym, aby kod wtyczki / elisp zapisywał moje układy i mógł przełączać się między zapisanymi układami.

AKTUALIZACJA

Dziękuję wam wszystkim.

Sugestia abo-abo, aby użyć trybu zwycięzcy, jest naprawdę fajna i mam ją działającą w czasie zero.

Wasamasa zasugerował kilka świetnych wtyczek, o których nigdy nie słyszałem, i dostarczył informacji, jak korzystać z rejestrów.

Jordon Biondo wyjaśnił mi, jak korzystać z rejestrów, a tego właśnie chciałem w najprostszy sposób.

Dziękuję wam wszystkim.

lukas.pukenis
źródło

Odpowiedzi:

23

Wbudowane do tego celu są rejestry.

Na przykład użyj, C-xrwaaby zapisać bieżącą konfigurację okna, aby zarejestrować.

Następnie możesz użyć wbudowanego wiązania C-x1do uruchomieniadelete-other-windows

po zakończeniu przeglądania pojedynczego pliku użyj przycisku, C-xrjaaby wrócić do konfiguracji zapisanego okna w rejestrze a.

W skrócie:

C-xrwa (zapisz config w rejestrze)

C-x1 (usuń inne okna)

C-xrja (ponownie zastosuj zapisaną konfigurację okna)


Uważam jednak, że rejestry są nieporęczne, do zarządzania moimi konfiguracjami używam niestandardowego stosu konfiguracji okien.

Mam dwa wiązania, które wypychają bieżącą konfigurację na stos, a następnie otwierają i stosują najwyższą konfigurację.

Więc w twoim sceneario wykonałbym moje wiązanie push, następnie Cx 1, a następnie wykonałem moje pop pop.

Oto kod:

(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")))

Następnie można powiązać winstack-pushdo czegoś podobnego C-cC-u, i winstack-popaby C-cC-ołatwo skakać.

Jordon Biondo
źródło
To bardzo, bardzo, bardzo miłe!
lukas.pukenis
20

Używam winner-mode. Oto moja konfiguracja:

(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)

Nie wiem, czy istnieje sposób dodania zakładki do układu, czy czegoś, ale ciągłe przełączanie się do poprzedniego układu wystarczy mi.

abo-abo
źródło
wow, sama możliwość powrotu do poprzedniego układu to dla mnie DUŻO. Dzięki!
lukas.pukenis
11

Emacs oferuje rejestry do zapisywania i stosowania danych, takich jak bieżąca konfiguracja okna, można to zrobić za pomocą C-x r wi C-x r j. Jednak takie podejście staje się niewygodne, ponieważ musisz pamiętać rejestry okien.

Istnieje kilka pakietów, które mogą to poprawić. iregister sprawia, że ​​ta podstawowa funkcja jest bardziej sprawdzalna i interaktywna. Inne, o których wiem, że używają go bez wpływu na rejestry, takie jak elscreen i escreen, które używają paska nagłówka do wyświetlania kart. grupy robocze i grupy robocze2 to dwa nowsze i bardziej rozbudowane podejścia do tego problemu. Osobiście mi się nie podobało i dlatego napisałem własny, który jest gdzieś pośrodku i mam nadzieję, że mniej błędów i złożoności.

wasamasa
źródło
To świetne rzeczy na temat rejestrów, ale jak mam ich używać w tym przypadku?
Sprawdzę
Zapisujesz bieżący układ w rejestrze, wprowadzasz zmiany, a następnie, gdy chcesz przełączyć się do jego starego stanu, przywróć układ z rejestru. Pakiety, które wymieniłem, odciągają cię od mentalnego ciężaru robienia tego za każdym razem, gdy chcesz zmieniać układy.
wasamasa
czy możliwe jest utworzenie określonej konfiguracji okna podczas uruchamiania (w moim pliku .emacs), a następnie zapisanie jej w rejestrze? Próbowałem (window-configuration-to-register "1")jako polecenie w moich .emacs, ale to nie zadziałało
pm
Spróbuj użyć do tego desktop.el, wcześniej był z powodzeniem łączony z brew.
wasamasa
2

Możesz zapisać bieżący układ okna w rejestrze, a następnie przywrócić go za pomocą jump-to-register. Polecenie window-configuration-to-registerjest C-x r wdomyślnie powiązane .

Na przykład, jeśli masz uporządkowane okna w przydatny sposób, możesz zapisać je w celu rejestracji iza pomocą: C-x r w ii przywrócić układ później za pomocą C-x r j i.

glucas
źródło
1
Ha, trzech z nas odpowiedziało jednocześnie na rejestry.
glucas
1

Zygospore zapewnia szybką naprawę sytuacji, w której masz otwartych wiele okien i chcesz tymczasowo zmaksymalizować jedno z nich. Zmienia zachowanie C-x 1. Po otwarciu wielu okien zachowuje się jak domyślny delete-other-windowsi usuwa wszystkie okna oprócz tego, które przeglądasz. Po ponownym naciśnięciu przywraca inne okna.

Tryb Zwycięzca zapewnia bardziej ogólne rozwiązanie, ale zygospore świetnie nadaje się do tymczasowego powiększania pojedynczego okna w ramce. Najlepsze jest to, że nie używa żadnych nowych skrótów klawiszowych - zmienia definicję C-x 1w bardzo intuicyjny sposób, więc nie ma żadnych nowych powiązań do nauki.

Tyler
źródło
1

To interesujące pytanie. Kilka lat temu zbadałem wszystkie rozwiązania. Tylko grupy robocze2.el są wystarczająco ciężkie, aby objąć wszystkie skrzynki narożne.

Ale interfejs roboczy grupy roboczej 2 jest katastrofą. Na przykład, jeśli włączysz tryb grupy roboczej (jak sugeruje README), poprzedni układ zostanie automatycznie załadowany podczas uruchamiania emacsa. To sprawia, że ​​uruchamianie jest wyjątkowo wolne KAŻDY czas.

Moim rozwiązaniem jest traktowanie grup roboczych 2 jako zbioru API zamiast użytecznego narzędzia od razu po wyjęciu z pudełka. Dlatego zmieniam domyślną interakcję interfejsu użytkownika za pomocą trybu bluszczu ( https://github.com/abo-abo/swiper ) z @ abo-abo

wprowadź opis zdjęcia tutaj

Przełączanie pełnego okna jest łatwe, wystarczy użyć interfejsów API z trybu zwycięzcy.

Oto kompletny kod (I tylko używać M-x toggle-full-window, M-x wg-create-workgroupi M-x my-wg-switch-workgroup, trzeba także zainstalować Swiper, jak wspomniano powyżej),

(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
źródło