Annotation of 43BSDReno/contrib/emacs-18.55/lisp/buff-menu.el, revision 1.1.1.1

1.1       root        1: ;; Buffer menu main function and support functions.
                      2: ;; Copyright (C) 1985, 1986, 1987 Free Software Foundation, Inc.
                      3: 
                      4: ;; This file is part of GNU Emacs.
                      5: 
                      6: ;; GNU Emacs is distributed in the hope that it will be useful,
                      7: ;; but WITHOUT ANY WARRANTY.  No author or distributor
                      8: ;; accepts responsibility to anyone for the consequences of using it
                      9: ;; or for whether it serves any particular purpose or works at all,
                     10: ;; unless he says so in writing.  Refer to the GNU Emacs General Public
                     11: ;; License for full details.
                     12: 
                     13: ;; Everyone is granted permission to copy, modify and redistribute
                     14: ;; GNU Emacs, but only under the conditions described in the
                     15: ;; GNU Emacs General Public License.   A copy of this license is
                     16: ;; supposed to have been given to you along with GNU Emacs so you
                     17: ;; can know your rights and responsibilities.  It should be in a
                     18: ;; file named COPYING.  Among other things, the copyright notice
                     19: ;; and this notice must be preserved on all copies.
                     20: 
                     21: 
                     22: ; Put buffer *Buffer List* into proper mode right away
                     23: ; so that from now on even list-buffers is enough to get a buffer menu.
                     24: 
                     25: (defvar Buffer-menu-mode-map nil "")
                     26: 
                     27: (if Buffer-menu-mode-map
                     28:     ()
                     29:   (setq Buffer-menu-mode-map (make-keymap))
                     30:   (suppress-keymap Buffer-menu-mode-map t)
                     31:   (define-key Buffer-menu-mode-map "q" 'Buffer-menu-select)
                     32:   (define-key Buffer-menu-mode-map "2" 'Buffer-menu-2-window)
                     33:   (define-key Buffer-menu-mode-map "1" 'Buffer-menu-1-window)
                     34:   (define-key Buffer-menu-mode-map "f" 'Buffer-menu-this-window)
                     35:   (define-key Buffer-menu-mode-map "o" 'Buffer-menu-other-window)
                     36:   (define-key Buffer-menu-mode-map "s" 'Buffer-menu-save)
                     37:   (define-key Buffer-menu-mode-map "d" 'Buffer-menu-delete)
                     38:   (define-key Buffer-menu-mode-map "k" 'Buffer-menu-delete)
                     39:   (define-key Buffer-menu-mode-map "\C-d" 'Buffer-menu-delete-backwards)
                     40:   (define-key Buffer-menu-mode-map "\C-k" 'Buffer-menu-delete)
                     41:   (define-key Buffer-menu-mode-map "x" 'Buffer-menu-execute)
                     42:   (define-key Buffer-menu-mode-map " " 'next-line)
                     43:   (define-key Buffer-menu-mode-map "\177" 'Buffer-menu-backup-unmark)
                     44:   (define-key Buffer-menu-mode-map "~" 'Buffer-menu-not-modified)
                     45:   (define-key Buffer-menu-mode-map "?" 'describe-mode)
                     46:   (define-key Buffer-menu-mode-map "u" 'Buffer-menu-unmark)
                     47:   (define-key Buffer-menu-mode-map "m" 'Buffer-menu-mark))
                     48: 
                     49: ;; Buffer Menu mode is suitable only for specially formatted data.
                     50: (put 'Buffer-menu-mode 'mode-class 'special)
                     51: 
                     52: (defun Buffer-menu-mode ()
                     53:   "Major mode for editing a list of buffers.
                     54: Each line describes one of the buffers in Emacs.
                     55: Letters do not insert themselves; instead, they are commands.
                     56: m -- mark buffer to be displayed.
                     57: q -- select buffer of line point is on.
                     58:   Also show buffers marked with m in other windows.
                     59: 1 -- select that buffer in full-screen window.
                     60: 2 -- select that buffer in one window,
                     61:   together with buffer selected before this one in another window.
                     62: f -- select that buffer in place of the buffer menu buffer.
                     63: o -- select that buffer in another window,
                     64:   so the buffer menu buffer remains visible in its window.
                     65: ~ -- clear modified-flag on that buffer.
                     66: s -- mark that buffer to be saved, and move down.
                     67: d or k -- mark that buffer to be deleted, and move down.
                     68: C-d -- mark that buffer to be deleted, and move up.
                     69: x -- delete or save marked buffers.
                     70: u -- remove all kinds of marks from current line.
                     71: Delete -- back up a line and remove marks.
                     72: 
                     73: Precisely,\\{Buffer-menu-mode-map}"
                     74:   (kill-all-local-variables)
                     75:   (use-local-map Buffer-menu-mode-map)
                     76:   (setq truncate-lines t)
                     77:   (setq buffer-read-only t)
                     78:   (setq major-mode 'Buffer-menu-mode)
                     79:   (setq mode-name "Buffer Menu")
                     80:   (run-hooks 'buffer-menu-mode-hook))
                     81: 
                     82: (defvar Buffer-menu-buffer-column nil)
                     83: 
                     84: (defvar Buffer-menu-size-column nil)
                     85: 
                     86: (defun Buffer-menu-buffer (error-if-non-existent-p)
                     87:   "Return buffer described by this line of buffer menu."
                     88:   (if (null Buffer-menu-buffer-column)
                     89:       (save-excursion
                     90:        (goto-char (point-min))
                     91:        (search-forward "Buffer")
                     92:        (backward-word 1)
                     93:        (setq Buffer-menu-buffer-column (current-column))
                     94:        (search-forward "Size")
                     95:        (backward-word 1)
                     96:        (setq Buffer-menu-size-column (current-column))))
                     97:   (save-excursion
                     98:     (beginning-of-line)
                     99:     (forward-char Buffer-menu-buffer-column)
                    100:     (let ((start (point))
                    101:          string)
                    102:       ;; End of buffer name marked by tab or two spaces.
                    103:       (re-search-forward "\t\\|  ")
                    104:       (skip-chars-backward " \t")
                    105:       (setq string (buffer-substring start (point)))
                    106:       (or (get-buffer string)
                    107:          (if error-if-non-existent-p
                    108:              (error "No buffer named \"%s\"" string)
                    109:            nil)))))
                    110: 
                    111: (defun buffer-menu (arg)
                    112:   "Make a menu of buffers so you can save, delete or select them.
                    113: With argument, show only buffers that are visiting files.
                    114: Type ? after invocation to get help on commands available.
                    115: Type q immediately to make the buffer menu go away."
                    116:   (interactive "P")
                    117:   (list-buffers arg)
                    118:   (pop-to-buffer "*Buffer List*")
                    119:   (forward-line 2)
                    120:   (message
                    121:    "Commands: d, s, x; 1, 2, m, u, q; delete; ~;  ? for help."))
                    122: 
                    123: (defun Buffer-menu-mark ()
                    124:   "Mark buffer on this line for being displayed by \\[Buffer-menu-select] command."
                    125:   (interactive)
                    126:   (beginning-of-line)
                    127:   (if (looking-at " [-M]")
                    128:       (ding)
                    129:     (let ((buffer-read-only nil))
                    130:       (delete-char 1)
                    131:       (insert ?>)
                    132:       (forward-line 1))))
                    133: 
                    134: (defun Buffer-menu-unmark ()
                    135:   "Cancel all requested operations on buffer on this line."
                    136:   (interactive)
                    137:   (beginning-of-line)
                    138:   (if (looking-at " [-M]")
                    139:       (ding)
                    140:     (let* ((buf (Buffer-menu-buffer t))
                    141:           (mod (buffer-modified-p buf))
                    142:           (readonly (save-excursion (set-buffer buf) buffer-read-only))
                    143:           (buffer-read-only nil))
                    144:       (delete-char 3)
                    145:       (insert (if readonly (if mod " *%" "  %") (if mod " * " "   ")))))
                    146:   (forward-line 1))
                    147: 
                    148: (defun Buffer-menu-backup-unmark ()
                    149:   "Move up and cancel all requested operations on buffer on line above."
                    150:   (interactive)
                    151:   (forward-line -1)
                    152:   (Buffer-menu-unmark)
                    153:   (forward-line -1))
                    154: 
                    155: (defun Buffer-menu-delete ()
                    156:   "Mark buffer on this line to be deleted by \\[Buffer-menu-execute] command."
                    157:   (interactive)
                    158:   (beginning-of-line)
                    159:   (if (looking-at " [-M]")             ;header lines
                    160:       (ding)
                    161:     (let ((buffer-read-only nil))
                    162:       (delete-char 1)
                    163:       (insert ?D)
                    164:       (forward-line 1))))
                    165: 
                    166: (defun Buffer-menu-delete-backwards ()
                    167:   "Mark buffer on this line to be deleted by \\[Buffer-menu-execute] command
                    168: and then move up one line"
                    169:   (interactive)
                    170:   (Buffer-menu-delete)
                    171:   (forward-line -2)
                    172:   (if (looking-at " [-M]") (forward-line 1)))
                    173: 
                    174: (defun Buffer-menu-save ()
                    175:   "Mark buffer on this line to be saved by \\[Buffer-menu-execute] command."
                    176:   (interactive)
                    177:   (beginning-of-line)
                    178:   (forward-char 1)
                    179:   (if (looking-at " [-M]")             ;header lines
                    180:       (ding)
                    181:     (let ((buffer-read-only nil))
                    182:       (delete-char 1)
                    183:       (insert ?S)
                    184:       (forward-line 1))))
                    185: 
                    186: (defun Buffer-menu-not-modified ()
                    187:   "Mark buffer on this line as unmodified (no changes to save)."
                    188:   (interactive)
                    189:   (save-excursion
                    190:     (set-buffer (Buffer-menu-buffer t))
                    191:     (set-buffer-modified-p nil))
                    192:   (save-excursion
                    193:    (beginning-of-line)
                    194:    (forward-char 1)
                    195:    (if (looking-at "\\*")
                    196:        (let ((buffer-read-only nil))
                    197:         (delete-char 1)
                    198:         (insert ? )))))
                    199: 
                    200: (defun Buffer-menu-execute ()
                    201:   "Save and/or delete buffers marked with \\[Buffer-menu-save] or \\[Buffer-menu-delete] commands."
                    202:   (interactive)
                    203:   (save-excursion
                    204:     (goto-char (point-min))
                    205:     (forward-line 1)
                    206:     (while (re-search-forward "^.S" nil t)
                    207:       (let ((modp nil))
                    208:        (save-excursion
                    209:          (set-buffer (Buffer-menu-buffer t))
                    210:          (save-buffer)
                    211:          (setq modp (buffer-modified-p)))
                    212:        (let ((buffer-read-only nil))
                    213:          (delete-char -1)
                    214:          (insert (if modp ?* ? ))))))
                    215:   (save-excursion
                    216:     (goto-char (point-min))
                    217:     (forward-line 1)
                    218:     (let ((buff-menu-buffer (current-buffer))
                    219:          (buffer-read-only nil))
                    220:       (while (search-forward "\nD" nil t)
                    221:        (forward-char -1)
                    222:        (let ((buf (Buffer-menu-buffer nil)))
                    223:          (or (eq buf nil)
                    224:              (eq buf buff-menu-buffer)
                    225:              (save-excursion (kill-buffer buf))))
                    226:        (if (Buffer-menu-buffer nil)
                    227:            (progn (delete-char 1)
                    228:                   (insert ? ))
                    229:          (delete-region (point) (progn (forward-line 1) (point)))
                    230:          (forward-char -1))))))
                    231: 
                    232: (defun Buffer-menu-select ()
                    233:   "Select this line's buffer; also display buffers marked with \">\".
                    234: You can mark buffers with the \\[Buffer-menu-mark] command."
                    235:   (interactive)
                    236:   (let ((buff (Buffer-menu-buffer t))
                    237:        (menu (current-buffer))       
                    238:        (others ())
                    239:        tem)
                    240:     (goto-char (point-min))
                    241:     (while (search-forward "\n>" nil t)
                    242:       (setq tem (Buffer-menu-buffer t))
                    243:       (let ((buffer-read-only nil))
                    244:        (delete-char -1)
                    245:        (insert ?\ ))
                    246:       (or (eq tem buff) (memq tem others) (setq others (cons tem others))))
                    247:     (setq others (nreverse others)
                    248:          tem (/ (1- (screen-height)) (1+ (length others))))
                    249:     (delete-other-windows)
                    250:     (switch-to-buffer buff)
                    251:     (or (eq menu buff)
                    252:        (bury-buffer menu))
                    253:     (while others
                    254:       (split-window nil tem)
                    255:       (other-window 1)
                    256:       (switch-to-buffer (car others))
                    257:       (setq others (cdr others)))
                    258:     (other-window 1)))                 ;back to the beginning!
                    259: 
                    260: (defun Buffer-menu-1-window ()
                    261:   "Select this line's buffer, alone, in full screen."
                    262:   (interactive)
                    263:   (switch-to-buffer (Buffer-menu-buffer t))
                    264:   (bury-buffer (other-buffer))
                    265:   (delete-other-windows))
                    266: 
                    267: (defun Buffer-menu-this-window ()
                    268:   "Select this line's buffer in this window."
                    269:   (interactive)
                    270:   (switch-to-buffer (Buffer-menu-buffer t)))
                    271: 
                    272: (defun Buffer-menu-other-window ()
                    273:   "Select this line's buffer in other window, leaving buffer menu visible."
                    274:   (interactive)
                    275:   (switch-to-buffer-other-window (Buffer-menu-buffer t)))
                    276: 
                    277: (defun Buffer-menu-2-window ()
                    278:   "Select this line's buffer, with previous buffer in second window."
                    279:   (interactive)
                    280:   (let ((buff (Buffer-menu-buffer t))
                    281:        (menu (current-buffer))
                    282:        (pop-up-windows t))
                    283:     (switch-to-buffer (other-buffer))
                    284:     (pop-to-buffer buff)
                    285:     (bury-buffer menu)))

unix.superglobalmegacorp.com

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