(provide 'browse-mode)

(or (assq 'browse-mode minor-mode-alist)
    (setq minor-mode-alist (cons '(browse-mode " Browse") minor-mode-alist)))

(defvar browse-mode-map nil
  "*Keymap for Browse mode.")

(defvar browse-check-rcs-lock t
  "*If non-nil, exiting Browse mode confirms you really want to 
edit the file if the file is unlocked under RCS.
This is determined by looking at the value of `mode-line-process'.")

(or browse-mode-map
    (progn
      (setq browse-mode-map (make-keymap))
      (suppress-keymap browse-mode-map)
      (define-key browse-mode-map " " 'scroll-up)
      (define-key browse-mode-map "\177" 'scroll-down)
      (define-key browse-mode-map "n" 'next-line)
      (define-key browse-mode-map "p" 'previous-line)
      (define-key browse-mode-map "N" 'scroll-up-line)
      (define-key browse-mode-map "P" 'scroll-down-line)
      (define-key browse-mode-map "b" 'bury-buffer)
      (define-key browse-mode-map "," 'goto-buffer-start)
      (define-key browse-mode-map "." 'goto-buffer-end)
      (define-key browse-mode-map "l" 'recenter-in-window)
      (define-key browse-mode-map "s" 'isearch-forward-regexp)
      (define-key browse-mode-map "r" 'isearch-backward-regexp)
      (define-key browse-mode-map "o" 'other-window)
      (define-key browse-mode-map "x" 'browse-mode)
      (define-key browse-mode-map "q" 'remove-window)
      (define-key browse-mode-map "k" 'kill-buffer)))

(defun browse-mode (&optional flag)
  "Minor mode for browsing through a buffer.

Simply defines the special single character commands to move cursor
around more easily.  You can use Meta commands (M-x, M-f, etc.)
without leaving the mode.  To exit this mode, hit `x'; this will make
the buffer read/write (the assumption being that you want to now edit
the buffer).  If the buffer is under RCS control, and the file is
unlocked, you are prompted if you really want to edit the buffer.  See
the documentation for the variable `browse-check-rcs-lock'.

Here are the commands:
\\{browse-mode-map}"
  (interactive)
  (make-local-variable 'browse-mode)
  (make-local-variable 'browse-mode-previous-keymap)
  (cond ((if flag (> 0 flag) (not browse-mode))
	 (setq browse-mode t
	       browse-mode-previous-keymap (current-local-map)
	       buffer-read-only t)
	 (use-local-map browse-mode-map)
	 (set-buffer-modified-p (buffer-modified-p)))
	((or (not (and browse-check-rcs-lock
		       (equal mode-line-process " <unlocked>")))
	     (yes-or-no-p "File is unlocked under RCS; edit anyway? "))
	 (setq browse-mode nil
	       buffer-read-only nil)
	 (use-local-map browse-mode-previous-keymap)
	 (set-buffer-modified-p (buffer-modified-p)))))

