;; $Id: lff.el,v 1.1 1997/06/06 08:22:03 friedman Exp $

(require 'timer)

(defvar lff-timer nil)
(defvar lff-mark nil)
(defvar lff-file nil)
(defvar lff-interval 5)

(defvar lff-mode-map nil)

(defun lff (file)
  (interactive "fLive find file: ")
  (setq file (expand-file-name file))
  (switch-to-buffer (create-file-buffer file))
  (lff-mode)
  (lff-timer-start file))

(put 'lff-mode 'mode-class 'special)

(defun lff-mode ()
  (setq major-mode 'lff-mode)
  (setq mode-name "Live")
  (buffer-disable-undo)
  (setq buffer-read-only nil)
  (make-local-variable 'lff-timer)
  (setq lff-timer nil)
  (make-local-variable 'lff-mark)
  (setq lff-mark nil)
  (make-local-variable 'lff-file)
  (setq lff-file nil)
  (or lff-mode-map
      (lff-initialize-mode-map))
  (use-local-map lff-mode-map)
  (run-hooks 'lff-mode-hook))

(defun lff-initialize-mode-map ()
  (setq lff-mode-map (make-sparse-keymap))
  (define-key lff-mode-map " "    'scroll-up)
  (define-key lff-mode-map "<"    'beginning-of-buffer)
  (define-key lff-mode-map ">"    'end-of-buffer)
  (define-key lff-mode-map "?"    'lff-command-help)
  (define-key lff-mode-map "\C-?" 'scroll-down)
  (define-key lff-mode-map "h"    'lff-command-help)
  (define-key lff-mode-map "n"    'lff-command-notify)
  (define-key lff-mode-map "q"    'kill-buffer)
  (define-key lff-mode-map "r"    'lff-command-reread))

(defun live-mode (&optional arg)
  "View/edit a growing or changing file."
  (interactive "P")
  (setq live-mode
	(if (null arg)
	    (not live-mode)
	  (> (prefix-numeric-value arg) 0)))
  (if (timerp live-timer)
      (cancel-timer live-timer))
  (if live-mode
      (setq live-timer (run-with-timer live-interval live-interval
				       'live-check-file (current-buffer)))))

(defun live-check-file (buffer)
  (save-excursion
    (set-buffer buffer)
    (let ((file (buffer-file-name)))
      (if (and file
	       (not (buffer-modified-p))
	       (not (verify-visited-file-modtime buffer)))
	  (revert-buffer t t)))))

;;; live-mode.el ends here
