emacs программно изменяют размер окна

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

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

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

6
задан Anycorn 5 February 2010 в 04:48
поделиться

1 ответ

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

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

8
ответ дан 16 December 2019 в 21:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: