comparison lisp/view.el @ 13078:d7735534db86

(view-mode-enter): Renamed from view-mode. Callers changed. Don't create local vars here. Set view-mode-auto-exit. Don't change local map--just set view-mode. (view-mode): New function toggles minor mode in the usual way. (view-mode-map): Put this on minor-mode-map-alist. (view-mode-exit): Do the exit actions only if view-mode-auto-exit. (View-scroll-lines-forward): Exit only if view-scroll-lines-forward. (view-mode-auto-exit, view-old-buffer-read-only) (view-old-Helper-return-blurb, view-scroll-size, view-last-regexp) (view-exit-action, view-return-here, view-exit-position): Defvar them and make them always-local.
author Richard M. Stallman <rms@gnu.org>
date Mon, 25 Sep 1995 18:36:32 +0000
parents f286a0f591f6
children 05bae277596e
comparison
equal deleted inserted replaced
13077:65092cab3f43 13078:d7735534db86
26 ;; This package provides the `view' minor mode documented in the Emacs 26 ;; This package provides the `view' minor mode documented in the Emacs
27 ;; user's manual. 27 ;; user's manual.
28 28
29 ;;; Code: 29 ;;; Code:
30 30
31 (defvar view-mode nil "Non-nil if view-mode is enabled.") 31 (defvar view-mode nil "Non-nil if View mode is enabled.")
32 (make-variable-buffer-local 'view-mode) 32 (make-variable-buffer-local 'view-mode)
33
34 (defvar view-mode-auto-exit nil
35 "Non-nil means scrolling past the end of buffer exits View mode.")
36 (make-variable-buffer-local 'view-mode-auto-exit)
37
38 (defvar view-old-buffer-read-only nil)
39 (make-variable-buffer-local 'view-old-buffer-read-only)
40 (defvar view-old-Helper-return-blurb)
41 (make-variable-buffer-local 'view-old-Helper-return-blurb)
42
43 (defvar view-scroll-size nil)
44 (make-variable-buffer-local 'view-scroll-size)
45
46 (defvar view-last-regexp nil)
47 (make-variable-buffer-local 'view-last-regexp)
48
49 (defvar view-exit-action nil)
50 (make-variable-buffer-local 'view-exit-action)
51 (defvar view-return-here nil)
52 (make-variable-buffer-local 'view-return-here)
53 (defvar view-exit-position nil)
54 (make-variable-buffer-local 'view-exit-position)
33 55
34 (or (assq 'view-mode minor-mode-alist) 56 (or (assq 'view-mode minor-mode-alist)
35 (setq minor-mode-alist 57 (setq minor-mode-alist
36 (cons '(view-mode " View") minor-mode-alist))) 58 (cons '(view-mode " View") minor-mode-alist)))
37 59
68 (define-key view-mode-map "\e\C-r" 'View-search-regexp-backward) 90 (define-key view-mode-map "\e\C-r" 'View-search-regexp-backward)
69 (define-key view-mode-map "n" 'View-search-last-regexp-forward) 91 (define-key view-mode-map "n" 'View-search-last-regexp-forward)
70 (define-key view-mode-map "p" 'View-search-last-regexp-backward) 92 (define-key view-mode-map "p" 'View-search-last-regexp-backward)
71 ) 93 )
72 94
95 (or (assq 'view-mode minor-mode-map-alist)
96 (setq minor-mode-map-alist
97 (cons (cons 'view-mode view-mode-map) minor-mode-map-alist)))
98
73 99
74 ;;;###autoload 100 ;;;###autoload
75 (defun view-file (file-name) 101 (defun view-file (file-name)
76 "View FILE in View mode, returning to previous buffer when done. 102 "View FILE in View mode, returning to previous buffer when done.
77 The usual Emacs commands are not available; instead, 103 The usual Emacs commands are not available; instead,
86 (had-a-buf (get-file-buffer file-name)) 112 (had-a-buf (get-file-buffer file-name))
87 (buf-to-view (find-file-noselect file-name))) 113 (buf-to-view (find-file-noselect file-name)))
88 ;; This used to pass t as second argument, 114 ;; This used to pass t as second argument,
89 ;; but then the buffer did not show up in the Buffers menu. 115 ;; but then the buffer did not show up in the Buffers menu.
90 (switch-to-buffer buf-to-view had-a-buf) 116 (switch-to-buffer buf-to-view had-a-buf)
91 (view-mode old-buf 117 (view-mode-enter old-buf
92 (and (not had-a-buf) (not (buffer-modified-p buf-to-view)) 118 (and (not had-a-buf) (not (buffer-modified-p buf-to-view))
93 'kill-buffer)))) 119 'kill-buffer))))
94 120
95 ;;;###autoload 121 ;;;###autoload
96 (defun view-file-other-window (file-name) 122 (defun view-file-other-window (file-name)
97 "View FILE in View mode in other window. 123 "View FILE in View mode in other window.
98 Return to previous buffer when done. 124 Return to previous buffer when done.
106 (interactive "fView file: ") 132 (interactive "fView file: ")
107 (let ((old-arrangement (current-window-configuration)) 133 (let ((old-arrangement (current-window-configuration))
108 (had-a-buf (get-file-buffer file-name)) 134 (had-a-buf (get-file-buffer file-name))
109 (buf-to-view (find-file-noselect file-name))) 135 (buf-to-view (find-file-noselect file-name)))
110 (switch-to-buffer-other-window buf-to-view) 136 (switch-to-buffer-other-window buf-to-view)
111 (view-mode old-arrangement 137 (view-mode-enter old-arrangement
112 (and (not had-a-buf) (not (buffer-modified-p buf-to-view)) 138 (and (not had-a-buf) (not (buffer-modified-p buf-to-view))
113 'kill-buffer)))) 139 'kill-buffer))))
114 140
115 ;;;###autoload 141 ;;;###autoload
116 (defun view-buffer (buffer-name) 142 (defun view-buffer (buffer-name)
117 "View BUFFER in View mode, returning to previous buffer when done. 143 "View BUFFER in View mode, returning to previous buffer when done.
118 The usual Emacs commands are not available; instead, 144 The usual Emacs commands are not available; instead,
123 149
124 This command runs the normal hook `view-mode-hook'." 150 This command runs the normal hook `view-mode-hook'."
125 (interactive "bView buffer: ") 151 (interactive "bView buffer: ")
126 (let ((old-buf (current-buffer))) 152 (let ((old-buf (current-buffer)))
127 (switch-to-buffer buffer-name t) 153 (switch-to-buffer buffer-name t)
128 (view-mode old-buf nil))) 154 (view-mode-enter old-buf nil)))
129 155
130 ;;;###autoload 156 ;;;###autoload
131 (defun view-buffer-other-window (buffer-name not-return) 157 (defun view-buffer-other-window (buffer-name not-return)
132 "View BUFFER in View mode in another window. 158 "View BUFFER in View mode in another window.
133 Return to previous buffer when done, unless NOT-RETURN is non-nil. 159 Return to previous buffer when done, unless NOT-RETURN is non-nil.
140 166
141 This command runs the normal hook `view-mode-hook'." 167 This command runs the normal hook `view-mode-hook'."
142 (interactive "bView buffer:\nP") 168 (interactive "bView buffer:\nP")
143 (let ((return-to (and not-return (current-window-configuration)))) 169 (let ((return-to (and not-return (current-window-configuration))))
144 (switch-to-buffer-other-window buffer-name) 170 (switch-to-buffer-other-window buffer-name)
145 (view-mode return-to))) 171 (view-mode-enter return-to)))
146 172
147 ;;;###autoload 173 ;;;###autoload
148 (defun view-mode (&optional prev-buffer action) 174 (defun view-mode (&optional arg)
175 "Toggle View mode.
176 If you use this function to turn on View mode,
177 \"exiting\" View mode does nothing except turn View mode off.
178 The other way to turn View mode on is by calling
179 `view-mode-enter'."
180 (interactive "P")
181 (setq view-mode
182 (if (null arg)
183 (not view-mode)
184 (> (prefix-numeric-value arg) 0)))
185 (force-mode-line-update))
186
187 (defun view-mode-enter (&optional prev-buffer action)
149 "Minor mode for viewing text but not editing it. 188 "Minor mode for viewing text but not editing it.
150 Letters do not insert themselves. Instead these commands are provided. 189 Letters do not insert themselves. Instead these commands are provided.
151 Most commands take prefix arguments. Commands dealing with lines 190 Most commands take prefix arguments. Commands dealing with lines
152 default to \"scroll size\" lines (initially size of window). 191 default to \"scroll size\" lines (initially size of window).
153 Search commands default to a repeat count of one. 192 Search commands default to a repeat count of one.
178 C-n moves down lines vertically. 217 C-n moves down lines vertically.
179 C-p moves upward lines vertically. 218 C-p moves upward lines vertically.
180 C-l recenters the screen. 219 C-l recenters the screen.
181 q exit view-mode and return to previous buffer. 220 q exit view-mode and return to previous buffer.
182 221
183 Entry to this mode runs the normal hook `view-mode-hook'. 222 This function runs the normal hook `view-mode-hook'.
184 223
185 \\{view-mode-map}" 224 \\{view-mode-map}"
186 ; Not interactive because dangerous things happen 225 ; Not interactive because dangerous things happen
187 ; if you call it without passing a buffer as argument 226 ; if you call it without passing a buffer as argument
188 ; and they are not easy to fix. 227 ; and they are not easy to fix.
189 ; (interactive) 228 ; (interactive)
190 (make-local-variable 'view-old-buffer-read-only)
191 (setq view-old-buffer-read-only buffer-read-only) 229 (setq view-old-buffer-read-only buffer-read-only)
192 (make-local-variable 'view-old-local-map)
193 (setq view-old-local-map (current-local-map))
194 (make-local-variable 'view-old-Helper-return-blurb)
195 (setq view-old-Helper-return-blurb 230 (setq view-old-Helper-return-blurb
196 (and (boundp 'Helper-return-blurb) Helper-return-blurb)) 231 (and (boundp 'Helper-return-blurb) Helper-return-blurb))
232
233 ;; Enable view-exit to make use of the data we just saved
234 ;; and to perform the exit action.
235 (setq view-mode-auto-exit t)
197 236
198 (setq buffer-read-only t) 237 (setq buffer-read-only t)
199 (setq view-mode t) 238 (setq view-mode t)
200 (setq Helper-return-blurb 239 (setq Helper-return-blurb
201 (format "continue viewing %s" 240 (format "continue viewing %s"
202 (if (buffer-file-name) 241 (if (buffer-file-name)
203 (file-name-nondirectory (buffer-file-name)) 242 (file-name-nondirectory (buffer-file-name))
204 (buffer-name)))) 243 (buffer-name))))
205 244
206 (make-local-variable 'view-exit-action)
207 (setq view-exit-action action) 245 (setq view-exit-action action)
208 (make-local-variable 'view-return-here)
209 (setq view-return-here prev-buffer) 246 (setq view-return-here prev-buffer)
210 (make-local-variable 'view-exit-position)
211 (setq view-exit-position (point-marker)) 247 (setq view-exit-position (point-marker))
212
213 (make-local-variable 'view-scroll-size)
214 (setq view-scroll-size nil)
215 (make-local-variable 'view-last-regexp)
216 (setq view-last-regexp nil)
217 248
218 (beginning-of-line) 249 (beginning-of-line)
219 (setq goal-column nil) 250 (setq goal-column nil)
220 251
221 (use-local-map view-mode-map)
222 (run-hooks 'view-mode-hook) 252 (run-hooks 'view-mode-hook)
223 (message 253 (message
224 (substitute-command-keys 254 (substitute-command-keys
225 "Type \\[Helper-help] for help, \\[Helper-describe-bindings] for commands, \\[view-exit] to quit."))) 255 "Type \\[Helper-help] for help, \\[Helper-describe-bindings] for commands, \\[view-exit] to quit.")))
226 256
227 (defun view-exit () 257 (defun view-exit ()
228 "Exit from view-mode. 258 "Exit from view-mode.
229 If you viewed an existing buffer, that buffer returns to its previous mode. 259 If you viewed an existing buffer, that buffer returns to its previous mode.
230 If you viewed a file that was not present in Emacs, its buffer is killed." 260 If you viewed a file that was not present in Emacs, its buffer is killed."
231 (interactive) 261 (interactive)
232 (use-local-map view-old-local-map) 262 (setq view-mode nil)
233 (setq buffer-read-only view-old-buffer-read-only) 263 (force-mode-line-update)
234 264 (cond (view-mode-auto-exit
235 (goto-char view-exit-position) 265 (setq buffer-read-only view-old-buffer-read-only)
236 (set-marker view-exit-position nil) 266 (setq view-mode-auto-exit nil)
237 267
238 ;; Now do something to the buffer that we were viewing 268 (goto-char view-exit-position)
239 ;; (such as kill it). 269 (set-marker view-exit-position nil)
240 (let ((viewed-buffer (current-buffer)) 270
241 (action view-exit-action)) 271 ;; Now do something to the buffer that we were viewing
242 (cond 272 ;; (such as kill it).
243 ((bufferp view-return-here) 273 (let ((viewed-buffer (current-buffer))
244 (switch-to-buffer view-return-here)) 274 (action view-exit-action))
245 ((window-configuration-p view-return-here) 275 (cond
246 (set-window-configuration view-return-here))) 276 ((bufferp view-return-here)
247 (if action (funcall action viewed-buffer)))) 277 (switch-to-buffer view-return-here))
278 ((window-configuration-p view-return-here)
279 (set-window-configuration view-return-here)))
280 (if action (funcall action viewed-buffer))))))
248 281
249 (defun view-window-size () (1- (window-height))) 282 (defun view-window-size () (1- (window-height)))
250 283
251 (defun view-scroll-size () 284 (defun view-scroll-size ()
252 (min (view-window-size) (or view-scroll-size (view-window-size)))) 285 (min (view-window-size) (or view-scroll-size (view-window-size))))
284 (setq lines 317 (setq lines
285 (if lines (prefix-numeric-value lines) 318 (if lines (prefix-numeric-value lines)
286 (view-scroll-size))) 319 (view-scroll-size)))
287 (if (and (pos-visible-in-window-p (point-max)) 320 (if (and (pos-visible-in-window-p (point-max))
288 ;; Allow scrolling backward at the end of the buffer. 321 ;; Allow scrolling backward at the end of the buffer.
289 (> lines 0)) 322 (> lines 0)
323 view-mode-auto-exit)
290 (view-exit) 324 (view-exit)
291 ;; (view-last-command 'View-scroll-lines-forward lines) 325 ;; (view-last-command 'View-scroll-lines-forward lines)
292 (if (>= lines (view-window-size)) 326 (if (>= lines (view-window-size))
293 (scroll-up nil) 327 (scroll-up nil)
294 (if (>= (- lines) (view-window-size)) 328 (if (>= (- lines) (view-window-size))