summaryrefslogtreecommitdiff
path: root/lisp/view.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/view.el')
-rw-r--r--lisp/view.el150
1 files changed, 64 insertions, 86 deletions
diff --git a/lisp/view.el b/lisp/view.el
index 36f0d7bb63b..636cc38f770 100644
--- a/lisp/view.el
+++ b/lisp/view.el
@@ -1,5 +1,5 @@
;; View: Peruse file or buffer without editing.
-;; Copyright (C) 1985, 1989 Free Software Foundation, Inc.
+;; Copyright (C) 1985 Free Software Foundation, Inc.
;; Principal author K. Shane Hartman
;; This file is part of GNU Emacs.
@@ -26,9 +26,9 @@
nil
(setq view-mode-map (make-keymap))
(fillarray view-mode-map 'View-undefined)
- (define-key view-mode-map "\C-c" 'view-exit)
+ (define-key view-mode-map "\C-c" 'exit-recursive-edit)
(define-key view-mode-map "\C-z" 'suspend-emacs)
- (define-key view-mode-map "q" 'view-exit)
+ (define-key view-mode-map "q" 'exit-recursive-edit)
(define-key view-mode-map "-" 'negative-argument)
(define-key view-mode-map "0" 'digit-argument)
(define-key view-mode-map "1" 'digit-argument)
@@ -74,8 +74,8 @@
(define-key view-mode-map "h" 'Helper-describe-bindings)
(define-key view-mode-map "?" 'Helper-describe-bindings)
(define-key view-mode-map "\C-h" 'Helper-help)
- (define-key view-mode-map "\C-n" 'next-line)
- (define-key view-mode-map "\C-p" 'previous-line)
+ (define-key view-mode-map "\C-n" 'View-next-line)
+ (define-key view-mode-map "\C-p" 'View-previous-line)
(define-key view-mode-map "\C-s" 'isearch-forward)
(define-key view-mode-map "\C-r" 'isearch-backward)
(define-key view-mode-map "s" 'isearch-forward)
@@ -100,13 +100,14 @@ For list of all View commands, type ? or h while viewing.
Calls the value of view-hook if that is non-nil."
(interactive "fView file: ")
- (let ((old-buf (current-buffer))
- (had-a-buf (get-file-buffer file-name))
- (buf-to-view (find-file-noselect file-name)))
- (switch-to-buffer buf-to-view t)
- (view-mode old-buf
- (and (not had-a-buf) (not (buffer-modified-p buf-to-view))
- 'kill-buffer))))
+ (let ((had-a-buf (get-file-buffer file-name))
+ (buf-to-view nil))
+ (unwind-protect
+ (view-mode (prog1 (current-buffer)
+ (switch-to-buffer
+ (setq buf-to-view (find-file-noselect file-name)) t)))
+ (and (not had-a-buf) buf-to-view (not (buffer-modified-p buf-to-view))
+ (kill-buffer buf-to-view)))))
(defun view-buffer (buffer-name)
"View BUFFER in View mode, returning to previous buffer when done.
@@ -118,11 +119,9 @@ For list of all View commands, type ? or h while viewing.
Calls the value of view-hook if that is non-nil."
(interactive "bView buffer: ")
- (let ((old-buf (current-buffer)))
- (switch-to-buffer buffer-name t)
- (view-mode old-buf nil)))
+ (view-mode (prog1 (current-buffer) (switch-to-buffer buffer-name))))
-(defun view-mode (&optional prev-buffer action)
+(defun view-mode (&optional view-return-to-buffer)
"Major mode for viewing text but not editing it.
Letters do not insert themselves. Instead these commands are provided.
Most commands take prefix arguments. Commands dealing with lines
@@ -163,81 +162,26 @@ Entry to this mode calls the value of view-hook if non-nil.
; if you call it without passing a buffer as argument
; and they are not easy to fix.
; (interactive)
- (make-local-variable 'view-old-mode-line-buffer-identification)
- (setq view-old-mode-line-buffer-identification
- mode-line-buffer-identification)
- (make-local-variable 'view-old-buffer-read-only)
- (setq view-old-buffer-read-only buffer-read-only)
- (make-local-variable 'view-old-mode-name)
- (setq view-old-mode-name mode-name)
- (make-local-variable 'view-old-major-mode)
- (setq view-old-major-mode major-mode)
- (make-local-variable 'view-old-local-map)
- (setq view-old-local-map (current-local-map))
- (make-local-variable 'view-old-Helper-return-blurb)
- (setq view-old-Helper-return-blurb
- (and (boundp 'Helper-return-blurb) Helper-return-blurb))
-
- (setq buffer-read-only t)
- (setq mode-line-buffer-identification
- (list
- (if (buffer-file-name)
- "Viewing %f"
- "Viewing %b")))
- (setq mode-name "View")
- (setq major-mode 'view-mode)
- (setq Helper-return-blurb
- (format "continue viewing %s"
+ (let* ((view-buffer-window (selected-window))
+ (view-scroll-size nil))
+ (unwind-protect
+ (let ((buffer-read-only t)
+ (mode-line-buffer-identification
+ (list
(if (buffer-file-name)
- (file-name-nondirectory (buffer-file-name))
- (buffer-name))))
-
- (make-local-variable 'view-exit-action)
- (setq view-exit-action action)
- (make-local-variable 'view-prev-buffer)
- (setq view-prev-buffer prev-buffer)
- (make-local-variable 'view-exit-position)
- (setq view-exit-position (point-marker))
-
- (make-local-variable 'view-scroll-size)
- (setq view-scroll-size nil)
- (make-local-variable 'view-last-regexp)
- (setq view-last-regexp nil)
-
- (beginning-of-line)
- (setq goal-column nil)
-
- (use-local-map view-mode-map)
- (run-hooks 'view-hook)
- (view-helpful-message))
-
-(defun view-exit ()
- "Exit from view-mode.
-If you viewed an existing buffer, that buffer returns to its previous mode.
-If you viewed a file that was not present in Emacs, its buffer is killed."
- (interactive)
- (setq mode-line-buffer-identification
- view-old-mode-line-buffer-identification)
- (setq major-mode view-old-major-mode)
- (setq mode-name view-old-mode-name)
- (use-local-map (current-local-map))
- (setq buffer-read-only view-old-buffer-read-only)
-
- (goto-char view-exit-position)
- (set-marker view-exit-position nil)
-
- ;; Now do something to the buffer that we were viewing
- ;; (such as kill it).
- (let ((viewed-buffer (current-buffer))
- (action view-exit-action))
- (switch-to-buffer view-prev-buffer)
- (if action (funcall action viewed-buffer))))
+ "Viewing %f"
+ "Viewing %b")))
+ (mode-name "View"))
+ (beginning-of-line)
+ (catch 'view-mode-exit (view-mode-command-loop)))
+ (if view-return-to-buffer
+ (switch-to-buffer view-return-to-buffer)))))
(defun view-helpful-message ()
(message
(if (and (eq (key-binding "\C-h") 'Helper-help)
(eq (key-binding "?") 'Helper-describe-bindings)
- (eq (key-binding "\C-c") 'view-exit))
+ (eq (key-binding "\C-c") 'exit-recursive-edit))
"Type C-h for help, ? for commands, C-c to quit"
(substitute-command-keys
"Type \\[Helper-help] for help, \\[Helper-describe-bindings] for commands, \\[exit-recursive-edit] to quit."))))
@@ -247,7 +191,7 @@ If you viewed a file that was not present in Emacs, its buffer is killed."
(ding)
(view-helpful-message))
-(defun view-window-size () (1- (window-height)))
+(defun view-window-size () (1- (window-height view-buffer-window)))
(defun view-scroll-size ()
(min (view-window-size) (or view-scroll-size (view-window-size))))
@@ -255,6 +199,31 @@ If you viewed a file that was not present in Emacs, its buffer is killed."
(defvar view-hook nil
"If non-nil, its value is called when viewing buffer or file.")
+(defun view-mode-command-loop ()
+ (push-mark)
+ (let ((old-local-map (current-local-map))
+ (mark-ring)
+; (view-last-command)
+; (view-last-command-entry)
+; (view-last-command-argument)
+ (view-last-regexp)
+ (Helper-return-blurb
+ (format "continue viewing %s"
+ (if (buffer-file-name)
+ (file-name-nondirectory (buffer-file-name))
+ (buffer-name))))
+ (view-buffer (buffer-name)))
+ (unwind-protect
+ (progn
+ (use-local-map view-mode-map)
+ (run-hooks 'view-hook)
+ (view-helpful-message)
+ (recursive-edit))
+ (save-excursion
+ (set-buffer view-buffer)
+ (use-local-map old-local-map))))
+ (pop-mark))
+
;(defun view-last-command (&optional who what)
; (setq view-last-command-entry this-command)
; (setq view-last-command who)
@@ -387,3 +356,12 @@ invocations return to earlier marks."
(message "Can't find occurrence %d of %s" times regexp)
(sit-for 4))))
+(defun View-previous-line (count)
+ "Move up to start of previous line. Argument is repeat count."
+ (interactive "p")
+ (forward-line (- count)))
+
+(defun View-next-line (count)
+ "Move down to start of next line. Argument is repeat count."
+ (interactive "p")
+ (forward-line count))