Alternando entre layouts de janela

24

Quando eu configuro um layout personalizado e preciso apenas olhar temporariamente para um arquivo em tela cheia e quando eu quiser o layout de volta - preciso manualmente refluí-lo.

Gostaria que um código plugin / elisp salvasse meus layouts e pudesse alternar entre os layouts salvos.

ATUALIZAR

Obrigado a todos.

A sugestão abo-abo de usar o modo vencedor é muito boa e eu consegui trabalhar em tempo zero.

O wasamasa sugeriu um monte de ótimos plugins dos quais nunca ouvi falar e forneci informações sobre como usar registros.

Jordon Biondo me explicou como usar os registros e esse material é realmente o que eu queria da maneira mais simples.

Obrigado a todos.

lukas.pukenis
fonte

Respostas:

23

A maneira integrada de fazer isso é com os registradores.

Por exemplo, use C-xrwapara salvar a configuração atual da janela para registrar a.

Em seguida, você pode usar a ligação incorporada C-x1para executardelete-other-windows

depois de terminar de examinar o arquivo único, use C-xrjapara retornar à configuração da janela salva no registro a.

Em resumo:

C-xrwa (salve a configuração no registro)

C-x1 (excluir outras janelas)

C-xrja (reaplicar a configuração da janela salva)


Porém, acho que os registros são pesados, eu uso uma pilha de configuração de janela personalizada para gerenciar minhas configurações.

Eu tenho duas ligações que colocam a configuração atual na pilha e pop e aplicam a configuração superior.

Portanto, no seu cenário, eu executaria minha ligação push, depois Cx 1, e depois executaria minha ligação pop.

Aqui está o código:

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

Então você pode ligar winstack-pushpara algo como C-cC-u, e winstack-poppara C-cC-oa facilmente saltar ao redor.

Jordon Biondo
fonte
Isso é muito muito muito bom!
Lukas.pukenis
20

Eu uso winner-mode. Aqui está a minha configuração:

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

Não sei se há uma maneira de marcar um layout ou algo assim, mas ser capaz de voltar continuamente ao layout anterior é suficiente para mim.

abo-abo
fonte
uau, apenas poder voltar ao layout anterior faz muito para mim. Obrigado!
Lukas.pukenis
11

O Emacs oferece registros para salvar e aplicar dados como a sua configuração atual da janela, isso pode ser feito com C-x r we C-x r j. No entanto, essa abordagem fica difícil, pois é necessário lembrar os registros da janela.

Existem alguns pacotes para melhorar isso. O iregister torna esse recurso básico mais inspecionável e interativo. Os outros que eu conheço usam sem afetar os registros, como elscreen e escreen, que usam a barra de cabeçalho para exibir guias. grupos de trabalho e grupos de trabalho2 são duas abordagens mais novas e mais abrangentes para esse problema. Pessoalmente, eu também não gostei e, portanto, escrevi o meu próprio que está em algum lugar no meio e, espero, tem menos bugs e complexidade.

wasamasa
fonte
Isso é ótimo sobre registros, mas como devo usá-los nesse caso? Vou verificar os plugins que você tenha listado para ver se algum sucesso para mim :)
lukas.pukenis
Salve o layout atual em um registro, faça algumas alterações e, depois de mudar para o estado antigo, restaure o layout do registro. Os pacotes que listei tiram você do fardo mental de fazer isso toda vez que você deseja trocar de layout.
wasamasa
é possível criar uma determinada configuração de janela durante a inicialização (no meu arquivo .emacs) e salvá-la em um registro? Eu tentei (window-configuration-to-register "1")como um comando no meu .emacs, mas não funcionou
pm
Tente usar o desktop.el para isso, ele foi combinado com sucesso com o eyebrowse antes.
wasamasa
2

Você pode salvar o layout atual da janela em um registro e restaurá-lo usando jump-to-register. O comando window-configuration-to-registerestá vinculado C-x r wpor padrão.

Por exemplo, quando você organiza suas janelas de uma maneira útil, pode salvá-las para se registrar iusando: C-x r w ie restaurar o layout posteriormente usando C-x r j i.

glucas
fonte
1
Ha, três de nós respondemos sobre registros ao mesmo tempo.
glucas
1

O Zygospore fornece uma solução rápida para a situação em que você tem várias janelas abertas e deseja maximizar temporariamente uma delas. Ele modifica o comportamento de C-x 1. Quando você tem várias janelas abertas, ele se comporta como o padrão delete-other-windowse remove todas as janelas, exceto a que você está visualizando. Quando você pressiona novamente, restaura as outras janelas.

O modo Vencedor fornece uma solução mais geral, mas o zygospore é ótimo para ampliar temporariamente uma única janela em um quadro. O melhor é que ele não usa nenhuma nova combinação de teclas - ela redefine de C-x 1uma maneira muito intuitiva, portanto não há novas combinações para aprender.

Tyler
fonte
1

Esta é uma pergunta interessante. Vários anos atrás eu investiguei todas as soluções. Somente workgroups2.el é pesado o suficiente para cobrir todos os casos de canto.

Mas a interface do usuário para grupos de trabalho2 é um desastre. Por exemplo, se você ativar o modo de grupo de trabalho (como sugerido pelo README), o layout anterior será carregado automaticamente durante a inicialização do emacs. Isso torna a inicialização extremamente lenta a cada momento.

Minha solução é tratar os grupos de trabalho2 como uma coleção de API em vez de uma ferramenta utilizável pronta para uso. Então, mudo sua interação padrão da interface do usuário usando o modo ivy ( https://github.com/abo-abo/swiper ) de @ abo-abo

insira a descrição da imagem aqui

Alternar janela cheia é fácil, use APIs do modo vencedor é suficiente.

Aqui está o código completo (eu só uso M-x toggle-full-window, M-x wg-create-workgroupe M-x my-wg-switch-workgroup, você também precisa instalar swiper, como mencionei acima),

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