(require 'interlist) (defvar presentation-mode nil "Tells if `presentation-mode' is active in buffer.") (defvar presentation-normal-keymap nil "The normal keymap used in this buffer.") (defvar presentation-old-read-only nil "Old value of read-only flag for buffer.") (make-variable-buffer-local 'presentation-mode) (make-variable-buffer-local 'presentation-normal-keymap) (putassq 'presentation-mode '(" OH") minor-mode-alist) (defun presentation-scroll-up () (interactive) (condition-case () (scroll-up) (end-of-buffer (let ((saved-point (point))) (narrow-to-page +1) (if (= (point) saved-point) (signal 'end-of-buffer nil)))))) (defun presentation-scroll-down () (interactive) (condition-case () (scroll-down) (beginning-of-buffer (let ((saved-point (point))) (narrow-to-page -1) (if (= (point) saved-point) (signal 'beginning-of-buffer nil) ;; XXX: I'm not sure which of the two behaviours below I want. (if nil (goto-char (point-min)) (goto-char (point-max)) (recenter -1) (move-to-window-line 0))))))) (defun presentation-mode (&optional arg) "Minor mode for displaying a file as a \"slide presentation\"." (interactive "P") (let ((new-presentation-mode-value (if arg (> (prefix-numeric-value arg) 0) (not presentation-mode)))) (cond ;; Toggle from normal to presentation mode ((and new-presentation-mode-value (not presentation-mode)) (setq presentation-old-read-only buffer-read-only buffer-read-only t presentation-normal-keymap (current-local-map)) (use-local-map (copy-keymap (or (current-local-map) (make-sparse-keymap)))) (local-set-key " " #'presentation-scroll-up) (local-set-key [next] #'presentation-scroll-up) (local-set-key "\177" #'presentation-scroll-down) (local-set-key [prior] #'presentation-scroll-down) (narrow-to-page) ) ;; Toggle from presentation to normal mode ((and (not new-presentation-mode-value) presentation-mode) (setq buffer-read-only presentation-old-read-only) (use-local-map presentation-normal-keymap) (widen)) ;; Remaining in either normal or presentation mode (t nil) ) (setq presentation-mode new-presentation-mode-value)))