;; Author: Simon Marshall <simon@gnu.org>
;; Keywords: faces files
-;; Version: 2.09
+;; Version: 2.10
;;; This file is part of GNU Emacs.
;; - Made various wrapping `inhibit-point-motion-hooks' (Vinicius Latorre hint)
;; - Made `lazy-lock-fontify-after-idle' wrap `minibuffer-auto-raise'
;; - Made `lazy-lock-fontify-after-defer' paranoid about deferred buffers
+;; 2.09--2.10:
+;; - Use `window-end' UPDATE arg for Emacs 20.3 and later.
+;; - Made deferral `widen' before unfontifying (Dan Nicolaescu report)
+;; - Use `lazy-lock-fontify-after-visage' for hideshow.el (Dan Nicolaescu hint)
+;; - Use `other' widget where possible (Andreas Schwab fix)
\f
;;; Code:
; "Submit via mail a bug report on lazy-lock.el."
; (interactive)
; (let ((reporter-prompt-for-summary-p t))
-; (reporter-submit-bug-report "simon@gnu.ai.mit.edu" "lazy-lock 2.09"
+; (reporter-submit-bug-report "simon@gnu.ai.mit.edu" "lazy-lock 2.10"
; '(lazy-lock-minimum-size lazy-lock-defer-on-the-fly
; lazy-lock-defer-on-scrolling lazy-lock-defer-contextually
; lazy-lock-defer-time lazy-lock-stealth-time
The value of this variable is used when Lazy Lock mode is turned on."
:type '(choice (const :tag "never" nil)
(const :tag "always" t)
- (sexp :tag "eventually" :format "%t\n" eventually))
+ (other :tag "eventually" eventually))
:group 'lazy-lock)
(defcustom lazy-lock-defer-contextually 'syntax-driven
The value of this variable is used when Lazy Lock mode is turned on."
:type '(choice (const :tag "never" nil)
(const :tag "always" t)
- (sexp :tag "syntax-driven" :format "%t\n" syntax-driven))
+ (other :tag "syntax-driven" syntax-driven))
:group 'lazy-lock)
(defcustom lazy-lock-defer-time
;;
;; Add package-specific hook.
(make-local-hook 'outline-view-change-hook)
- (add-hook 'outline-view-change-hook 'lazy-lock-fontify-after-outline nil t))
+ (add-hook 'outline-view-change-hook 'lazy-lock-fontify-after-visage nil t)
+ (make-local-hook 'hs-hide-hook)
+ (add-hook 'hs-hide-hook 'lazy-lock-fontify-after-visage nil t))
(defun lazy-lock-install-timers (dtime stime)
;; Schedule or re-schedule the deferral and stealth timers.
(remove-hook 'after-change-functions 'lazy-lock-fontify-rest-after-change t)
(remove-hook 'after-change-functions 'lazy-lock-defer-line-after-change t)
(remove-hook 'after-change-functions 'lazy-lock-defer-rest-after-change t)
- (remove-hook 'outline-view-change-hook 'lazy-lock-fontify-after-outline t))
+ (remove-hook 'outline-view-change-hook 'lazy-lock-fontify-after-visage t)
+ (remove-hook 'hs-hide-hook 'lazy-lock-fontify-after-visage t))
\f
;; Hook functions.
(defun lazy-lock-fontify-after-scroll (window window-start)
;; Called from `window-scroll-functions'.
- ;; Fontify WINDOW from WINDOW-START following the scroll. We cannot use
- ;; `window-end' so we work out what it would be via `vertical-motion'.
+ ;; Fontify WINDOW from WINDOW-START following the scroll.
(let ((inhibit-point-motion-hooks t))
- (save-excursion
- (goto-char window-start)
- (vertical-motion (window-height window) window)
- (lazy-lock-fontify-region window-start (point))))
+ (lazy-lock-fontify-region window-start (window-end window t)))
;; A prior deletion that did not cause scrolling, followed by a scroll, would
;; result in an unnecessary trigger after this if we did not cancel it now.
(set-window-redisplay-end-trigger window nil))
(defun lazy-lock-fontify-after-trigger (window trigger-point)
;; Called from `redisplay-end-trigger-functions'.
- ;; Fontify WINDOW from TRIGGER-POINT. We cannot use `window-end' so we work
- ;; out what it would be via `vertical-motion'.
+ ;; Fontify WINDOW from TRIGGER-POINT following the redisplay.
;; We could probably just use `lazy-lock-fontify-after-scroll' without loss:
- ;; (lazy-lock-fontify-after-scroll window (window-start window))
+ ;; (inline (lazy-lock-fontify-after-scroll window (window-start window)))
(let ((inhibit-point-motion-hooks t))
- (save-excursion
- (goto-char (window-start window))
- (vertical-motion (window-height window) window)
- (lazy-lock-fontify-region trigger-point (point)))))
+ (lazy-lock-fontify-region trigger-point (window-end window t))))
;; 2. Modified text must be marked as unfontified so it can be identified and
;; fontified later when Emacs is idle. Deferral occurs by adding one of
(save-buffer-state nil
(unless (memq (current-buffer) lazy-lock-buffers)
(push (current-buffer) lazy-lock-buffers))
- (remove-text-properties end (point-max) '(lazy-lock nil))))
+ (save-restriction
+ (widen)
+ (remove-text-properties end (point-max) '(lazy-lock nil)))))
(defun lazy-lock-defer-line-after-change (beg end old-len)
;; Called from `after-change-functions'.
(save-buffer-state nil
(unless (memq (current-buffer) lazy-lock-buffers)
(push (current-buffer) lazy-lock-buffers))
- (remove-text-properties (max (1- beg) (point-min))
- (point-max)
- '(lazy-lock nil))))
+ (save-restriction
+ (widen)
+ (remove-text-properties (max (1- beg) (point-min))
+ (point-max)
+ '(lazy-lock nil)))))
;; 3. Deferred fontification and stealth fontification are done from these two
;; functions. They are set up as Idle Timers.
;; 4. Special circumstances.
-(defun lazy-lock-fontify-after-outline ()
- ;; Called from `outline-view-change-hook'.
+(defun lazy-lock-fontify-after-visage ()
+ ;; Called from `outline-view-change-hook' and `hs-hide-hook'.
;; Fontify windows showing the current buffer, as its visibility has changed.
- ;; This is a conspiracy hack between lazy-lock.el and noutline.el.
+ ;; This is a conspiracy hack between lazy-lock.el, outline.el and
+ ;; hideshow.el.
(let ((windows (get-buffer-window-list (current-buffer) 'nomini t)))
(while windows
(lazy-lock-fontify-conservatively (car windows))
(mapcar 'lazy-lock-fontify-conservatively
(get-buffer-window-list (pop lazy-lock-install) 'nomini t)))))
+(when (if (save-match-data (string-match "Lucid\\|XEmacs" (emacs-version)))
+ nil
+ (or (and (= emacs-major-version 20) (< emacs-minor-version 3))
+ (= emacs-major-version 19)))
+ ;;
+ ;; We use `vertical-motion' rather than `window-end' UPDATE arg.
+ (defun lazy-lock-fontify-after-scroll (window window-start)
+ ;; Called from `window-scroll-functions'.
+ ;; Fontify WINDOW from WINDOW-START following the scroll. We cannot use
+ ;; `window-end' so we work out what it would be via `vertical-motion'.
+ (let ((inhibit-point-motion-hooks t))
+ (save-excursion
+ (goto-char window-start)
+ (vertical-motion (window-height window) window)
+ (lazy-lock-fontify-region window-start (point))))
+ (set-window-redisplay-end-trigger window nil))
+ (defun lazy-lock-fontify-after-trigger (window trigger-point)
+ ;; Called from `redisplay-end-trigger-functions'.
+ ;; Fontify WINDOW from TRIGGER-POINT following the redisplay. We cannot
+ ;; use `window-end' so we work out what it would be via `vertical-motion'.
+ (let ((inhibit-point-motion-hooks t))
+ (save-excursion
+ (goto-char (window-start window))
+ (vertical-motion (window-height window) window)
+ (lazy-lock-fontify-region trigger-point (point))))))
+
(when (consp lazy-lock-defer-time)
;;
;; In 2.06.04 and below, `lazy-lock-defer-time' could specify modes and time.