Я считаю, что есть два способа решения этой проблемы.
Первый - использовать хук `'compilation-finish-functions', который
это:
[список f] функций, вызываемых после завершения процесса компиляции.
Каждая функция вызывается с двумя аргументами: буфер компиляции,
и строка, описывающая, как завершился процесс.
Что приводит к такому решению:
(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))))
Единственная проблема, с которой я столкнулся в этом решении, заключается в том, что он предполагает, что успех можно определить, найдя строку «закончено» в строке результата.
Другой альтернативой является совет 'compilation-handle-exit
- который
получает статус выхода в явном виде. Я написал этот совет, который
сжимает окно, когда состояние выхода не равно нулю.
(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))
Примечание: если окно *compilation*
все еще видно, когда вы делаете вторую компиляцию, оно не будет изменено в размере при сбое. Если вы хотите изменить его размер, вам нужно будет указать высоту вместо nil
. Возможно, вам это понравится (см. Первый пример):
(if (string-match-p "finished" resstring) 5 (/ (frame-height) 2))
nil
был заменен на (/ (frame-height) 2)