Вот как настроить таймер, который сработает, когда Emacs будет простаивать в течение определенного периода времени. Помимо того, как их настроить, таймеры простоя работают так же, как и обычные таймеры.
Настраивает таймер, который выполнится при следующем простое Emacs в течение secs секунд. Значение secs может быть числом или значением типа, возвращаемым current-idle-time.
Если repeat равно nil, таймер сработает только один раз, когда Emacs в первый раз останется бездействовать достаточно долго. Чаще repeat не равно nil, что означает выполнение таймера каждый раз, когда Emacs остается бездействовать в течение secs секунд.
Функция run-with-idle-timer возвращает значение таймера, которое вы можете использовать при вызове cancel-timer (см. Таймеры для отложенного выполнения).
Emacs становится простаивающим, когда начинает ожидать ввода от пользователя (если только он не ожидает ввод с тайм-аутом, см. Чтение одного события), и остается простаивающим до тех пор, пока пользователь не предоставит какой-либо ввод. Если таймер установлен на пять секунд простоя, он сработает примерно через пять секунд после того, как Emacs впервые стал простаивать. Даже если repeat не равно nil, этот таймер не сработает снова, пока Emacs остается простаивающим, потому что продолжительность простоя будет продолжать увеличиваться и не вернется к пяти секундам.
Emacs может выполнять различные действия во время простоя: сборка мусора, автосохранение или обработка данных из подпроцесса. Но эти перерывы во время простоя не мешают таймерам простоя, потому что они не сбрасывают счетчик простоя к нулю. Таймер простоя, установленный на 600 секунд, сработает, когда прошло десять минут с момента завершения последней команды пользователя, даже если вывод подпроцесса был принят тысячи раз в течение этих десяти минут, и даже если происходил сбор мусора и автосохранение.
Когда пользователь вводит данные, Emacs становится не простаивающим во время выполнения ввода. Затем он снова становится простаивающим, и все таймеры простоя, настроенные на повторение, впоследствии сработают еще раз, по одному.
Не пишите функцию таймера простоя, содержащую цикл, который выполняет определенное количество обработки каждый раз, и выходит, когда (input-pending-p) не равно nil. Этот подход кажется очень естественным, но имеет две проблемы:
Аналогично, не пишите функцию таймера простоя, которая настраивает другой таймер простоя (включая тот же самый таймер простоя) с аргументом secs, меньшим или равным текущему времени простоя. Такой таймер сработает почти немедленно и будет продолжать срабатывать снова и снова, вместо того чтобы ждать следующего момента, когда Emacs станет простаивающим. Правильный подход — это перепланирование с соответствующим увеличением текущего значения времени простоя, как описано ниже.
Если Emacs простаивает, эта функция возвращает продолжительность времени, в течение которого Emacs простаивает, используя тот же формат, что и current-time (см. Время суток).
Когда Emacs не простаивает, current-idle-time возвращает nil. Это удобный способ проверить, простаивает ли Emacs.
Основное применение current-idle-time возникает, когда функция таймера простоя хочет «сделать перерыв» на некоторое время. Она может настроить другой таймер простоя, чтобы вызвать ту же функцию снова, после еще нескольких секунд простоя. Вот пример:
(defvar my-resume-timer nil "Таймер для `my-timer-function' для перепланирования самого себя или nil.") (defun my-timer-function () ;; Если пользователь вводит команду, покаmy-resume-timer;; активен, в следующий раз, когда эта функция будет вызвана из ;; ее основного таймера простоя, деактивироватьmy-resume-timer. (when my-resume-timer (cancel-timer my-resume-timer)) ...выполнить работу некоторое время... (when taking-a-break (setq my-resume-timer (run-with-idle-timer ;; Вычислить время простоя break-length ;; большее, чем текущее значение. (time-add (current-idle-time) break-length) nil 'my-timer-function))))