Emacs программно меняет размер окна - PullRequest
6 голосов
/ 05 февраля 2010

Я хотел бы реализовать автоматическое сжатие буфера компиляции до небольшого размера (но не при закрытии окна удаления), чтобы при успешной компиляции окно уменьшалось до минимального размера.

get-buffer-create возвращает буфер. как я могу shrink-window в окне, связанном с этим буфером? также есть ли способ сохранить предыдущий размер окна?

Это мой первый опыт программирования на emacs-lisp, спасибо за вашу помощь.

1 Ответ

8 голосов
/ 05 февраля 2010

Я считаю, что есть два способа решения этой проблемы.

Первый - использовать хук `'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)

...