* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):

Accept internal time format for SECS arg.
	(timer-relative-time): Doc fix.

	* jit-lock.el: "Stealth fontification by requeuing timers" patch,
	adapted from Martin Rudalics.
	(jit-lock-stealth-repeat-timer, jit-lock-stealth-buffers): New vars.
	(jit-lock-mode): Create jit-lock-stealth-repeat-timer.
	(jit-lock-stealth-fontify): Reschedule as a idle timer instead of
	using sit-for.
This commit is contained in:
Chong Yidong 2006-08-24 23:40:00 +00:00
parent 8d8dafebb3
commit 1063efe807
3 changed files with 84 additions and 67 deletions

View file

@ -1,3 +1,16 @@
2006-08-24 Chong Yidong <cyd@stupidchicken.com>
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Accept internal time format for SECS arg.
(timer-relative-time): Doc fix.
* jit-lock.el: "Stealth fontification by requeuing timers" patch,
adapted from Martin Rudalics.
(jit-lock-stealth-repeat-timer, jit-lock-stealth-buffers): New vars.
(jit-lock-mode): Create jit-lock-stealth-repeat-timer.
(jit-lock-stealth-fontify): Reschedule as a idle timer instead of
using sit-for.
2006-08-24 Francesc Rocher <francesc.rocher@gmail.com>
* cus-start.el (all): Add `overline-margin' and

View file

@ -60,14 +60,22 @@ fire repeatedly that many seconds apart."
(defun timer-set-idle-time (timer secs &optional repeat)
"Set the trigger idle time of TIMER to SECS.
SECS may be an integer, floating point number, or the internal
time format (HIGH LOW USECS) returned by, e.g., `current-idle-time'.
If optional third argument REPEAT is non-nil, make the timer
fire each time Emacs is idle for that many seconds."
(or (timerp timer)
(error "Invalid timer"))
(aset timer 1 0)
(aset timer 2 0)
(aset timer 3 0)
(timer-inc-time timer secs)
(if (consp secs)
(progn (aset timer 1 (car secs))
(aset timer 2 (if (consp (cdr secs)) (car (cdr secs)) (cdr secs)))
(aset timer 3 (or (and (consp (cdr secs)) (consp (cdr (cdr secs)))
(nth 2 secs))
0)))
(aset timer 1 0)
(aset timer 2 0)
(aset timer 3 0)
(timer-inc-time timer secs))
(aset timer 4 repeat)
timer)
@ -104,7 +112,7 @@ of SECS seconds since the epoch. SECS may be a fraction."
(defun timer-relative-time (time secs &optional usecs)
"Advance TIME by SECS seconds and optionally USECS microseconds.
SECS may be a fraction."
SECS may be either an integer or a floating point number."
(let ((high (car time))
(low (if (consp (cdr time)) (nth 1 time) (cdr time)))
(micro (if (numberp (car-safe (cdr-safe (cdr time))))
@ -412,7 +420,8 @@ This function is for compatibility; see also `run-with-timer'."
(defun run-with-idle-timer (secs repeat function &rest args)
"Perform an action the next time Emacs is idle for SECS seconds.
The action is to call FUNCTION with arguments ARGS.
SECS may be an integer or a floating point number.
SECS may be an integer, a floating point number, or the internal
time format (HIGH LOW USECS) returned by, e.g., `current-idle-time'.
If Emacs is currently idle, and has been idle for N seconds (N < SECS),
then it will call FUNCTION in SECS - N seconds from now.

View file

@ -171,6 +171,8 @@ If nil, contextual fontification is disabled.")
(defvar jit-lock-stealth-timer nil
"Timer for stealth fontification in Just-in-time Lock mode.")
(defvar jit-lock-stealth-repeat-timer nil
"Timer for repeated stealth fontification in Just-in-time Lock mode.")
(defvar jit-lock-context-timer nil
"Timer for context fontification in Just-in-time Lock mode.")
(defvar jit-lock-defer-timer nil
@ -178,6 +180,8 @@ If nil, contextual fontification is disabled.")
(defvar jit-lock-defer-buffers nil
"List of buffers with pending deferred fontification.")
(defvar jit-lock-stealth-buffers nil
"List of buffers that are being fontified stealthily.")
;;; JIT lock mode
@ -225,6 +229,13 @@ the variable `jit-lock-stealth-nice'."
(run-with-idle-timer jit-lock-stealth-time t
'jit-lock-stealth-fontify)))
;; Create, but do not activate, the idle timer for repeated
;; stealth fontification.
(when (and jit-lock-stealth-time (null jit-lock-stealth-repeat-timer))
(setq jit-lock-stealth-repeat-timer (timer-create))
(timer-set-function jit-lock-stealth-repeat-timer
'jit-lock-stealth-fontify '(t)))
;; Init deferred fontification timer.
(when (and jit-lock-defer-time (null jit-lock-defer-timer))
(setq jit-lock-defer-timer
@ -443,71 +454,55 @@ Value is nil if there is nothing more to fontify."
(t next))))
result))))
(defun jit-lock-stealth-fontify ()
(defun jit-lock-stealth-fontify (&optional repeat)
"Fontify buffers stealthily.
This functions is called after Emacs has been idle for
`jit-lock-stealth-time' seconds."
;; I used to check `inhibit-read-only' here, but I can't remember why. -stef
This function is called repeatedly after Emacs has become idle for
`jit-lock-stealth-time' seconds. Optional argument REPEAT is expected
non-nil in a repeated invocation of this function."
;; Cancel timer for repeated invocations.
(unless repeat
(cancel-timer jit-lock-stealth-repeat-timer))
(unless (or executing-kbd-macro
memory-full
(window-minibuffer-p (selected-window)))
(let ((buffers (buffer-list))
(outer-buffer (current-buffer))
(window-minibuffer-p (selected-window))
;; For first invocation set up `jit-lock-stealth-buffers'.
;; In repeated invocations it's already been set up.
(null (if repeat
jit-lock-stealth-buffers
(setq jit-lock-stealth-buffers (buffer-list)))))
(let ((buffer (car jit-lock-stealth-buffers))
(delay 0)
minibuffer-auto-raise
message-log-max)
(with-local-quit
(while (and buffers (not (input-pending-p)))
(with-current-buffer (pop buffers)
(when jit-lock-mode
;; This is funny. Calling sit-for with 3rd arg non-nil
;; so that it doesn't redisplay, internally calls
;; wait_reading_process_input also with a parameter
;; saying "don't redisplay." Since this function here
;; is called periodically, this effectively leads to
;; process output not being redisplayed at all because
;; redisplay_internal is never called. (That didn't
;; work in the old redisplay either.) So, we learn that
;; we mustn't call sit-for that way here. But then, we
;; have to be cautious not to call sit-for in a widened
;; buffer, since this could display hidden parts of that
;; buffer. This explains the seemingly weird use of
;; save-restriction/widen here.
(with-temp-message (if jit-lock-stealth-verbose
(concat "JIT stealth lock "
(buffer-name)))
;; In the following code, the `sit-for' calls cause a
;; redisplay, so it's required that the
;; buffer-modified flag of a buffer that is displayed
;; has the right value---otherwise the mode line of
;; an unmodified buffer would show a `*'.
(let (start
(nice (or jit-lock-stealth-nice 0))
(point (point-min)))
(while (and (setq start
(jit-lock-stealth-chunk-start point))
;; In case sit-for runs any timers,
;; give them the expected current buffer.
(with-current-buffer outer-buffer
(sit-for nice)))
;; fontify a block.
(jit-lock-fontify-now start (+ start jit-lock-chunk-size))
;; If stealth jit-locking is done backwards, this leads to
;; excessive O(n^2) refontification. -stef
;; (when (>= jit-lock-context-unfontify-pos start)
;; (setq jit-lock-context-unfontify-pos end))
;; Wait a little if load is too high.
(when (and jit-lock-stealth-load
(> (car (load-average)) jit-lock-stealth-load))
;; In case sit-for runs any timers,
;; give them the expected current buffer.
(with-current-buffer outer-buffer
(sit-for (or jit-lock-stealth-time 30))))))))))))))
message-log-max
start)
(if (and jit-lock-stealth-load
(> (car (load-average)) jit-lock-stealth-load))
;; Wait a little if load is too high.
(setq delay jit-lock-stealth-time)
(if (buffer-live-p buffer)
(with-current-buffer buffer
(if (and jit-lock-mode
(setq start (jit-lock-stealth-chunk-start (point))))
;; Fontify one block of at most `jit-lock-chunk-size'
;; characters.
(with-temp-message (if jit-lock-stealth-verbose
(concat "JIT stealth lock "
(buffer-name)))
(jit-lock-fontify-now start
(+ start jit-lock-chunk-size))
;; Run again after `jit-lock-stealth-nice' seconds.
(setq delay (or jit-lock-stealth-nice 0)))
;; Nothing to fontify here. Remove this buffer from
;; `jit-lock-stealth-buffers' and run again immediately.
(setq jit-lock-stealth-buffers (cdr jit-lock-stealth-buffers))))
;; Buffer is no longer live. Remove it from
;; `jit-lock-stealth-buffers' and run again immediately.
(setq jit-lock-stealth-buffers (cdr jit-lock-stealth-buffers))))
;; Call us again.
(when jit-lock-stealth-buffers
(timer-set-idle-time jit-lock-stealth-repeat-timer (current-idle-time))
(timer-inc-time jit-lock-stealth-repeat-timer delay)
(timer-activate-when-idle jit-lock-stealth-repeat-timer t)))))
;;; Deferred fontification.