2012-06-13 7 views
6

¿Cómo puedo detectar que una ventana de Emacs ya se haya dividido?La ventana Detección de Emacs ya está dividida

En mi archivo .emacs, que tienen:

(when (display-graphic-p) 
    (set-frame-size (selected-frame) 166 85) 
    (split-window-horizontally)) 

la que me permite tener dos topes laterales a lado, cada uno de exactamente 80 caracteres de ancho.

De vez en cuando cambio mi archivo .emacs y quiero volver a cargarlo en su lugar, así que ejecuto M-x load-file en mi archivo .emacs y la ventana en la que estoy se vuelve a dividir.

¿Hay algún tipo de comando que pueda llamar para verificar si el marco ya se ha dividido y solo llamar al (split-window-horizontally) si no lo ha hecho? Algo así como:

(when (window-is-root) 
    (split-window-horizontally)) 

o

(when (not (window-is-already-split)) 
    (split-window-horizontally)) 

Respuesta

10

window-list le devolverá una lista de las ventanas (para la trama actual), por lo que debería ser capaz de hacer:

(when (= (length (window-list)) 1) 
    (split-window-horizontally)) 

Comprobar fuera del relevant documentation for windows.

+0

funciona perfectamente, gracias! Y gracias por el puntero de documentación también. Encontré esta página: http://www.gnu.org/software/emacs/manual/html_node/elisp/Splitting-Windows.html#Splitting-Windows pero no parecía tener ninguna información útil. – sligocki

-3

Esta es una pregunta sin sentido, las ventanas no se dividen.

Sí, hay funciones llamadas ventanas divididas ..., pero lo que hacen es simplemente reducir el tamaño de la ventana y crear una nueva en el espacio así liberado.

No puede usar simplemente (= 1 (longitud (lista de ventanas))) ya que tiene al menos una ventana por fotograma (sin contar la ventana simili del minibúfer).

Usted podría intentar:

(< (length (frame-list)) (length (window-list))) 

pero eso no te dice si hay varias ventanas en el marco seleccionado, que es lo que en realidad se está preguntando, ya que obviamente podría ser otro marco que contiene varios ventanas.

Así que si le preguntas a la pregunta correctamente, "¿cómo puedo saber si el marco seleccionado contiene más de una ventana", se puede encontrar fácilmente la respuesta:

(require 'cl) 

(defun complement (fun) 
    (byte-compile `(lambda (&rest args) (not (apply ',fun args))))) 

(defun* more-than-one-window-in-frame-p (&optional (frame (selected-frame))) 
    (< 1 (length (remove* frame (window-list) 
         :key (function window-frame) 
         :test (complement (function eql)))))) 
+2

Función: ventana lista y ventana de minibúfer de marco opcional. Esta función devuelve una lista de ventanas activas que pertenecen al marco de cuadro. Si frame se omite o nil, se establece de forma predeterminada en el marco seleccionado. Por lo tanto, solo devuelve las ventanas en este marco. Intenté '(= (length (window-list)) 1)' con dos cuadros y funciona bien. – sligocki

+2

desde: http://www.gnu.org/software/emacs/manual/html_node/elisp/Windows-and-Frames.html#Windows-and-Frames – sligocki

Cuestiones relacionadas