diff options
| author | Richard M. Stallman | 1994-04-28 03:44:48 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1994-04-28 03:44:48 +0000 |
| commit | 09642d9796abbc1501544f783bd3fc57d925168e (patch) | |
| tree | 05da0c9b64946c620cff6e0ddae756a4276d0aae | |
| parent | 8f3016f5c3dc019faaea9cd38063bb5895fa38ee (diff) | |
| download | emacs-09642d9796abbc1501544f783bd3fc57d925168e.tar.gz emacs-09642d9796abbc1501544f783bd3fc57d925168e.zip | |
Make a sub-keymap for the Buffers menu bar item.
(menu-bar-select-buffer, menu-bar-select-frame):
New commands for that subkeymap.
(menu-bar-update-buffers): New function, on menu-bar-update-hook,
made partly out of mouse-menu-bar-buffers.
| -rw-r--r-- | lisp/menu-bar.el | 167 |
1 files changed, 91 insertions, 76 deletions
diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el index 063854e1467..c16960f25b5 100644 --- a/lisp/menu-bar.el +++ b/lisp/menu-bar.el | |||
| @@ -224,7 +224,9 @@ A subsequent \\[yank] yanks the choice just selected." | |||
| 224 | (current-kill 0)))))) | 224 | (current-kill 0)))))) |
| 225 | (put 'mouse-menu-choose-yank 'menu-enable 'kill-ring) | 225 | (put 'mouse-menu-choose-yank 'menu-enable 'kill-ring) |
| 226 | 226 | ||
| 227 | (define-key global-map [menu-bar buffer] '("Buffers" . mouse-menu-bar-buffers)) | 227 | (define-key global-map [menu-bar buffer] '("Buffers" . menu-bar-buffers)) |
| 228 | |||
| 229 | (defalias 'menu-bar-buffers (make-sparse-keymap "Buffers")) | ||
| 228 | 230 | ||
| 229 | (defvar complex-buffers-menu-p nil | 231 | (defvar complex-buffers-menu-p nil |
| 230 | "*Non-nil says, offer a choice of actions after you pick a buffer. | 232 | "*Non-nil says, offer a choice of actions after you pick a buffer. |
| @@ -238,23 +240,32 @@ A large number or nil slows down menu responsiveness.") | |||
| 238 | 240 | ||
| 239 | (defvar list-buffers-directory nil) | 241 | (defvar list-buffers-directory nil) |
| 240 | 242 | ||
| 241 | (defun mouse-menu-bar-buffers (event) | 243 | (defun menu-bar-select-buffer () |
| 242 | "Pop up a menu of buffers for selection with the mouse. | 244 | (interactive) |
| 243 | This switches buffers in the window that you clicked on, | 245 | (switch-to-buffer last-command-event)) |
| 244 | and selects that window." | 246 | |
| 245 | (interactive "e") | 247 | (defun menu-bar-select-frame () |
| 248 | (interactive) | ||
| 249 | (make-frame-visible last-command-event) | ||
| 250 | (raise-frame last-command-event) | ||
| 251 | (select-frame last-command-event)) | ||
| 252 | |||
| 253 | (defun menu-bar-update-buffers () | ||
| 246 | (let ((buffers (buffer-list)) | 254 | (let ((buffers (buffer-list)) |
| 247 | menu) | 255 | buffers-menu frames-menu) |
| 248 | ;; If requested, list only the N most recently selected buffers. | 256 | ;; If requested, list only the N most recently selected buffers. |
| 249 | (if (and (integerp buffers-menu-max-size) | 257 | (if (and (integerp buffers-menu-max-size) |
| 250 | (> buffers-menu-max-size 1)) | 258 | (> buffers-menu-max-size 1)) |
| 251 | (if (> (length buffers) buffers-menu-max-size) | 259 | (if (> (length buffers) buffers-menu-max-size) |
| 252 | (setcdr (nthcdr buffers-menu-max-size buffers) nil))) | 260 | (setcdr (nthcdr buffers-menu-max-size buffers) nil))) |
| 253 | (setq menu | 261 | |
| 262 | ;; Make the menu of buffers proper. | ||
| 263 | (setq buffers-menu | ||
| 254 | (cons "Select Buffer" | 264 | (cons "Select Buffer" |
| 255 | (let ((tail buffers) | 265 | (let ((tail buffers) |
| 256 | (maxbuf 0) | 266 | (maxbuf 0) |
| 257 | (maxlen 0) | 267 | (maxlen 0) |
| 268 | alist | ||
| 258 | head) | 269 | head) |
| 259 | (while tail | 270 | (while tail |
| 260 | (or (eq ?\ (aref (buffer-name (car tail)) 0)) | 271 | (or (eq ?\ (aref (buffer-name (car tail)) 0)) |
| @@ -267,76 +278,80 @@ and selects that window." | |||
| 267 | (let ((elt (car tail))) | 278 | (let ((elt (car tail))) |
| 268 | (if (not (string-match "^ " | 279 | (if (not (string-match "^ " |
| 269 | (buffer-name elt))) | 280 | (buffer-name elt))) |
| 270 | (setq head (cons | 281 | (setq alist (cons |
| 271 | (cons | 282 | (cons |
| 272 | (format | 283 | (format |
| 273 | (format "%%%ds %%s%%s %%s" | 284 | (format "%%%ds %%s%%s %%s" |
| 274 | maxbuf) | 285 | maxbuf) |
| 275 | (buffer-name elt) | 286 | (buffer-name elt) |
| 276 | (if (buffer-modified-p elt) | 287 | (if (buffer-modified-p elt) |
| 277 | "*" " ") | 288 | "*" " ") |
| 278 | (save-excursion | 289 | (save-excursion |
| 279 | (set-buffer elt) | 290 | (set-buffer elt) |
| 280 | (if buffer-read-only "%" " ")) | 291 | (if buffer-read-only "%" " ")) |
| 281 | (or (buffer-file-name elt) | 292 | (or (buffer-file-name elt) |
| 282 | (save-excursion | 293 | (save-excursion |
| 283 | (set-buffer elt) | 294 | (set-buffer elt) |
| 284 | list-buffers-directory) | 295 | list-buffers-directory) |
| 285 | "")) | 296 | "")) |
| 286 | elt) | 297 | elt) |
| 287 | head))) | 298 | alist))) |
| 288 | (and head (> (length (car (car head))) maxlen) | 299 | (and alist (> (length (car (car alist))) maxlen) |
| 289 | (setq maxlen (length (car (car head)))))) | 300 | (setq maxlen (length (car (car alist)))))) |
| 290 | (setq tail (cdr tail))) | 301 | (setq tail (cdr tail))) |
| 291 | (nconc (nreverse head) | 302 | (setq alist (nreverse alist)) |
| 292 | (list (cons | 303 | (nconc (mapcar '(lambda (pair) |
| 293 | (concat (make-string (max (- (/ maxlen | 304 | ;; This is somewhat risque, to use |
| 294 | 2) | 305 | ;; the buffer name itself as the event type |
| 295 | 8) | 306 | ;; to define, but it works. |
| 296 | 0) ?\ ) | 307 | ;; It would not work to use the buffer |
| 297 | "List All Buffers") | 308 | ;; since a buffer as an event has its |
| 298 | 'list-buffers)))))) | 309 | ;; own meaning. |
| 310 | (nconc (list (buffer-name (cdr pair)) | ||
| 311 | (car pair) | ||
| 312 | (cons nil nil)) | ||
| 313 | 'menu-bar-select-buffer)) | ||
| 314 | alist) | ||
| 315 | (list (cons 'list-buffers | ||
| 316 | (cons | ||
| 317 | (concat (make-string (max (- (/ maxlen | ||
| 318 | 2) | ||
| 319 | 8) | ||
| 320 | 0) ?\ ) | ||
| 321 | "List All Buffers") | ||
| 322 | 'list-buffers))))))) | ||
| 323 | |||
| 324 | ;; Make a Frames menu if we have more than one frame. | ||
| 299 | (if (cdr (frame-list)) | 325 | (if (cdr (frame-list)) |
| 300 | (setq menu | 326 | (setq frames-menu |
| 301 | (list menu | 327 | (cons "Select Frame" |
| 302 | (cons "Select Frame" | 328 | (mapcar '(lambda (frame) |
| 303 | (mapcar (lambda (frame) | 329 | (nconc (list frame |
| 304 | (cons (cdr (assq 'name | 330 | (cdr (assq 'name |
| 305 | (frame-parameters frame))) | 331 | (frame-parameters frame))) |
| 306 | frame)) | 332 | (cons nil nil)) |
| 307 | (frame-list))))) | 333 | 'menu-bar-select-frame)) |
| 308 | (setq menu (list menu))) | 334 | (frame-list))))) |
| 309 | 335 | (if buffers-menu | |
| 310 | (setq menu (cons "Buffer and Frame Menu" menu)) | 336 | (setq buffers-menu (cons 'keymap buffers-menu))) |
| 311 | 337 | (if frames-menu | |
| 312 | (let ((buf (x-popup-menu (if (listp event) event | 338 | (setq frames-menu (cons 'keymap frames-menu))) |
| 313 | (list '(0 0) (selected-frame))) | 339 | (setq foo1 buffers-menu foo2 frames-menu foo3 |
| 314 | menu)) | 340 | (cons "Buffers" |
| 315 | (window (and (listp event) (posn-window (event-start event))))) | 341 | (if (and buffers-menu frames-menu) |
| 316 | (cond ((framep buf) | 342 | (list 'keymap "Buffers and Frames" |
| 317 | (make-frame-visible buf) | 343 | (cons "Buffers" buffers-menu) |
| 318 | (raise-frame buf) | 344 | (cons "Frames" frames-menu)) |
| 319 | (select-frame buf)) | 345 | (or buffers-menu frames-menu 'undefined)))) |
| 320 | ((eq buf 'list-buffers) | 346 | (define-key global-map [menu-bar buffer] |
| 321 | (list-buffers)) | 347 | (cons "Buffers" |
| 322 | (buf | 348 | (if (and buffers-menu frames-menu) |
| 323 | (if complex-buffers-menu-p | 349 | (list 'keymap "Buffers and Frames" |
| 324 | (let ((action (x-popup-menu | 350 | (cons 'buffers (cons "Buffers" buffers-menu)) |
| 325 | (if (listp event) event | 351 | (cons 'frames (cons "Frames" frames-menu))) |
| 326 | (list '(0 0) (selected-frame))) | 352 | (or buffers-menu frames-menu 'undefined)))))) |
| 327 | '("Buffer Action" | 353 | |
| 328 | ("" | 354 | (add-hook 'menu-bar-update-hook 'menu-bar-update-buffers) |
| 329 | ("Save Buffer" . save-buffer) | ||
| 330 | ("Kill Buffer" . kill-buffer) | ||
| 331 | ("Select Buffer" . switch-to-buffer)))))) | ||
| 332 | (if (eq action 'save-buffer) | ||
| 333 | (save-excursion | ||
| 334 | (set-buffer buf) | ||
| 335 | (save-buffer)) | ||
| 336 | (funcall action buf))) | ||
| 337 | (and (windowp window) | ||
| 338 | (select-window window)) | ||
| 339 | (switch-to-buffer buf))))))) | ||
| 340 | 355 | ||
| 341 | ;; this version is too slow | 356 | ;; this version is too slow |
| 342 | ;;;(defun format-buffers-menu-line (buffer) | 357 | ;;;(defun format-buffers-menu-line (buffer) |