Вы можете настроить таймер для вызова функции в указанное будущее время или после определённого периода бездействия. Таймер — это специальный объект, который хранит информацию о времени следующего вызова и вызываемой функции.
Эта функция-предикат возвращает ненулевое значение (nil), если объект является таймером.
Emacs не может выполнять таймеры в произвольной точке программы на Lisp; он может выполнять их только тогда, когда Emacs может принимать вывод от подпроцесса: а именно, во время ожидания или внутри некоторых примитивных функций, таких как sit-for или read-event, которые могут ожидать. Следовательно, выполнение таймера может быть отложено, если Emacs занят. Однако время выполнения очень точное, если Emacs бездействует.
Emacs привязывает inhibit-quit к t перед вызовом функции таймера, потому что выход из многих функций таймера может оставить систему в несогласованном состоянии. Обычно это не вызывает проблем, поскольку большинство функций таймера не выполняют много работы. Действительно, для таймера вызывать функцию, которая выполняется значительное время, скорее всего, будет раздражать. Если функции таймера необходимо разрешить выход, она должна использовать with-local-quit (см. Выход). Например, если функция таймера вызывает accept-process-output для получения вывода от внешнего процесса, этот вызов должен быть обёрнут в with-local-quit, чтобы гарантировать, что C-g сработает, если внешний процесс зависнет.
Обычно для функций таймера изменять содержимое буферов — плохая идея. Когда они это делают, им обычно следует вызывать undo-boundary как до, так и после изменения буфера, чтобы отделить изменения таймера от изменений пользовательских команд и предотвратить чрезмерный рост одной записи отмены.
Функции таймера также должны избегать вызова функций, которые заставляют Emacs ожидать, таких как sit-for (см. Ожидание истекшего времени или ввода). Это может привести к непредсказуемым эффектам, поскольку другие таймеры (или даже тот же самый) могут выполняться во время ожидания. Если функции таймера необходимо выполнить действие по истечении определённого времени, она может сделать это, запланировав новый таймер.
Если функция таймера выполняет операцию с удалённым файлом, она может конфликтовать с уже выполняющейся операцией с удалённым файлом того же соединения. Такие конфликты обнаруживаются и приводят к ошибке remote-file-error (см. Стандартные ошибки). Это следует защищать, оборачивая тело функции таймера в
(ignore-error 'remote-file-error …)
Если функция таймера вызывает функции, которые могут изменять данные сопоставления, она должна сохранять и восстанавливать данные сопоставления. См. Сохранение и восстановление данных сопоставления.
Это настраивает таймер, который вызывает функцию с аргументами аргументы в момент времени время. Если повтор является числом (целым или числом с плавающей запятой), таймер планируется для повторного запуска каждые повтор секунд после время. Если повтор равен nil, таймер запускается только один раз.
время может указывать абсолютное или относительное время.
Абсолютное время может быть задано с помощью строки ограниченного разнообразия форматов и считается временем сегодня, даже если оно уже прошло. Распознаваемые формы: ‘xxxx’, ‘x:xx’, или ‘xx:xx’ (военное время), и ‘xxam’, ‘xxAM’, ‘xxpm’, ‘xxPM’, ‘xx:xxam’, ‘xx:xxAM’, ‘xx:xxpm’, или ‘xx:xxPM’. Для разделения частей часов и минут вместо двоеточия можно использовать точку.
Чтобы задать относительное время в виде строки, используйте числа, за которыми следуют единицы измерения. Например:
означает 1 минуту от текущего момента.
означает 65 секунд от текущего момента.
означает ровно 103 месяца, 123 дня и 10862 секунды от текущего момента.
Для значений относительного времени Emacs считает месяц равным ровно тридцати дням, а год — ровно 365,25 дня.
Не все удобные форматы являются строками. Если время является числом (целым или числом с плавающей запятой), оно задаёт относительное время, измеряемое в секундах. Результат encode-time также можно использовать для задания абсолютного значения время.
В большинстве случаев повтор не влияет на то, когда состоится первый вызов — его определяет только время. Существует одно исключение: если время равно t, то таймер запускается всякий раз, когда время кратно повтор секунд с начала эпохи. Это полезно для таких функций, как display-time. Например, следующий код заставит функцию запускаться каждую «ровную» минуту (например, ‘11:03:00’, ‘11:04:00’ и т. д.):
(run-at-time t 60 функция)
Если Emacs не получил процессорное время в момент, когда должен был запуститься таймер (например, если система была занята выполнением другого процесса, или компьютер спал или находился в приостановленном состоянии), таймер запустится, как только Emacs возобновит работу и перейдёт в состояние бездействия.
Функция run-at-time возвращает значение таймера, которое идентифицирует запланированное действие. Это значение можно использовать для вызова cancel-timer (см. ниже).
Это полностью аналогично run-at-time (поэтому смотрите это определение для пояснения параметров; сек передаётся как время в ту функцию), но предназначено для использования, когда задержка задаётся в секундах.
Повторяющийся таймер номинально должен запускаться каждые повтор секунд, но помните, что любой вызов таймера может опоздать. Опоздание одного повторения не влияет на запланированное время следующего повторения. Например, если Emacs занят вычислениями достаточно долго, чтобы пропустить три запланированных срабатывания таймера, а затем начинает ожидать, он немедленно вызовет функцию таймера три раза подряд (при условии, что никакие другие таймеры не сработают до или между ними). Если вы хотите, чтобы таймер запускался не ранее чем через n секунд после последнего вызова, не используйте аргумент повтор. Вместо этого функция таймера должна явно переназначать таймер.
Значение этой переменной задаёт максимальное количество раз, которое можно повторно вызывать функцию таймера подряд, если многие ранее запланированные вызовы были неизбежно задержаны.
Выполнить тело, но завершить выполнение через секунды секунд. Если тело завершается до истечения времени, with-timeout возвращает значение последней формы в тело. Если же выполнение тело прерывается по таймауту, то with-timeout выполняет все формы-таймаута и возвращает значение последней из них.
Этот макрос работает путём установки таймера на запуск через секунды секунд. Если тело завершается до этого времени, он отменяет таймер. Если таймер действительно срабатывает, он прекращает выполнение тело, затем выполняет формы-таймаута.
Поскольку таймеры могут выполняться внутри программы на Lisp только тогда, когда программа вызывает примитив, который может ожидать, with-timeout не может остановить выполнение тело, пока оно находится в середине вычисления — только когда оно вызывает один из таких примитивов. Поэтому используйте with-timeout только с телом, которое ожидает ввод, а не с тем, которое выполняет длительное вычисление.
Функция y-or-n-p-with-timeout предоставляет простой способ использовать таймер, чтобы избежать слишком долгого ожидания ответа. См. Запросы «Да» или «Нет».
Это отменяет запрошенное действие для таймера, который должен быть таймером — обычно ранее возвращённым run-at-time или run-with-idle-timer. Это отменяет эффект того вызова одной из этих функций; наступление указанного времени не вызовет никаких особых действий.
Команда list-timers выводит список всех активных в данный момент таймеров. Команда c (timer-list-cancel) отменяет таймер в строке под точкой. Вы можете отсортировать список по столбцу с помощью команды S (tabulated-list-sort).