+ (unless (and arg ; Do nothing if already OK.
+ (if (> (prefix-numeric-value arg) 0) view-mode (not view-mode)))
+ (if view-mode (view-mode-disable)
+ (view-mode-enable))))
+\f
+(defun view-mode-enable ()
+ "Turn on View mode."
+ ;; Always leave view mode before changing major mode.
+ ;; This is to guarantee that the buffer-read-only variable is restored.
+ (add-hook 'change-major-mode-hook 'view-mode-disable nil t)
+ (setq view-mode t
+ view-page-size nil
+ view-half-page-size nil
+ view-old-buffer-read-only buffer-read-only
+ buffer-read-only t
+ view-old-Helper-return-blurb (and (boundp 'Helper-return-blurb)
+ Helper-return-blurb)
+ Helper-return-blurb
+ (format "continue viewing %s"
+ (if (buffer-file-name)
+ (file-name-nondirectory (buffer-file-name))
+ (buffer-name))))
+ (force-mode-line-update)
+ (run-hooks 'view-mode-hook))
+
+(defun view-mode-disable ()
+ "Turn off View mode."
+ (remove-hook 'change-major-mode-hook 'view-mode-disable t)
+ (and view-overlay (delete-overlay view-overlay))
+ (force-mode-line-update)
+ ;; Calling toggle-read-only while View mode is enabled
+ ;; sets view-read-only to t as a buffer-local variable
+ ;; after exiting View mode. That arranges that the next toggle-read-only
+ ;; will reenable View mode.
+ ;; Cancelling View mode in any other way should cancel that, too,
+ ;; so that View mode stays off if toggle-read-only is called.
+ (if (local-variable-p 'view-read-only)
+ (kill-local-variable 'view-read-only))
+ (setq view-mode nil
+ Helper-return-blurb view-old-Helper-return-blurb)
+ (if buffer-read-only
+ (setq buffer-read-only view-old-buffer-read-only)))