Next: Idle Timers, Previous: Time Calculations, Up: System Interface
You can set up a timer to call a function at a specified future time or after a certain length of idleness.
Emacs cannot run timers at any arbitrary point in a Lisp program; it
can run them only when Emacs could accept output from a subprocess:
namely, while waiting or inside certain primitive functions such as
sit-for or read-event which can wait. Therefore, a
timer's execution may be delayed if Emacs is busy. However, the time of
execution is very precise if Emacs is idle.
Emacs binds inhibit-quit to t before calling the timer
function, because quitting out of many timer functions can leave
things in an inconsistent state. This is normally unproblematical
because most timer functions don't do a lot of work. Indeed, for a
timer to call a function that takes substantial time to run is likely
to be annoying.
It is usually a bad idea for timer functions to alter buffer
contents. When they do, they usually should call undo-boundary
both before and after changing the buffer, to separate the timer's
changes from user commands' changes and prevent a single undo entry
from growing to be quite large.
Timer functions should also avoid calling functions that cause Emacs
to wait, such as sit-for (see Waiting). This can lead to
unpredictable effects, since other timers (or even the same timer) can
run while waiting. If a timer function needs to perform an action
after a certain time has elapsed, it can do this by scheduling a new
timer.
If a timer function calls functions that can change the match data, it should save and restore the match data. See Saving Match Data.
This sets up a timer that calls the function function with arguments args at time time. If repeat is a number (integer or floating point), the timer also runs every repeat seconds after that. If repeat is
nil, the timer runs only once.time may specify an absolute or a relative time.
Absolute times may be specified in a wide variety of formats; this function tries to accept all the commonly used date formats. The most convenient formats are strings. Valid such formats include these two,
year-month-day hour:min:sec timezone hour:min:sec timezone month/day/yearwhere in both examples all fields are numbers; the format that
current-time-stringreturns is also allowed, and many others as well.To specify a relative time as a string, use numbers followed by units. For example:
- `1 min'
- denotes 1 minute from now.
- `1 min 5 sec'
- denotes 65 seconds from now.
- `1 min 2 sec 3 hour 4 day 5 week 6 fortnight 7 month 8 year'
- denotes exactly 103 months, 123 days, and 10862 seconds from now.
For relative time values, Emacs considers a month to be exactly thirty days, and a year to be exactly 365.25 days.
Not all convenient formats are strings. If time is a number (integer or floating point), that specifies a relative time measured in seconds.
In most cases, repeat has no effect on when first call takes place—time alone specifies that. There is one exception: if time is
t, then the timer runs whenever the time is a multiple of repeat seconds after the epoch. This is useful for functions likedisplay-time.The function
run-at-timereturns a timer value that identifies the particular scheduled future action. You can use this value to callcancel-timer(see below).
Execute body, but give up after seconds seconds. If body finishes before the time is up,
with-timeoutreturns the value of the last form in body. If, however, the execution of body is cut short by the timeout, thenwith-timeoutexecutes all the timeout-forms and returns the value of the last of them.This macro works by setting a timer to run after seconds seconds. If body finishes before that time, it cancels the timer. If the timer actually runs, it terminates execution of body, then executes timeout-forms.
Since timers can run within a Lisp program only when the program calls a primitive that can wait,
with-timeoutcannot stop executing body while it is in the midst of a computation—only when it calls one of those primitives. So usewith-timeoutonly with a body that waits for input, not one that does a long computation.
The function y-or-n-p-with-timeout provides a simple way to use
a timer to avoid waiting too long for an answer. See Yes-or-No Queries.
This cancels the requested action for timer, which should be a timer—usually, one previously returned by
run-at-timeorrun-with-idle-timer. This cancels the effect of that call to one of these functions; the arrival of the specified time will not cause anything special to happen.