Estoy buscando una manera de agregar una nueva división de ventana de altura completa a una configuración de ventana existente (dividida). Como no sé cómo explicarlo correctamente, simplemente publicaré algunos gráficos ASCII que muestran el comportamiento deseado para dos configuraciones de ventana de ejemplo:
from to +-------------------------+ +---------------------+---+ | | | | | | | | | | | A | => | A | E | | | | | | | | | | | +-------------------------+ +---------------------+---+ +------------+------------+ +----------+----------+---+ | | B | | | B | | | A +------------+ | A +----------+ | | | C | => | | C | E | +------------+------------+ +----------+----------+ | | D | | D | | +-------------------------+ +---------------------+---+
donde la función acepta la anchura deseada de la nueva ventana E
y se contrae las anchuras de A
, B
, C
, y D
en consecuencia. Edit2 : Tenga en cuenta que los dos dibujos anteriores son ejemplos del comportamiento esperado para un caso concreto. Estoy buscando una función general que haga esto independientemente de la configuración en la columna desde (es decir, el número de ventanas [divisiones] en la columna desde debe ser arbitrario).
También estoy buscando esta funcionalidad en el lado izquierdo y en la parte superior e inferior de un marco.
Editar: Del comentario de @ Nsukami_ me di cuenta de que la funcionalidad que estoy buscando es un caso especial de un problema más abstracto. Así que voy a expresar ese problema:
¿Cómo almacena una configuración de ventana (que consta de cualquier número de ventanas y buffers) y "pega" la configuración almacenada en una ventana existente?
El "pegar" debería preservar los tamaños de ventana relativos y la división; naturalmente, la configuración pegada resultante es una copia escalada.
split-window-right
asC-u -width C-x 3
. Cambiewidth
a lo que quiera y observe el signo negativo.A
,B
,C
, yD
) y luego insertar este diseño en una nueva ventana? Entonces mi problema podría resolverse 1) almacenando la configuración actual de la ventana, 2) cambiando el diseño para mostrar solo una ventana que luego se divide horizontalmente [esencialmente formando la ventanaE
y la ventana de marcador de posición para las otras, llamémoslaZ
], 3 ) finalmente inserción del diseño original en la ventana izquierda (Z
)Respuestas:
La siguiente función debe hacer lo que quieras. El truco es dividir la ventana raíz del marco actual.
Llame a la función con la dirección en la que desea dividir la ventana y el tamaño de la nueva ventana. Lo anterior devuelve la ventana recién creada. El concepto, las ventanas y los marcos se explican muy bien en el Manual de referencia de GNU Emacs Lisp .
fuente
No estoy seguro de si la mejor solución, ya que no está lo suficientemente resumida, en realidad solo estoy resolviendo un caso de uso. El truco es escribir una función para ir de layoutX a layoutY, y otra para ir de layoutY a layoutX
Espero que esa solución ayude
Acabo de encontrar un paquete llamado layout.el , nunca lo he usado pero parece ser lo que estás buscando, nos dirás si está bien.
EDITAR:
Intentando encontrar una solución más genérica, parece que puede usar
M-x switch-to-buffer-other-frame
para pasar de un búfer en un marco, digamos con un diseño X, a otro búfer en otro marco con un diseño Y.También puede estar en un diseño X, almacenar este diseño en un registro
C-x r f
(frame-configuration-to-register), ir a otro diseño y, cuando sea necesario, volver al anterior, llamando con qué dentro del registroC-x r j
(jump- para registrarse)fuente
layout.el
hace algo similar awinner
: (re) almacenar la configuración de la ventana del cuadro completo, no almacenar la configuración completa y restaurarla en una ventana existente. Por otro lado, la función que escribió no son las soluciones generales que estoy buscando. Resuelven mi segundo ejemplo, que no fue el problema concreto sino solo un ejemplo. Estoy buscando una solución que funcione en el caso general.switch-to-buffer-other-frame
si 'from' es un marco y 'to' es otro marco