Annotation of GNUtools/emacs/lisp/view.el, revision 1.1.1.1

1.1       root        1: ;; View: Peruse file or buffer without editing.
                      2: ;; Copyright (C) 1985 Free Software Foundation, Inc.
                      3: ;; Principal author K. Shane Hartman
                      4: 
                      5: ;; This file is part of GNU Emacs.
                      6: 
                      7: ;; GNU Emacs is free software; you can redistribute it and/or modify
                      8: ;; it under the terms of the GNU General Public License as published by
                      9: ;; the Free Software Foundation; either version 1, or (at your option)
                     10: ;; any later version.
                     11: 
                     12: ;; GNU Emacs is distributed in the hope that it will be useful,
                     13: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     15: ;; GNU General Public License for more details.
                     16: 
                     17: ;; You should have received a copy of the GNU General Public License
                     18: ;; along with GNU Emacs; see the file COPYING.  If not, write to
                     19: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
                     20: 
                     21: 
                     22: (provide 'view)
                     23: 
                     24: (defvar view-mode-map nil)
                     25: (if view-mode-map
                     26:     nil
                     27:   (setq view-mode-map (make-keymap))
                     28:   (fillarray view-mode-map 'View-undefined)
                     29:   (define-key view-mode-map "\C-c" 'exit-recursive-edit)
                     30:   (define-key view-mode-map "\C-z" 'suspend-emacs)
                     31:   (define-key view-mode-map "q" 'exit-recursive-edit)
                     32:   (define-key view-mode-map "-" 'negative-argument)
                     33:   (define-key view-mode-map "0" 'digit-argument)
                     34:   (define-key view-mode-map "1" 'digit-argument)
                     35:   (define-key view-mode-map "2" 'digit-argument)
                     36:   (define-key view-mode-map "3" 'digit-argument)
                     37:   (define-key view-mode-map "4" 'digit-argument)
                     38:   (define-key view-mode-map "5" 'digit-argument)
                     39:   (define-key view-mode-map "6" 'digit-argument)
                     40:   (define-key view-mode-map "7" 'digit-argument)
                     41:   (define-key view-mode-map "8" 'digit-argument)
                     42:   (define-key view-mode-map "9" 'digit-argument)
                     43:   (define-key view-mode-map "\C-u" 'universal-argument)
                     44:   (define-key view-mode-map "\e" nil)
                     45:   (define-key view-mode-map "\C-x" 'Control-X-prefix)
                     46:   (define-key view-mode-map "\e-" 'negative-argument)
                     47:   (define-key view-mode-map "\e0" 'digit-argument)
                     48:   (define-key view-mode-map "\e1" 'digit-argument)
                     49:   (define-key view-mode-map "\e2" 'digit-argument)
                     50:   (define-key view-mode-map "\e3" 'digit-argument)
                     51:   (define-key view-mode-map "\e4" 'digit-argument)
                     52:   (define-key view-mode-map "\e5" 'digit-argument)
                     53:   (define-key view-mode-map "\e6" 'digit-argument)
                     54:   (define-key view-mode-map "\e7" 'digit-argument)
                     55:   (define-key view-mode-map "\e8" 'digit-argument)
                     56:   (define-key view-mode-map "\e9" 'digit-argument)
                     57:   (define-key view-mode-map "<" 'beginning-of-buffer)
                     58:   (define-key view-mode-map ">" 'end-of-buffer)
                     59:   (define-key view-mode-map "\ev" 'View-scroll-lines-backward)
                     60:   (define-key view-mode-map "\C-v" 'View-scroll-lines-forward)
                     61:   (define-key view-mode-map " " 'View-scroll-lines-forward)
                     62:   (define-key view-mode-map "\177" 'View-scroll-lines-backward)
                     63:   (define-key view-mode-map "\n" 'View-scroll-one-more-line)
                     64:   (define-key view-mode-map "\r" 'View-scroll-one-more-line)
                     65:   (define-key view-mode-map "\C-l" 'recenter)
                     66:   (define-key view-mode-map "z" 'View-scroll-lines-forward-set-scroll-size)
                     67:   (define-key view-mode-map "g" 'View-goto-line)
                     68:   (define-key view-mode-map "=" 'what-line)
                     69:   (define-key view-mode-map "." 'set-mark-command)
                     70:   (define-key view-mode-map "\C-@" 'set-mark-command)
                     71:   (define-key view-mode-map "'" 'View-back-to-mark)
                     72:   (define-key view-mode-map "@" 'View-back-to-mark)  
                     73:   (define-key view-mode-map "x" 'exchange-point-and-mark)
                     74:   (define-key view-mode-map "h" 'Helper-describe-bindings)
                     75:   (define-key view-mode-map "?" 'Helper-describe-bindings)
                     76:   (define-key view-mode-map "\C-h" 'Helper-help)
                     77:   (define-key view-mode-map "\C-n" 'View-next-line)
                     78:   (define-key view-mode-map "\C-p" 'View-previous-line)
                     79:   (define-key view-mode-map "\C-s" 'isearch-forward)
                     80:   (define-key view-mode-map "\C-r" 'isearch-backward)
                     81:   (define-key view-mode-map "s" 'isearch-forward)
                     82:   (define-key view-mode-map "r" 'isearch-backward)
                     83:   (define-key view-mode-map "/" 'View-search-regexp-forward)
                     84:   (define-key view-mode-map "\\" 'View-search-regexp-backward)
                     85:   ;; This conflicts with the standard binding of isearch-regexp-forward
                     86:   (define-key view-mode-map "\e\C-s" 'View-search-regexp-forward)
                     87:   (define-key view-mode-map "\e\C-r" 'View-search-regexp-backward)  
                     88:   (define-key view-mode-map "n" 'View-search-last-regexp-forward)
                     89:   (define-key view-mode-map "p" 'View-search-last-regexp-backward)
                     90:   )
                     91: 
                     92: 
                     93: (defun view-file (file-name)
                     94:   "View FILE in View mode, returning to previous buffer when done.
                     95: The usual Emacs commands are not available; instead,
                     96: a special set of commands (mostly letters and punctuation)
                     97: are defined for moving around in the buffer.
                     98: Space scrolls forward, Delete scrolls backward.
                     99: For list of all View commands, type ? or h while viewing.
                    100: 
                    101: Calls the value of  view-hook  if that is non-nil."
                    102:   (interactive "fView file: ")
                    103:   (let ((had-a-buf (get-file-buffer file-name))
                    104:        (buf-to-view nil))
                    105:     (unwind-protect
                    106:        (view-mode (prog1 (current-buffer)
                    107:                     (switch-to-buffer
                    108:                      (setq buf-to-view (find-file-noselect file-name)) t)))
                    109:       (and (not had-a-buf) buf-to-view (not (buffer-modified-p buf-to-view))
                    110:           (kill-buffer buf-to-view)))))
                    111: 
                    112: (defun view-buffer (buffer-name)
                    113:   "View BUFFER in View mode, returning to previous buffer when done.
                    114: The usual Emacs commands are not available; instead,
                    115: a special set of commands (mostly letters and punctuation)
                    116: are defined for moving around in the buffer.
                    117: Space scrolls forward, Delete scrolls backward.
                    118: For list of all View commands, type ? or h while viewing.
                    119: 
                    120: Calls the value of  view-hook  if that is non-nil."
                    121:   (interactive "bView buffer: ")
                    122:   (view-mode (prog1 (current-buffer) (switch-to-buffer buffer-name))))
                    123: 
                    124: (defun view-mode (&optional view-return-to-buffer)
                    125:   "Major mode for viewing text but not editing it.
                    126: Letters do not insert themselves.  Instead these commands are provided.
                    127: Most commands take prefix arguments.  Commands dealing with lines
                    128: default to \"scroll size\" lines (initially size of window).
                    129: Search commands default to a repeat count of one.
                    130: M-< or <       move to beginning of buffer.
                    131: M-> or >       move to end of buffer.
                    132: C-v or Space   scroll forward lines.
                    133: M-v or DEL     scroll backward lines.
                    134: CR or LF       scroll forward one line (backward with prefix argument).
                    135: z              like Space except set number of lines for further
                    136:                   scrolling commands to scroll by.
                    137: C-u and Digits provide prefix arguments.  `-' denotes negative argument.
                    138: =              prints the current line number.
                    139: g              goes to line given by prefix argument.
                    140: / or M-C-s     searches forward for regular expression
                    141: \\ or M-C-r    searches backward for regular expression.
                    142: n              searches forward for last regular expression.
                    143: p              searches backward for last regular expression.
                    144: C-@ or .       set the mark.
                    145: x              exchanges point and mark.
                    146: C-s or s       do forward incremental search.
                    147: C-r or r       do reverse incremental search.
                    148: @ or '         return to mark and pops mark ring.
                    149:                  Mark ring is pushed at start of every
                    150:                  successful search and when jump to line to occurs.
                    151:                  The mark is set on jump to buffer start or end.
                    152: ? or h         provide help message (list of commands).
                    153: C-h            provides help (list of commands or description of a command).
                    154: C-n            moves down lines vertically.
                    155: C-p            moves upward lines vertically.
                    156: C-l            recenters the screen.
                    157: q or C-c       exit view-mode and return to previous buffer.
                    158: 
                    159: Entry to this mode calls the value of  view-hook  if non-nil.
                    160: \\{view-mode-map}"
                    161: ;  Not interactive because dangerous things happen
                    162: ;  if you call it without passing a buffer as argument
                    163: ;  and they are not easy to fix.
                    164: ;  (interactive)
                    165:   (let* ((view-buffer-window (selected-window))
                    166:         (view-scroll-size nil))
                    167:     (unwind-protect
                    168:        (let ((buffer-read-only t)
                    169:              (mode-line-buffer-identification
                    170:               (list
                    171:                (if (buffer-file-name)
                    172:                    "Viewing %f"
                    173:                  "Viewing %b")))
                    174:              (mode-name "View"))
                    175:          (beginning-of-line)
                    176:          (catch 'view-mode-exit (view-mode-command-loop)))
                    177:       (if view-return-to-buffer
                    178:          (switch-to-buffer view-return-to-buffer)))))
                    179: 
                    180: (defun view-helpful-message ()
                    181:   (message
                    182:    (if (and (eq (key-binding "\C-h") 'Helper-help)
                    183:            (eq (key-binding "?") 'Helper-describe-bindings)
                    184:            (eq (key-binding "\C-c") 'exit-recursive-edit))
                    185:        "Type C-h for help, ? for commands, C-c to quit"
                    186:      (substitute-command-keys
                    187:       "Type \\[Helper-help] for help, \\[Helper-describe-bindings] for commands, \\[exit-recursive-edit] to quit."))))
                    188: 
                    189: (defun View-undefined ()
                    190:   (interactive)
                    191:   (ding)
                    192:   (view-helpful-message))
                    193: 
                    194: (defun view-window-size () (1- (window-height view-buffer-window)))
                    195: 
                    196: (defun view-scroll-size ()
                    197:   (min (view-window-size) (or view-scroll-size (view-window-size))))
                    198: 
                    199: (defvar view-hook nil
                    200:   "If non-nil, its value is called when viewing buffer or file.")
                    201: 
                    202: (defun view-mode-command-loop ()
                    203:   (push-mark)
                    204:   (let ((old-local-map (current-local-map))
                    205:        (mark-ring)
                    206: ;      (view-last-command)
                    207: ;      (view-last-command-entry)
                    208: ;      (view-last-command-argument)
                    209:        (view-last-regexp)
                    210:        (Helper-return-blurb
                    211:         (format "continue viewing %s"
                    212:                 (if (buffer-file-name)
                    213:                     (file-name-nondirectory (buffer-file-name))
                    214:                     (buffer-name))))
                    215:        (view-buffer (buffer-name)))
                    216:     (unwind-protect
                    217:        (progn
                    218:          (use-local-map view-mode-map)
                    219:          (run-hooks 'view-hook)
                    220:          (view-helpful-message)
                    221:          (recursive-edit))
                    222:       (save-excursion
                    223:        (set-buffer view-buffer)
                    224:        (use-local-map old-local-map))))
                    225:   (pop-mark))
                    226: 
                    227: ;(defun view-last-command (&optional who what)
                    228: ;  (setq view-last-command-entry this-command)
                    229: ;  (setq view-last-command who)
                    230: ;  (setq view-last-command-argument what))
                    231: 
                    232: ;(defun View-repeat-last-command ()
                    233: ;  "Repeat last command issued in View mode."
                    234: ;  (interactive)
                    235: ;  (if (and view-last-command
                    236: ;         (eq view-last-command-entry last-command))
                    237: ;      (funcall view-last-command view-last-command-argument))
                    238: ;  (setq this-command view-last-command-entry))
                    239: 
                    240: (defun View-goto-line (&optional line)
                    241:   "Move to LINE in View mode.
                    242: Display is centered at LINE.  Sets mark at starting position and pushes
                    243: mark ring."
                    244:   (interactive "p")
                    245:   (push-mark)
                    246:   (goto-line (or line 1))
                    247:   (recenter (/ (view-window-size) 2)))
                    248: 
                    249: (defun View-scroll-lines-forward (&optional lines)
                    250:   "Scroll forward in View mode, or exit if end of text is visible.
                    251: No arg means whole window full, or number of lines set by \\[View-scroll-lines-forward-set-scroll-size].
                    252: Arg is number of lines to scroll."
                    253:   (interactive "P")
                    254:   (if (pos-visible-in-window-p (point-max))
                    255:       (exit-recursive-edit))
                    256:   (setq lines
                    257:        (if lines (prefix-numeric-value lines)
                    258:          (view-scroll-size)))
                    259: ; (view-last-command 'View-scroll-lines-forward lines)
                    260:   (if (>= lines (view-window-size))
                    261:       (scroll-up nil)
                    262:     (if (>= (- lines) (view-window-size))
                    263:        (scroll-down nil)
                    264:       (scroll-up lines)))
                    265:   (cond ((pos-visible-in-window-p (point-max))
                    266:         (goto-char (point-max))
                    267:         (recenter -1)
                    268:         (message (substitute-command-keys
                    269:                "End.  Type \\[exit-recursive-edit] to quit viewing."))))
                    270:   (move-to-window-line -1)
                    271:   (beginning-of-line))
                    272: 
                    273: (defun View-scroll-lines-forward-set-scroll-size (&optional lines)
                    274:   "Scroll forward LINES lines in View mode, setting the \"scroll size\".
                    275: This is the number of lines which \\[View-scroll-lines-forward] and \\[View-scroll-lines-backward] scroll by default.
                    276: The absolute value of LINES is used, so this command can be used to scroll
                    277: backwards (but \"scroll size\" is always positive).  If LINES is greater than
                    278: window height or omitted, then window height is assumed.  If LINES is less
                    279: than window height then scrolling context is provided from previous screen."
                    280:   (interactive "P")
                    281:   (if (not lines)
                    282:       (setq view-scroll-size (view-window-size))
                    283:     (setq lines (prefix-numeric-value lines))
                    284:     (setq view-scroll-size
                    285:          (min (if (> lines 0) lines (- lines)) (view-window-size))))
                    286:   (View-scroll-lines-forward lines))
                    287: 
                    288: (defun View-scroll-one-more-line (&optional arg)
                    289:   "Scroll one more line up in View mode.
                    290: With ARG scroll one line down."
                    291:   (interactive "P")
                    292:   (View-scroll-lines-forward (if (not arg) 1 -1)))
                    293: 
                    294: (defun View-scroll-lines-backward (&optional lines)
                    295:   "Scroll backward in View mode.
                    296: No arg means whole window full, or number of lines set by \\[View-scroll-lines-forward-set-scroll-size].
                    297: Arg is number of lines to scroll."
                    298:   (interactive "P")
                    299:   (View-scroll-lines-forward (if lines
                    300:                                 (- (prefix-numeric-value lines))
                    301:                               (- (view-scroll-size)))))
                    302:   
                    303: (defun View-search-regexp-forward (times regexp)
                    304:   "Search forward for NTH occurrence of REGEXP in View mode.
                    305: Displays line found at center of window.  REGEXP is remembered for
                    306: searching with \\[View-search-last-regexp-forward] and \\[View-search-last-regexp-backward].  Sets mark at starting position and pushes mark ring."
                    307:   (interactive "p\nsSearch forward (regexp): ")
                    308:   (if (> (length regexp) 0)
                    309:       (progn
                    310:        ;(view-last-command 'View-search-last-regexp-forward times)
                    311:        (view-search times regexp))))
                    312: 
                    313: (defun View-search-regexp-backward (times regexp)
                    314:   "Search backward from window start for NTH instance of REGEXP in View mode.
                    315: Displays line found at center of window.  REGEXP is remembered for
                    316: searching with \\[View-search-last-regexp-forward] and \\[View-search-last-regexp-backward].  Sets mark at starting position and pushes mark ring."
                    317:   (interactive "p\nsSearch backward (regexp): ")
                    318:   (View-search-regexp-forward (- times) regexp))
                    319: 
                    320: (defun View-search-last-regexp-forward (times)
                    321:   "Search forward from window end for NTH instance of last regexp in View mode.
                    322: Displays line found at center of window.  Sets mark at starting position
                    323: and pushes mark ring."
                    324:   (interactive "p")
                    325:   (View-search-regexp-forward times view-last-regexp))
                    326: 
                    327: (defun View-search-last-regexp-backward (times)
                    328:   "Search backward from window start for NTH instance of last regexp in View mode.
                    329: Displays line found at center of window.  Sets mark at starting position and
                    330: pushes mark ring."
                    331:   (interactive "p")
                    332:   (View-search-regexp-backward times view-last-regexp))
                    333: 
                    334: (defun View-back-to-mark (&optional ignore)
                    335:   "Return to last mark set in View mode, else beginning of file.
                    336: Displays line at center of window.  Pops mark ring so successive
                    337: invocations return to earlier marks."
                    338:   (interactive)
                    339:   (goto-char (or (mark) (point-min)))
                    340:   (pop-mark)
                    341:   (recenter (/ (view-window-size) 2)))
                    342:             
                    343: (defun view-search (times regexp)
                    344:   (setq view-last-regexp regexp)
                    345:   (let (where)
                    346:     (save-excursion
                    347:       (move-to-window-line (if (< times 0) 0 -1))
                    348:       (if (re-search-forward regexp nil t times)
                    349:          (setq where (point))))
                    350:     (if where
                    351:        (progn
                    352:          (push-mark)
                    353:          (goto-char where)
                    354:          (beginning-of-line)
                    355:          (recenter (/ (view-window-size) 2)))
                    356:       (message "Can't find occurrence %d of %s" times regexp)
                    357:       (sit-for 4))))
                    358: 
                    359: (defun View-previous-line (count)
                    360:   "Move up to start of previous line.  Argument is repeat count."
                    361:   (interactive "p")
                    362:   (forward-line (- count)))
                    363: 
                    364: (defun View-next-line (count)
                    365:   "Move down to start of next line.  Argument is repeat count."
                    366:   (interactive "p")
                    367:   (forward-line count))

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.