2010-02-05 30 views
6

Ich möchte automatische Kompilierung von Kompilierungspuffer auf kleine Größe implementieren (aber nicht bei einem Löschfenster schließen), so dass nach erfolgreicher Kompilierung zu Fenster auf minimale Größe geschrumpft ist.emacs programmgesteuert Fenstergröße ändern

get-buffer-create gibt einen Puffer zurück. Wie kann ich shrink-window auf Fenster mit diesem Puffer verbunden? Gibt es auch eine Möglichkeit, die vorherige Fenstergröße zu speichern?

Es ist mein erster Ausflug in Emacs Lisp Programmierung, danke für Ihre Hilfe.

Antwort

8

Ich glaube, es gibt zwei Möglichkeiten, dieses Problem zu lösen.

Der erste ist der Haken ` 'compilation-finish-Funktionen', zu verwenden, die ist:

[Eine Liste von f] unktion, wenn ein Übersetzungsvorgang beendet zu nennen. Jede Funktion wird mit zwei Argumenten aufgerufen: dem Kompilierungspuffer, und einer Zeichenfolge, die beschreibt, wie der Prozess beendet wurde.

, die zu einer Lösung wie diese führt:

(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)))) 

Das einzige Problem, das ich mit dieser Lösung sind, dass es geht davon aus, dass der Erfolg von der Suche nach der Zeichenfolge bestimmt werden kann „fertig“ in der Ergebniszeichenfolge.

Die andere Alternative ist zu beraten 'compilation-handle-exit - die erhält den exit-Status explizit übergeben. Ich schrieb diesen Ratschlag, der das Fenster verkleinert, wenn der Ausgangsstatus nicht Null ist.

(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)) 

Hinweis: Wenn das Fenster *compilation* noch sichtbar ist, wenn Sie Ihre zweite Kompilierung tun, wird es nicht bei einem Ausfall der Größe verändert größer werden. Wenn Sie die Größe ändern möchten, müssen Sie anstelle von nil eine Höhe angeben. Vielleicht wäre dies nach Ihrem Geschmack sein (das erste Beispiel zu ändern):

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

Die nil mit (/ (frame-height) 2) ersetzt wurde

Verwandte Themen