2012-06-13 2 views
6

Come si rileva che una finestra di Emacs è già stata divisa?Il rilevamento della finestra di Emacs è già diviso

Nel mio file .emacs, ho:

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

che mi permette di avere due respingenti laterali a fianco, ognuno esattamente 80 caratteri di larghezza.

Ogni tanto cambio il file .emacs e voglio ricaricarlo, quindi eseguo M-x load-file sul mio file .emacs e la finestra in cui mi trovo viene ri-divisa.

C'è una sorta di comando che posso chiamare per verificare se il telaio è già stato dividere e chiamare solo (split-window-horizontally) se non ha? Qualcosa di simile:

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

o

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

risposta

10

window-list lo restituiremo un elenco delle finestre (per il frame corrente), così si dovrebbe essere in grado di fare:

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

Controllare fuori il relevant documentation for windows.

+0

funziona perfettamente, grazie! E grazie anche per il puntatore alla documentazione. Ho trovato questa pagina: http://www.gnu.org/software/emacs/manual/html_node/elisp/Splitting-Windows.html#Splitting-Windows ma non sembrava avere alcuna informazione utile. – sligocki

-3

Questa è una domanda senza senso, le finestre non sono divisi.

Sì, ci sono funzioni denominate split-window ..., ma quello che fanno è solo per ridurre le dimensioni della finestra, e creare una nuova nello spazio così liberato.

Non è possibile utilizzare solo (= 1 (lunghezza (elenco-finestre))) poiché si dispone di almeno una finestra per fotogramma (senza contare la finestra simile del minibuffer).

Si potrebbe provare:

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

ma che non ti dice se ci sono diverse finestre nel telaio selezionato, che è quello che si sta effettivamente chiedendo, dato che ovviamente potrebbe essere un altro frame che contiene diversi finestre.

Quindi, se si pone la domanda CORRETTAMENTE, "come posso sapere se il frame selezionato contiene più di una finestra", si può facilmente trovare la risposta:

(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

Funzione: finestra-elenco e finestra minibuffer frame opzionale. Questa funzione restituisce un elenco di finestre live che appartengono al frame frame. Se il frame è omesso o nulla, per impostazione predefinita viene selezionato il frame. Quindi restituisce solo le finestre in questo frame. Ho provato '(= (length (window-list)) 1)' con due frame e funziona bene. – sligocki

+2

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