(raise-frame last-command-event)
(select-frame last-command-event))
+(defvar menu-bar-update-buffers-last-buffers nil)
+(defvar menu-bar-update-buffers-last-frames nil)
+
(defun menu-bar-update-buffers ()
(let ((buffers (buffer-list))
+ (frames (frame-list))
buffers-menu frames-menu)
- ;; If requested, list only the N most recently selected buffers.
- (if (and (integerp buffers-menu-max-size)
- (> buffers-menu-max-size 1))
- (if (> (length buffers) buffers-menu-max-size)
- (setcdr (nthcdr buffers-menu-max-size buffers) nil)))
-
- ;; Make the menu of buffers proper.
- (setq buffers-menu
- (cons "Select Buffer"
- (let ((tail buffers)
- (maxbuf 0)
- (maxlen 0)
- alist
- head)
- (while tail
- (or (eq ?\ (aref (buffer-name (car tail)) 0))
- (setq maxbuf
- (max maxbuf
- (length (buffer-name (car tail))))))
- (setq tail (cdr tail)))
- (setq tail buffers)
- (while tail
- (let ((elt (car tail)))
- (if (not (string-match "^ "
- (buffer-name elt)))
- (setq alist (cons
+ (if (and (equal buffers menu-bar-update-buffers-last-buffers)
+ (equal frames menu-bar-update-buffers-last-frames))
+ nil
+ (setq menu-bar-update-buffers-last-buffers buffers)
+ (setq menu-bar-update-buffers-last-frames frames)
+ ;; If requested, list only the N most recently selected buffers.
+ (if (and (integerp buffers-menu-max-size)
+ (> buffers-menu-max-size 1))
+ (if (> (length buffers) buffers-menu-max-size)
+ (setcdr (nthcdr buffers-menu-max-size buffers) nil)))
+
+ ;; Make the menu of buffers proper.
+ (setq buffers-menu
+ (cons "Select Buffer"
+ (let ((tail buffers)
+ (maxbuf 0)
+ (maxlen 0)
+ alist
+ head)
+ (while tail
+ (or (eq ?\ (aref (buffer-name (car tail)) 0))
+ (setq maxbuf
+ (max maxbuf
+ (length (buffer-name (car tail))))))
+ (setq tail (cdr tail)))
+ (setq tail buffers)
+ (while tail
+ (let ((elt (car tail)))
+ (if (not (string-match "^ "
+ (buffer-name elt)))
+ (setq alist (cons
+ (cons
+ (format
+ (format "%%%ds %%s%%s %%s"
+ maxbuf)
+ (buffer-name elt)
+ (if (buffer-modified-p elt)
+ "*" " ")
+ (save-excursion
+ (set-buffer elt)
+ (if buffer-read-only "%" " "))
+ (or (buffer-file-name elt)
+ (save-excursion
+ (set-buffer elt)
+ list-buffers-directory)
+ ""))
+ elt)
+ alist)))
+ (and alist (> (length (car (car alist))) maxlen)
+ (setq maxlen (length (car (car alist))))))
+ (setq tail (cdr tail)))
+ (setq alist (nreverse alist))
+ (nconc (mapcar '(lambda (pair)
+ ;; This is somewhat risque, to use
+ ;; the buffer name itself as the event type
+ ;; to define, but it works.
+ ;; It would not work to use the buffer
+ ;; since a buffer as an event has its
+ ;; own meaning.
+ (nconc (list (buffer-name (cdr pair))
+ (car pair)
+ (cons nil nil))
+ 'menu-bar-select-buffer))
+ alist)
+ (list (cons 'list-buffers
(cons
- (format
- (format "%%%ds %%s%%s %%s"
- maxbuf)
- (buffer-name elt)
- (if (buffer-modified-p elt)
- "*" " ")
- (save-excursion
- (set-buffer elt)
- (if buffer-read-only "%" " "))
- (or (buffer-file-name elt)
- (save-excursion
- (set-buffer elt)
- list-buffers-directory)
- ""))
- elt)
- alist)))
- (and alist (> (length (car (car alist))) maxlen)
- (setq maxlen (length (car (car alist))))))
- (setq tail (cdr tail)))
- (setq alist (nreverse alist))
- (nconc (mapcar '(lambda (pair)
- ;; This is somewhat risque, to use
- ;; the buffer name itself as the event type
- ;; to define, but it works.
- ;; It would not work to use the buffer
- ;; since a buffer as an event has its
- ;; own meaning.
- (nconc (list (buffer-name (cdr pair))
- (car pair)
- (cons nil nil))
- 'menu-bar-select-buffer))
- alist)
- (list (cons 'list-buffers
- (cons
- (concat (make-string (max (- (/ maxlen
- 2)
- 8)
- 0) ?\ )
- "List All Buffers")
- 'list-buffers)))))))
-
- ;; Make a Frames menu if we have more than one frame.
- (if (cdr (frame-list))
- (setq frames-menu
- (cons "Select Frame"
- (mapcar '(lambda (frame)
- (nconc (list frame
- (cdr (assq 'name
- (frame-parameters frame)))
- (cons nil nil))
- 'menu-bar-select-frame))
- (frame-list)))))
- (if buffers-menu
- (setq buffers-menu (cons 'keymap buffers-menu)))
- (if frames-menu
- (setq frames-menu (cons 'keymap frames-menu)))
- (define-key global-map [menu-bar buffer]
- (cons "Buffers"
- (if (and buffers-menu frames-menu)
- (list 'keymap "Buffers and Frames"
- (cons 'buffers (cons "Buffers" buffers-menu))
- (cons 'frames (cons "Frames" frames-menu)))
- (or buffers-menu frames-menu 'undefined))))))
+ (concat (make-string (max (- (/ maxlen
+ 2)
+ 8)
+ 0) ?\ )
+ "List All Buffers")
+ 'list-buffers)))))))
+
+ ;; Make a Frames menu if we have more than one frame.
+ (if (cdr frame)
+ (setq frames-menu
+ (cons "Select Frame"
+ (mapcar '(lambda (frame)
+ (nconc (list frame
+ (cdr (assq 'name
+ (frame-parameters frame)))
+ (cons nil nil))
+ 'menu-bar-select-frame))
+ frame))))
+ (if buffers-menu
+ (setq buffers-menu (cons 'keymap buffers-menu)))
+ (if frames-menu
+ (setq frames-menu (cons 'keymap frames-menu)))
+ (define-key global-map [menu-bar buffer]
+ (cons "Buffers"
+ (if (and buffers-menu frames-menu)
+ (list 'keymap "Buffers and Frames"
+ (cons 'buffers (cons "Buffers" buffers-menu))
+ (cons 'frames (cons "Frames" frames-menu)))
+ (or buffers-menu frames-menu 'undefined)))))))
(add-hook 'menu-bar-update-hook 'menu-bar-update-buffers)
(if menu-bar-mode 1 0))))
(setq frames (cdr frames))))))
-;; Make frames created from now on have a menu bar.
-(if window-system
- (menu-bar-mode t))
-
(provide 'menu-bar)
;;; menu-bar.el ends here