Basculer entre les dispositions de fenêtres

24

Lorsque je configure une mise en page personnalisée et qu'il me suffit de regarder temporairement un fichier en plein écran et une fois que je veux que cette mise en page revienne - j'ai besoin de la redistribuer manuellement.

Je voudrais un plugin / code elisp pour enregistrer mes mises en page et pouvoir basculer entre les mises en page enregistrées.

MISE À JOUR

Merci à tous.

La suggestion d' abo-abo d'utiliser le mode gagnant est vraiment sympa et je l'ai fait fonctionner en un rien de temps.

wasamasa a suggéré un tas de super plugins dont je n'ai jamais entendu parler et a fourni des informations sur l'utilisation des registres.

Jordon Biondo m'a expliqué comment utiliser les registres et ce truc est en fait ce que je voulais de la manière la plus simple.

Merci à tous.

lukas.pukenis
la source

Réponses:

23

La manière intégrée de le faire est avec des registres.

Par exemple, utilisez C-xrwapour enregistrer la configuration actuelle de la fenêtre pour enregistrer un fichier.

Ensuite, vous pouvez utiliser la liaison intégrée C-x1pour exécuterdelete-other-windows

une fois que vous avez terminé de regarder le fichier unique, utilisez C-xrjapour revenir à la configuration de la fenêtre enregistrée dans le registre a.

En bref:

C-xrwa (enregistrer la configuration dans le registre)

C-x1 (supprimer d'autres fenêtres)

C-xrja (réappliquer la configuration de la fenêtre enregistrée)


Je trouve que les registres sont difficiles à utiliser, j'utilise une pile de configuration de fenêtre personnalisée pour gérer mes configurations.

J'ai deux liaisons qui poussent la configuration actuelle sur la pile, et pop et appliquent la configuration supérieure.

Donc, dans votre scénario, j'effectuerais ma liaison push, puis Cx 1, puis j'effectuerais ma liaison pop.

Voici le 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")))

Vous pouvez ensuite vous lier winstack-pushà quelque chose comme C-cC-u, et winstack-popà C-cC-osauter facilement.

Jordon Biondo
la source
C'est très très très sympa!
lukas.pukenis
20

J'utilise winner-mode. Voici ma configuration:

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

Je ne sais pas s'il existe un moyen de mettre en signet une mise en page ou quelque chose, mais être capable de revenir en continu à la mise en page précédente me suffit.

abo-abo
la source
wow, le fait de pouvoir revenir à la disposition précédente fait BEAUCOUP pour moi. Merci!
lukas.pukenis
11

Emacs propose des registres pour enregistrer et appliquer des données telles que la configuration actuelle de votre fenêtre, cela peut être fait avec C-x r wet C-x r j. Cependant, cette approche devient lourde car vous devez vous souvenir des registres de fenêtre.

Il existe quelques packages pour améliorer cela. iregister rend cette fonctionnalité de base plus consultable et interactive. Les autres que je connais l'utilisent sans impact sur les registres, comme elscreen et escreen qui utilisent la barre d'en-tête pour afficher les onglets. groupes de travail et groupes de travail2 sont deux approches plus récentes et plus étendues de ce problème. Personnellement, je n'ai pas aimé non plus et j'ai donc écrit le mien quelque part entre les deux et avec, espérons-le, moins de bugs et de complexité.

wasamasa
la source
C'est génial à propos des registres, mais comment dois-je les utiliser dans ce cas? Je vais vérifier les plugins que vous avez répertoriés pour voir si je
réussis
Vous enregistrez votre mise en page actuelle dans un registre, effectuez quelques modifications, puis une fois que vous souhaitez passer à son ancien état, restaurez la mise en page à partir du registre. Les packages que j'ai énumérés vous soulagent du fardeau mental de le faire chaque fois que vous souhaitez changer de disposition.
wasamasa
est-il possible de créer une certaine configuration de fenêtre au démarrage (dans mon fichier .emacs) puis de l'enregistrer dans un registre? J'ai essayé en (window-configuration-to-register "1")tant que commande dans mon .emacs, mais cela n'a pas fonctionné
pm
Essayez d'utiliser desktop.el pour cela, il a été combiné avec succès avec eyebrowse auparavant.
wasamasa
2

Vous pouvez enregistrer la disposition de la fenêtre actuelle dans un registre, puis la restaurer à l'aide de jump-to-register. La commande window-configuration-to-registerest liée C-x r wpar défaut.

Par exemple, lorsque vos fenêtres sont disposées de manière utile, vous pouvez les enregistrer pour vous enregistrer en iutilisant: C-x r w iet restaurer la disposition ultérieurement en utilisant C-x r j i.

glucas
la source
1
Ha, trois d'entre nous ont répondu à propos des registres en même temps.
glucas
1

Zygospore fournit une solution rapide pour la situation où plusieurs fenêtres sont ouvertes et que vous souhaitez maximiser temporairement l'une d'entre elles. Il modifie le comportement de C-x 1. Lorsque vous avez plusieurs fenêtres ouvertes, elle se comporte comme la valeur par défaut delete-other-windowset supprime toutes les fenêtres à l'exception de celle que vous consultez. Lorsque vous le frappez à nouveau, il restaure les autres fenêtres.

Le mode gagnant offre une solution plus générale, mais la zygospore est idéale pour zoomer temporairement sur une seule fenêtre dans un cadre. La meilleure chose est qu'il n'utilise pas de nouvelles liaisons de touches - il redéfinit C-x 1de manière très intuitive, donc il n'y a pas de nouvelles liaisons à apprendre.

Tyler
la source
1

C'est une question intéressante. Il y a plusieurs années, j'ai étudié toutes les solutions. Seul workgroups2.el est suffisamment lourd pour couvrir tous les cas d'angle.

Mais l'interface utilisateur de workgroups2 est un désastre. Par exemple, si vous activez le mode groupe de travail (comme le suggère son README), la disposition précédente sera automatiquement chargée lors du démarrage d'emacs. Cela rend le démarrage extrêmement lent CHAQUE fois.

Ma solution consiste à traiter les groupes de travail2 comme une collection d'API au lieu d'un outil utilisable prêt à l'emploi. Je change donc son interaction d'interface utilisateur par défaut en utilisant le mode ivy ( https://github.com/abo-abo/swiper ) de @ abo-abo

entrez la description de l'image ici

Basculer la fenêtre complète est facile, utiliser les API du mode gagnant est suffisant.

Voici le code complet (j'utilise uniquement M-x toggle-full-window, M-x wg-create-workgroupet M-x my-wg-switch-workgroup, vous devez également installer swiper, comme je l'ai mentionné ci-dessus),

(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
la source