¿Cómo puedo bloquear la división de un marco?

16

Actualmente trabajo con ruby ​​y rspec. Me gusta mucho la idea de tener un marco separado en otro monitor que me muestre el búfer de compilación. Mi configuración actual utiliza un marco de 'código' (en el que hago trabajo real) y un marco de 'resultado de prueba' (en el que veo resultados rspec)

El problema es que cuando intento abrir algún error de compilación o archivo en el marco 'resultado de prueba', la ventana se divide en ese marco. Lo que realmente me gustaría hacer es que se abra en el marco de mi 'código'.

Ya utilizo la opción display-buffer-reuse-frames. También intenté configurar la ventana de resultados de la compilación dedicated, pero cada vez que emacs intenta abrir una nueva ventana, se crea un nuevo marco (lo cual es particularmente horrible si usa Helm).

¿Hay alguna manera fácil de lograr esto?

Renan Ranelli
fuente
1
Usar emacs como IDE sería mucho más conveniente si hubiera un "pin" fácil de colocar en un lugar para que siempre aparezca en el mismo lugar. Una de las características de Visual Studio que más extraño cuando uso emacs es la forma simple e intuitiva de dividir, anclar, acoplar, ocultar y manipular ventanas.
nispio
1
Sí. También vengo de un fondo vs, y también extraño esto, aunque siento que la interfaz emacs clean-no-button-no-bullshit es mejor la mayor parte del tiempo.
Renan Ranelli
@nispio No utilizo VS, ¿puede especificar qué quiere decir con "pin"? Los marcos de Emacs suelen ser exclusivos y no cambian a menos que interactúes con ellos.
Vamsi
@vamsi: VS utiliza muchas ventanas pequeñas que puede adjuntar a la parte superior / inferior / lados de su marco, o puede abrirlas y crear un nuevo marco. Puede acoplar una ventana contra los bordes de un marco y configurarla para que se oculte automáticamente. Por ejemplo, la ventana de salida de la compilación aparecerá mágicamente desde la parte inferior cuando comience la compilación, y se ocultará nuevamente poco después de que finalice la compilación. Si no desea que la ventana se oculte automáticamente, puede fijarla en su lugar y luego desanclarla nuevamente cuando haya terminado de hacer referencia a ella.
nispio
@nispio ya veo. Utilizo popwin.elMELPA para compilar ventanas emergentes y ayudar a los buffers que persisten hasta que C-gse presiona. Si los necesito a tiempo completo, solo cambio a ellos en otra ventana. No he pensado en fijar ventanas porque emacs sí split-windows-sensibly.
Vamsi

Respuestas:

9

Debe configurar el gorila de 600 libras que es el display-buffer-alistque determina cómo display-bufferelige dónde mostrar un búfer. Hace display-buffer-reuse-framesobsoleto en los nuevos emacsen. Aquí hay una configuración que debería guiarlo (al menos en emacs 24.3).

;; all buffers, try to reuse windows across all frames
(add-to-list 'display-buffer-alist
           '(".*". (display-buffer-reuse-window .
                                  ((reusable-frames . t)))))

;; except for compilation buffers where you want new and dedicated frames when necessary
(add-to-list 'display-buffer-alist
         '("^\\*Compile-Log\\*". ((display-buffer-reuse-window
                                   display-buffer-pop-up-frame) .
                                  ((reusable-frames . t)
                                  (inhibit-same-window . t)))))

Como puede ver, uso una expresión regular para que coincida con el búfer de registro de compilación. La documentación de display-bufferdebería darle una idea de lo que está sucediendo. Solo un aviso de que no es la documentación más agradable que jamás leerá. Los agregué secuencialmente para que la expresión regular de compilación-registro coincida antes que la expresión regular genérica. Adapte la expresión regular a sus necesidades.

EDITAR Para que cualquier marco no se pueda dividir, puede evaluarlo M-: (set-frame-parameter nil 'unsplittable t)en ese marco en particular. Reemplace nil con requerido FRAMEsi lo hace desde elisp. Entre estas dos configuraciones, debe hacer que el marco de compilación sea exclusivo a menos que encuentre específicamente un archivo en ese marco.

Vamsi
fuente
Lo que pasa es que no quiero abrir nuevos marcos todo el tiempo. Lo que quiero es restringir todas las ventanas al marco 'código', con la excepción del búfer 'compilation-log', que siempre debe mostrarse en el marco 'test'. No pude encontrar una manera de redirigir todas las ventanas nuevas a mi marco principal de 'código'. Tal vez no fui lo suficientemente claro en la pregunta = (
Renan Ranelli
Esto solo debería abrir un nuevo marco para el registro de compilación que también solo si no hay un marco existente. ¿Puedes decirme qué está yendo mal? Vea la edición sobre cómo hacer que cualquier marco no se pueda dividir.
Vamsi