Janela dividida na borda mais externa

8

Estou procurando uma maneira de adicionar uma nova janela de altura total dividida a uma configuração de janela existente (dividida). Como não sei como explicá-lo corretamente, publicarei alguns gráficos ASCII mostrando o comportamento desejado para dois exemplos de configurações de janelas:

             from                              to  

  +-------------------------+      +---------------------+---+  
  |                         |      |                     |   |  
  |                         |      |                     |   |  
  |            A            |  =>  |           A         | E |  
  |                         |      |                     |   |  
  |                         |      |                     |   |  
  +-------------------------+      +---------------------+---+  

  +------------+------------+      +----------+----------+---+  
  |            |     B      |      |          |   B      |   |
  |     A      +------------+      |     A    +----------+   |
  |            |     C      |  =>  |          |   C      | E | 
  +------------+------------+      +----------+----------+   |
  |            D            |      |          D          |   |
  +-------------------------+      +---------------------+---+  

onde a função aceita a largura desejada da nova janela Ee diminui as larguras de A, B, C, e Dem conformidade. Edit2 : Observe que os dois desenhos acima são exemplos do comportamento esperado para um caso concreto. Estou procurando uma função geral que faça isso independentemente da configuração na coluna from (ou seja, o número de janelas [divididas] na coluna from deve ser arbitrário).

Também estou procurando essa funcionalidade no lado esquerdo e na parte superior e inferior de um quadro.

Edit: Do comentário de @ Nsukami_, percebi que a funcionalidade que estou procurando é um caso especial de um problema mais abstrato. Então, vou descrever esse problema:

Como você armazena uma configuração de janela (que consiste em qualquer número de janelas e buffers) e "cola" a configuração armazenada em uma janela existente?

A "pasta" deve preservar os tamanhos relativos das janelas e a divisão; naturalmente a configuração colada resultante é uma cópia em escala.

elemakil
fonte
O primeiro comportamento pode ser obtido passando o argumento de tamanho para split-window-rightcomo C-u -width C-x 3. Mude widthpara o que quiser e observe o sinal negativo.
Vamsi
Estou pensando em pré-definir alguns layouts, mas não tenho certeza.
Nsukami _
@Nsukami_ É possível armazenar um layout de janela (por exemplo, a disposição de A, B, C, e D) e, em seguida, inserir esse layout em uma nova janela? Então, meu problema poderia ser resolvido com 1) armazenando a configuração atual da janela, 2) mudando o layout para mostrar apenas uma janela que é dividida horizontalmente [essencialmente formando a janela para Ee a janela de espaço reservado para as outras, vamos chamá-lo Z], 3 ) finalmente inserção do esquema original para a janela do lado esquerdo ( Z)
elemakil
Você precisará ajustar o layout antes da inserção, pois eles também contêm os tamanhos das janelas. Também inserção de um layout em uma determinada janela não é possível sem elisp costume AFAIK
Vamsi

Respostas:

5

A função a seguir deve fazer o que você deseja. O truque é dividir a janela raiz do quadro atual.

(defun my-split-main-window (direction size)
  "Split the main window in the DIRECTION where DIRECTION is a symbol with
possible values of right, left, above or below and SIZE is the final size of the
windows, if the window is split horizontally (i.e. in DIRECTION below or above)
SIZE is assumed to be the target height otherwise SIZE is assumed to be the
target width"
  (let* ((new-window (split-window (frame-root-window) nil direction))
         (horizontal (member direction '(right left))))
    (save-excursion 
      (select-window new-window)
      (enlarge-window (- size (if horizontal
                                  (window-width)
                                (window-height)))
                      horizontal))
    new-window))

Chame a função com a direção na qual você dividirá a janela e o tamanho da nova janela. O exemplo acima retorna a janela recém-criada. O conceito, as janelas e os quadros são explicados muito bem no Manual de Referência do GNU Emacs Lisp .

Iqbal Ansari
fonte
Perfeito! Isto é exatamente o que eu queria.
precisa saber é o seguinte
0

Não tenho certeza se a melhor solução, como não é o suficiente abstraído, estou resolvendo apenas um caso de uso. O truque é escrever uma função para ir de layoutX para layoutY, e outra para ir de layoutY para layoutX

(defun from-x-to-y ()
 (interactive)
 (delete-other-windows)
 (split-window-vertically) ;;
 (let ((current-prefix-arg 10)) ;; emulate C-u
   (call-interactively 'enlarge-window) ;; resize
   )
 (split-window-horizontally) ;; -> |
 (next-multiframe-window)
 (split-window-vertically) ;;  -> --
 (previous-multiframe-window)
)

(defun from-y-to-x ()
  (interactive)
  (delete-other-windows)
  (split-window-horizontally) ;; -> |
  (let ((current-prefix-arg -60)) ;; emulate C-u
    (call-interactively 'shrink-window-horizontally) ;; resize
    )
  (split-window-vertically) ;; -> --
  (let ((current-prefix-arg 10)) ;;
    (call-interactively 'enlarge-window) ;;
    )
  (split-window-horizontally) ;;
  (next-multiframe-window)
  (split-window-vertically) 
  (previous-multiframe-window)
)

Espero que a solução ajude

Como você armazena uma configuração de janela (que consiste em qualquer número de janelas e buffers) e "cola" a configuração armazenada em uma janela existente?

Acabei de encontrar um pacote chamado layout.el , eu nunca o usei, mas parece ser o que você está procurando, você nos dirá se está bem.

EDITAR:

Tentando encontrar uma solução mais genérica, parece que você pode usar M-x switch-to-buffer-other-framepara ir de um buffer em um quadro, digamos com um layout X, para outro buffer em outro quadro com um layout Y.

Você também pode estar em um layout X, armazenar esse layout em um registro C-x r f(configuração de quadro para registro), ir para outro layout e, quando necessário, voltar para o anterior, chamando o que está dentro do registro C-x r j (jump- registrar)

Nsukami _
fonte
Tanto quanto posso dizer, layout.elfaz algo semelhante a winner: (re) armazenar a configuração da janela do quadro completo, não armazenar a configuração completa e restaurá-la em uma janela existente. A função que você escreveu, por outro lado, não são, de fato, as soluções gerais que estou procurando. Eles resolvem meu segundo exemplo, que não era um problema concreto, mas apenas um exemplo. Estou procurando uma solução que funcione no caso geral.
elemakil
Ainda cavar, e eu acho que a solução geral poderia ser switch-to-buffer-other-framese 'de' é um quadro e 'a' é outro quadro
Nsukami _