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.

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ć.


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.


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.


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.


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.


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))))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.