From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: storm@cua.dk (Kim F. Storm) Newsgroups: gmane.emacs.devel Subject: Re: jit-lock timer etc. Date: Mon, 21 Aug 2006 13:39:55 +0200 Message-ID: References: NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: sea.gmane.org 1156160501 12287 80.91.229.2 (21 Aug 2006 11:41:41 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Mon, 21 Aug 2006 11:41:41 +0000 (UTC) Cc: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Mon Aug 21 13:41:37 2006 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1GF89r-0004tg-12 for ged-emacs-devel@m.gmane.org; Mon, 21 Aug 2006 13:41:31 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1GF89q-0004sj-AV for ged-emacs-devel@m.gmane.org; Mon, 21 Aug 2006 07:41:30 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1GF89d-0004sR-At for emacs-devel@gnu.org; Mon, 21 Aug 2006 07:41:17 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1GF89b-0004sD-PV for emacs-devel@gnu.org; Mon, 21 Aug 2006 07:41:16 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1GF89b-0004sA-K6 for emacs-devel@gnu.org; Mon, 21 Aug 2006 07:41:15 -0400 Original-Received: from [195.41.46.237] (helo=pfepc.post.tele.dk) by monty-python.gnu.org with esmtp (Exim 4.52) id 1GF8Gw-0000Cy-2j; Mon, 21 Aug 2006 07:48:50 -0400 Original-Received: from kfs-l.imdomain.dk.cua.dk (unknown [80.165.4.124]) by pfepc.post.tele.dk (Postfix) with SMTP id 0981E8A003A; Mon, 21 Aug 2006 13:41:10 +0200 (CEST) Original-To: martin rudalics , rms@gnu.org In-Reply-To: (Richard Stallman's message of "Mon, 21 Aug 2006 07:12:01 -0400") User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:58628 Archived-At: Richard Stallman writes: > Here's my patch to make the jit-lock timer reschedule itself > instead of waiting. It uses current-idle-time, which I have tested > and checked in, but I can't easily tell whether steath fontification > is working. So I would like someone to test this before I check it in. > > I have not yet tried to read the other proposed change to this code. > I was too tired when I saw it. I strongly prefer the other change proposed by Martin Rudalics which avoids calling sit-for at all in the timer handler. I have installed Martin's patch, and I haven't seen the "cursor disappearing" bug since! However, the approach taken by Martin can be improved by using your new current-idle-time to install a proper idle timer to resume jit-lock. Martin, would you like to try to update your patch ? > > *** jit-lock.el 17 Aug 2006 11:21:10 -0400 1.54 > --- jit-lock.el 18 Aug 2006 07:57:36 -0400 > *************** > *** 171,176 **** > --- 171,180 ---- > > (defvar jit-lock-stealth-timer nil > "Timer for stealth fontification in Just-in-time Lock mode.") > + (defvar jit-lock-stealth-resume-timer nil > + "Timer for resuming stealth fontification in Just-in-time Lock mode. > + When time stealth fontification finishes one batch, it reschedules > + itself using this timer.") > (defvar jit-lock-context-timer nil > "Timer for context fontification in Just-in-time Lock mode.") > (defvar jit-lock-defer-timer nil > *************** > *** 225,230 **** > --- 229,241 ---- > (run-with-idle-timer jit-lock-stealth-time t > 'jit-lock-stealth-fontify))) > > + ;; Set up an idle timer for stealth fontification to resume, > + ;; but don't activate it now. > + (when (and jit-lock-stealth-time (null jit-lock-stealth-timer)) > + (setq jit-lock-stealth-resume-timer (timer-create)) > + (timer-set-function jit-lock-stealth-resume-timer > + 'jit-lock-stealth-fontify)) > + > ;; Init deferred fontification timer. > (when (and jit-lock-defer-time (null jit-lock-defer-timer)) > (setq jit-lock-defer-timer > *************** > *** 449,454 **** > --- 460,466 ---- > 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 > + (cancel-timer jit-lock-stealth-resume-timer) > (unless (or executing-kbd-macro > memory-full > (window-minibuffer-p (selected-window))) > *************** > *** 457,512 **** > 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)))))))))))))) > > > > --- 469,527 ---- > minibuffer-auto-raise > message-log-max) > (with-local-quit > ! (when (and jit-lock-mode buffers (not (input-pending-p))) > (with-current-buffer (pop buffers) > ! ;; 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)) > ! ;; Make this timer resume jit-lock in a few > ! ;; seconds. Compute an idleness time suitably > ! ;; larger than the current one. > ! (timer-set-idle-time jit-lock-stealth-resume-timer > ! (current-idle-time)) > ! (timer-inc-time (or jit-lock-stealth-time 30)) > ! (timer-activate-when-idle > ! jit-lock-stealth-resume-timer t))))))))))) > > > -- Kim F. Storm http://www.cua.dk