diff lisp/modes/lazy-shot.el @ 193:f53b5ca2e663 r20-3b23

Import from CVS: tag r20-3b23
author cvs
date Mon, 13 Aug 2007 09:58:30 +0200
parents
children a2f645c6b9f8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/modes/lazy-shot.el	Mon Aug 13 09:58:30 2007 +0200
@@ -0,0 +1,136 @@
+;;; lazy-shot.el --- Lazy font locking for XEmacs
+
+;; Copyright (C) 1997 Jan Vroonhof
+
+;; Author: Jan Vroonhof <vroonhof@math.ethz.ch>
+;; Keywords: languages, faces
+
+;; This file is part of XEmacs
+
+;; XEmacs is free software; you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; XEmacs is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with XEmacs; see the file COPYING.  If not, write to the 
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Synched up with:  Not synched.
+
+;;; Commentary:
+
+;; This versions has basic demand lock functionality. Somebody please
+;; sync further with lazy-lock v2 from FSF, customize etc.
+;;
+;;
+;; Idea for the stealth lock function:
+;;
+;;
+;; On an Idle itimer
+;;    Loop over all buffers with lazy-lock set
+;;       mapcar-extent in the region  (point) point-max for
+;;                      one-shot-function property
+;;         If not found do the same for [point-min,point]
+;;         font-lock the found region and delete the extent
+
+;;; Code:
+
+(require 'font-lock)
+
+(defvar lazy-shot-mode nil)
+
+
+(defvar lazy-shot-step-size (* 1 124)) ;; Please test diffent sizes
+
+;;;###autoload
+(defun lazy-shot-mode (&optional arg)
+  "Toggle Lazy Lock mode.
+With arg, turn Lazy Lock mode on if and only if arg is positive."
+  (interactive "P")
+  (set (make-local-variable 'lazy-shot-mode)
+       (and (if arg (> (prefix-numeric-value arg) 0) (not lazy-shot-mode))))
+  (cond ((and lazy-shot-mode (not font-lock-mode))
+	 ;; Turned on `lazy-shot-mode' rather than `font-lock-mode'.
+	 (let ((font-lock-support-mode 'lazy-shot-mode))
+	   (font-lock-mode t)))
+	(lazy-shot-mode
+	 ;; Turn ourselves on.
+	 (lazy-shot-install))
+	(t
+	 ;; Turn ourselves off.
+	 (lazy-shot-unstall))))
+
+;;;###autoload
+(defun turn-on-lazy-shot ()
+  "Unconditionally turn on Lazy Lock mode."
+  (lazy-shot-mode t))
+
+
+(defun lazy-shot-shot-function (extent)
+   "Lazy lock the extent when it has become visisble"
+   (let ((start (extent-start-position extent))
+         (end   (extent-end-position extent))
+	 (buffer (extent-buffer extent)))
+     (delete-extent extent)
+     (save-excursion 
+       ;; This magic should really go into font-lock-fonity-region
+       (goto-char start)
+       (unless (bolp)
+	 (beginning-of-line)
+	 (setq start (point)))
+       (goto-char end)
+       (unless (bolp)
+	 (forward-line)
+	 (setq end (point)))
+       (message "Lazy-shot fontifying from %s to %s in %s" start end buffer)
+       (save-match-data
+	   (font-lock-fontify-region start end)))))
+
+(defun lazy-shot-install-extent (spos epos &optional buffer)
+  "Make an extent that will lazy-shot if it is displayed"
+     (let ((extent (make-extent spos epos buffer)))
+       (when extent
+         (set-extent-one-shot-function extent
+                       'lazy-shot-shot-function))
+       extent))
+
+(defun lazy-shot-install-extents (fontifying)
+  ;;
+  ;; Add hook if lazy-shot.el is deferring or is fontifying on scrolling.
+     (when fontifying
+     (let ((start  (point-min)))
+      (while (< start (point-max))
+         (lazy-shot-install-extent start
+           (min (point-max) (+ start lazy-shot-step-size)))
+         (setq start (+ start lazy-shot-step-size))))))
+
+(defun lazy-shot-install ()
+  (make-local-variable 'font-lock-fontified)
+  (setq font-lock-fontified t)
+  (lazy-shot-install-extents font-lock-fontified))
+
+(defun lazy-shot-unstall ()
+  ;;
+  ;; Remove the extents.
+  (map-extents 
+     (lambda (e arg) (delete-extent e) nil) 
+     nil nil nil nil nil 'one-shot-function 'lazy-shot-shot-function)
+  ;;
+  ;; Remove the fontification hooks.
+  (remove-hook 'after-change-functions 'lazy-shot-defer-after-change t)
+  ;;
+  ;; If Font Lock mode is still enabled, reinstall its hook.
+  (when font-lock-mode
+    (add-hook 'after-change-functions 'font-lock-after-change-function nil t)))
+
+
+(provide 'lazy-shot)
+
+;;; lazy-shot.el ends here