Function: jit-lock-fontify-now

jit-lock-fontify-now is a byte-compiled function defined in jit-lock.el.gz.

Signature

(jit-lock-fontify-now &optional START END)

Documentation

Fontify current buffer from START to END.

Defaults to the whole buffer. END can be out of bounds.

Source Code

;; Defined in /usr/src/emacs/lisp/jit-lock.el.gz
(defun jit-lock-fontify-now (&optional start end)
  "Fontify current buffer from START to END.
Defaults to the whole buffer.  END can be out of bounds."
  (with-silent-modifications
   (save-excursion
     (unless start (setq start (point-min)))
     (setq end (if end (min end (point-max)) (point-max)))
     (let ((orig-start start) next)
       (save-match-data
	 ;; Fontify chunks beginning at START.  The end of a
	 ;; chunk is either `end', or the start of a region
	 ;; before `end' that has already been fontified.
	 (while (and start (< start end))
	   ;; Determine the end of this chunk.
	   (setq next (or (text-property-any start end 'fontified t)
			  end))

           ;; Avoid unnecessary work if the chunk is empty (bug#23278).
           (when (> next start)
             ;; Fontify the chunk, and mark it as fontified.
             ;; We mark it first, to make sure that we don't indefinitely
             ;; re-execute this fontification if an error occurs.
             (put-text-property start next 'fontified t)
             (pcase-let
                 ;; `tight' is the part we've fully refontified, and `loose'
                 ;; is the part we've partly refontified (some of the
                 ;; functions have refontified it but maybe not all).
                 ((`(,tight-beg ,tight-end ,loose-beg ,_loose-end)
                   (condition-case err
                       (jit-lock--run-functions start next)
                     ;; If the user quits (which shouldn't happen in normal
                     ;; on-the-fly jit-locking), make sure the fontification
                     ;; will be performed before displaying the block again.
                     (quit (put-text-property start next 'fontified nil)
                           (signal (car err) (cdr err))))))

               ;; In case we fontified more than requested, take
               ;; advantage of the good news.
               (when (or (< tight-beg start) (> tight-end next))
                 (put-text-property tight-beg tight-end 'fontified t))

               ;; Make sure the contextual refontification doesn't re-refontify
               ;; what's already been refontified.
               (when (and jit-lock-context-unfontify-pos
                          (< jit-lock-context-unfontify-pos tight-end)
                          (>= jit-lock-context-unfontify-pos tight-beg)
                          ;; Don't move boundary forward if we have to
                          ;; refontify previous text.  Otherwise, we risk moving
                          ;; it past the end of the multiline property and thus
                          ;; forget about this multiline region altogether.
                          (not (get-text-property tight-beg
                                                  'jit-lock-defer-multiline)))
                 (setq jit-lock-context-unfontify-pos tight-end))

               ;; The redisplay engine has already rendered the buffer up-to
               ;; `orig-start' and won't notice if the above jit-lock-functions
               ;; changed the appearance of any part of the buffer prior
               ;; to that.  So if `loose-beg' is before `orig-start', we need to
               ;; cause a new redisplay cycle after this one so that the changes
               ;; are properly reflected on screen.
               ;; To make such repeated redisplay happen less often, we can
               ;; eagerly extend the refontified region with
               ;; jit-lock-after-change-extend-region-functions.
               (when (< loose-beg orig-start)
                 (run-with-timer 0 nil #'jit-lock-force-redisplay
                                 (copy-marker loose-beg)
                                 (copy-marker orig-start)))

               ;; Skip to the end of the fully refontified part.
               (setq start tight-end)))
           ;; Find the start of the next chunk, if any.
           (setq start
                 (text-property-any start end 'fontified nil))))))))