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

1.1       root        1: ;; Buffer menu main function and support functions.
                      2: ;; Copyright (C) 1985 Richard M. Stallman.
                      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: (defun Buffer-menu-mode ()
                     28:   "Major mode for editing a list of buffers.
                     29: Each line describes one of the buffers in Emacs.
                     30: Letters do not insert themselves; instead, they are commands.
                     31: m -- mark buffer to be displayed.
                     32: q -- select buffer of line point is on.
                     33:   Also show buffers marked with m in other windows.
                     34: 1 -- select that buffer in full-screen window.
                     35: 2 -- select that buffer in one window,
                     36:   together with buffer selected before this one in another window.
                     37: ~ -- clear modified-flag on that buffer.
                     38: s -- mark that buffer to be saved.
                     39: d or k or C-D or C-K -- mark that buffer to be killed.
                     40: x -- kill or save marked buffers.
                     41: u -- remove all kinds of marks from current line.
                     42: Delete -- back up a line and remove marks.
                     43: Precisely,\\{Buffer-menu-mode-map}"
                     44:   (kill-all-local-variables)
                     45:   (use-local-map Buffer-menu-mode-map)
                     46:   (setq truncate-lines t)
                     47:   (setq buffer-read-only t)
                     48:   (setq major-mode 'Buffer-menu-mode)
                     49:   (setq mode-name "Buffer Menu"))
                     50: 
                     51: (save-excursion
                     52:   (setq Buffer-menu-mode-map (make-keymap))
                     53:   (suppress-keymap Buffer-menu-mode-map t)
                     54:   (define-key Buffer-menu-mode-map "q" 'Buffer-menu-select)
                     55:   (define-key Buffer-menu-mode-map "2" 'Buffer-menu-2-window)
                     56:   (define-key Buffer-menu-mode-map "1" 'Buffer-menu-1-window)
                     57:   (define-key Buffer-menu-mode-map "s" 'Buffer-menu-save)
                     58:   (define-key Buffer-menu-mode-map "d" 'Buffer-menu-kill)
                     59:   (define-key Buffer-menu-mode-map "k" 'Buffer-menu-kill)
                     60:   (define-key Buffer-menu-mode-map "\^d" 'Buffer-menu-kill)
                     61:   (define-key Buffer-menu-mode-map "\^k" 'Buffer-menu-kill)
                     62:   (define-key Buffer-menu-mode-map "x" 'Buffer-menu-execute)
                     63:   (define-key Buffer-menu-mode-map " " 'next-line)
                     64:   (define-key Buffer-menu-mode-map "\177" 'Buffer-menu-backup-unmark)
                     65:   (define-key Buffer-menu-mode-map "~" 'Buffer-menu-not-modified)
                     66:   (define-key Buffer-menu-mode-map "?" 'describe-mode)
                     67:   (define-key Buffer-menu-mode-map "u" 'Buffer-menu-unmark)
                     68:   (define-key Buffer-menu-mode-map "m" 'Buffer-menu-mark))
                     69: 
                     70: (defvar Buffer-menu-buffer-column nil)
                     71: 
                     72: (defvar Buffer-menu-size-column nil)
                     73: 
                     74: (defun Buffer-menu-buffer (error-if-non-existent-p)
                     75:   "Return buffer described by this line of buffer menu."
                     76:   (if (null Buffer-menu-buffer-column)
                     77:       (save-excursion
                     78:        (goto-char (point-min))
                     79:        (search-forward "Buffer")
                     80:        (backward-word 1)
                     81:        (setq Buffer-menu-buffer-column (current-column))
                     82:        (search-forward "Size")
                     83:        (backward-word 1)
                     84:        (setq Buffer-menu-size-column (current-column))))
                     85:   (save-excursion
                     86:     (beginning-of-line)
                     87:     (forward-char Buffer-menu-buffer-column)
                     88:     (let ((start (point))
                     89:          string)
                     90:       ;; End of buffer name marked by tab or two spaces.
                     91:       (re-search-forward "\t\\|  ")
                     92:       (skip-chars-backward " \t")
                     93:       (setq string (buffer-substring start (point)))
                     94:       (or (get-buffer string)
                     95:          (if error-if-non-existent-p
                     96:              (error "No buffer named \"%s\"" string)
                     97:            nil)))))
                     98: 
                     99: (defun buffer-menu (arg)
                    100:   "Make a menu of buffers so you can save, kill or select them.
                    101: With argument, show only buffers that are visiting files.
                    102: Type ? after invocation to get help on commands available within."
                    103:   (interactive "P")
                    104:   (list-buffers arg)
                    105:   (pop-to-buffer "*Buffer List*")
                    106:   (message
                    107:    "Commands: d, s, x; 1, 2, m, u, q; delete; ~;  ? for help."))
                    108: 
                    109: (defun Buffer-menu-mark ()
                    110:   "Mark buffer on this line for being displayed by \\[Buffer-menu-select] command."
                    111:   (interactive)
                    112:   (beginning-of-line)
                    113:   (if (looking-at " [-M]")
                    114:       (ding)
                    115:     (let ((buffer-read-only nil))
                    116:       (delete-char 1)
                    117:       (insert ?>)
                    118:       (forward-line 1))))
                    119: 
                    120: (defun Buffer-menu-unmark ()
                    121:   "Cancel all requested operations on buffer on this line."
                    122:   (interactive)
                    123:   (beginning-of-line)
                    124:   (if (looking-at " [-M]")
                    125:       (ding)
                    126:     (let* ((buf (Buffer-menu-buffer t))
                    127:           (mod (buffer-modified-p buf))
                    128:           (readonly (save-excursion (set-buffer buf) buffer-read-only))
                    129:           (buffer-read-only nil))
                    130:       (delete-char 3)
                    131:       (insert (if readonly (if mod " *%" "  %") (if mod " * " "   ")))))
                    132:   (forward-line 1))
                    133: 
                    134: (defun Buffer-menu-backup-unmark ()
                    135:   "Move up and cancel all requested operations on buffer on line above."
                    136:   (interactive)
                    137:   (forward-line -1)
                    138:   (Buffer-menu-unmark)
                    139:   (forward-line -1))
                    140: 
                    141: (defun Buffer-menu-kill ()
                    142:   "Mark buffer on this line to be killed by \\[Buffer-menu-execute] command."
                    143:   (interactive)
                    144:   (beginning-of-line)
                    145:   (if (looking-at " [-M]")
                    146:       (ding)
                    147:     (let ((buffer-read-only nil))
                    148:       (delete-char 1)
                    149:       (insert ?K)
                    150:       (forward-line 1))))
                    151: 
                    152: (defun Buffer-menu-save ()
                    153:   "Mark buffer on this line to be saved by \\[Buffer-menu-execute] command."
                    154:   (interactive)
                    155:   (beginning-of-line)
                    156:   (forward-char 1)
                    157:   (if (looking-at "[-M]")
                    158:       (ding)
                    159:     (let ((buffer-read-only nil))
                    160:       (delete-char 1)
                    161:       (insert ?S)
                    162:       (forward-line 1))))
                    163: 
                    164: (defun Buffer-menu-not-modified ()
                    165:   "Mark buffer on this line as unmodified (no changes to save)."
                    166:   (interactive)
                    167:   (save-excursion
                    168:     (set-buffer (Buffer-menu-buffer t))
                    169:     (set-buffer-modified-p nil))
                    170:   (save-excursion
                    171:    (beginning-of-line)
                    172:    (forward-char 1)
                    173:    (if (looking-at "\\*")
                    174:        (let ((buffer-read-only nil))
                    175:         (delete-char 1)
                    176:         (insert ? )))))
                    177: 
                    178: (defun Buffer-menu-execute ()
                    179:   "Save and/or kill buffers marked with \\[Buffer-menu-save] or \\[Buffer-menu-kill] commands."
                    180:   (interactive)
                    181:   (Buffer-menu-do-saves)
                    182:   (Buffer-menu-do-kills))
                    183: 
                    184: (defun Buffer-menu-do-saves ()
                    185:   (save-excursion
                    186:     (goto-char (point-min))
                    187:     (forward-line 1)
                    188:     (while (re-search-forward "^.S" nil t)
                    189:       (let ((modp nil))
                    190:        (save-excursion
                    191:          (set-buffer (Buffer-menu-buffer t))
                    192:          (save-buffer)
                    193:          (setq modp (buffer-modified-p)))
                    194:        (let ((buffer-read-only nil))
                    195:          (delete-char -1)
                    196:          (insert (if modp ?* ? )))))))
                    197: 
                    198: (defun Buffer-menu-do-kills ()
                    199:   (save-excursion
                    200:     (goto-char (point-min))
                    201:     (forward-line 1)
                    202:     (let ((buff-menu-buffer (current-buffer))
                    203:          (buffer-read-only nil))
                    204:       (while (search-forward "\nK" nil t)
                    205:        (forward-char -1)
                    206:        (let ((buf (Buffer-menu-buffer nil)))
                    207:          (or (eq buf nil)
                    208:              (eq buf buff-menu-buffer)
                    209:              (save-excursion (kill-buffer buf))))
                    210:        (if (Buffer-menu-buffer nil)
                    211:            (progn (delete-char 1)
                    212:                   (insert ? ))
                    213:          (delete-region (point) (progn (forward-line 1) (point)))
                    214:          (forward-char -1))))))
                    215: 
                    216: (defun Buffer-menu-select ()
                    217:   "Select this line's buffer; also display buffers marked with >.
                    218: You can mark buffers with the \\[Buffer-menu-mark] command."
                    219:   (interactive)
                    220:   (let ((buff (Buffer-menu-buffer t))
                    221:        (menu (current-buffer))       
                    222:        others height)
                    223:     (goto-char (point-min))
                    224:     (while (search-forward "\n>" nil t)
                    225:       (setq others (cons (Buffer-menu-buffer t) others))
                    226:       (let ((buffer-read-only nil))
                    227:        (delete-char -1)
                    228:        (insert ?\ )))
                    229:     (setq others (nreverse others)
                    230:          height (/ (1- (screen-height)) (1+ (length others))))
                    231:     (delete-other-windows)
                    232:     (switch-to-buffer buff)
                    233:     (or (eq menu buff)
                    234:        (bury-buffer menu))
                    235:     (while others
                    236:       (split-window nil height)
                    237:       (other-window 1)
                    238:       (switch-to-buffer (car others))
                    239:       (setq others (cdr others)))
                    240:     (other-window 1)))                 ;back to the beginning!
                    241:     
                    242: (defun Buffer-menu-1-window ()
                    243:   "Select this line's buffer, alone, in full screen."
                    244:   (interactive)
                    245:   (switch-to-buffer (Buffer-menu-buffer t))
                    246:   (bury-buffer (other-buffer))
                    247:   (delete-other-windows))
                    248: 
                    249: (defun Buffer-menu-2-window ()
                    250:   "Select this line's buffer, with previous buffer in second window."
                    251:   (interactive)
                    252:   (let ((buff (Buffer-menu-buffer t))
                    253:        (menu (current-buffer))
                    254:        (pop-up-windows t))
                    255:     (switch-to-buffer (other-buffer))
                    256:     (pop-to-buffer buff)
                    257:     (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.