2010-02-05 11 views
6

Vorrei implementare il collasso automatico del buffer di compilazione su dimensioni ridotte (ma non chiudere a una finestra di eliminazione), in modo che alla compilazione riuscita la finestra venga ridotta alla dimensione minima.emacs modifica in modo programmatico la dimensione della finestra

get-buffer-create restituisce un buffer. come posso shrink-window sulla finestra associata a quel buffer? inoltre, c'è un modo per memorizzare le dimensioni della finestra precedente?

È la mia prima incursione nella programmazione lisp di emacs, grazie per il vostro aiuto.

risposta

8

Credo che ci siano due modi per risolvere questo problema.

Il primo è quello di utilizzare il gancio ` 'compilazione-rivestimento-funzioni', che è :

[Un elenco di f] unzioni chiamare quando un processo di compilazione termina. Ogni funzione viene chiamata con due argomenti: il buffer di compilazione, e una stringa che descrive come è terminato il processo.

che porta ad una soluzione del genere:

(add-hook 'compilation-finish-functions 'my-compilation-finish-function) 
(defun my-compilation-finish-function (buffer resstring) 
    "Shrink the window if the process finished successfully." 
    (let ((compilation-window-height (if (string-match-p "finished" resstring) 5 nil))) 
    (compilation-set-window-height (get-buffer-window buffer 0)))) 

L'unico problema che ho con questa soluzione è che esso presuppone che il successo può essere determinato trovando la stringa "finito" nella stringa di risultato.

L'altra alternativa è quella di avvisare 'compilation-handle-exit - che ottiene esplicitamente lo stato di uscita. Ho scritto questo consiglio che riduce la finestra quando lo stato di uscita è diverso da zero.

(defadvice compilation-handle-exit (around my-compilation-handle-exit-shrink-height activate) 
    (let ((compilation-window-height (if (zerop (car (ad-get-args 1))) 5 nil))) 
    (compilation-set-window-height (get-buffer-window (current-buffer) 0)) 
    ad-do-it)) 

Nota: se la finestra *compilation* è ancora visibile quando fate la vostra seconda fase di compilazione, non verrà ridimensionata più grande in caso di errore. Se desideri ridimensionarlo, dovrai specificare un'altezza anziché nil. Forse questo potrebbe essere di vostro gradimento (cambiando il primo esempio):

(if (string-match-p "finished" resstring) 5 (/ (frame-height) 2)) 

Il nil è stato sostituito con (/ (frame-height) 2)