Я хотел бы реализовать автоматический коллапс буфера компиляции к небольшому размеру (но не близко в удалить окна), такой, который после успешной компиляции к окну уменьшается к минимальному размеру.
get-buffer-create
возвращает буфер. как может я shrink-window
на окне, связанном с тем буфером? также, есть ли способ сохранить предыдущий размер окна?
Это - мой первый набег в программирование шепелявости emacs, спасибо за Вашу справку.
Я считаю, что есть два способа решить эту проблему.
Первый - использовать перехватчик `'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))
Примечание: если окно * компиляция *
все еще отображается при выполнении второй компиляции, его размер не будет увеличен в случае ошибки. Если вы хотите изменить его размер, вам нужно указать высоту вместо nil
. Возможно, вам это понравится (изменение первого примера):
(if (string-match-p "finished" resstring) 5 (/ (frame-height) 2))
nil
было заменено на (/ (frame-height) 2)