;;; menu-bar.el --- define a default menu bar
-;; Copyright (C) 1993-1995, 2000-2013 Free Software Foundation, Inc.
+;; Copyright (C) 1993-1995, 2000-2014 Free Software Foundation, Inc.
-;; Author: RMS
-;; Maintainer: FSF
+;; Author: Richard M. Stallman
+;; Maintainer: emacs-devel@gnu.org
;; Keywords: internal, mouse
;; Package: emacs
(or (lookup-key global-map [menu-bar])
(define-key global-map [menu-bar] (make-sparse-keymap "menu-bar")))
-(if (not (featurep 'ns))
- ;; Force Help item to come last, after the major mode's own items.
- ;; The symbol used to be called `help', but that gets confused with the
- ;; help key.
- (setq menu-bar-final-items '(help-menu))
- (if (eq system-type 'darwin)
- (setq menu-bar-final-items '(buffer services help-menu))
- (setq menu-bar-final-items '(buffer services hide-app quit))
- ;; Add standard top-level items to GNUstep menu.
- (bindings--define-key global-map [menu-bar quit]
- '(menu-item "Quit" save-buffers-kill-emacs
- :help "Save unsaved buffers, then exit"))
- (bindings--define-key global-map [menu-bar hide-app]
- '(menu-item "Hide" ns-do-hide-emacs
- :help "Hide Emacs"))))
+;; Force Help item to come last, after the major mode's own items.
+;; The symbol used to be called `help', but that gets confused with the
+;; help key.
+(setq menu-bar-final-items '(help-menu))
;; This definition is just to show what this looks like.
;; It gets modified in place when menu-bar-update-buffers is called.
:help "Recover edits from a crashed session"))
(bindings--define-key menu [revert-buffer]
'(menu-item "Revert Buffer" revert-buffer
- :enable (or revert-buffer-function
- revert-buffer-insert-file-contents-function
+ :enable (or (not (eq revert-buffer-function
+ 'revert-buffer--default))
+ (not (eq
+ revert-buffer-insert-file-contents-function
+ 'revert-buffer-insert-file-contents--default-function))
(and buffer-file-number
(or (buffer-modified-p)
(not (verify-visited-file-modtime
(let ((x-select-enable-clipboard t))
(yank)))
-(defun clipboard-kill-ring-save (beg end)
+(defun clipboard-kill-ring-save (beg end &optional region)
"Copy region to kill ring, and save in the X clipboard."
- (interactive "r")
+ (interactive "r\np")
(let ((x-select-enable-clipboard t))
- (kill-ring-save beg end)))
+ (kill-ring-save beg end region)))
-(defun clipboard-kill-region (beg end)
+(defun clipboard-kill-region (beg end &optional region)
"Kill the region, and save it in the X clipboard."
- (interactive "r")
+ (interactive "r\np")
(let ((x-select-enable-clipboard t))
- (kill-region beg end)))
+ (kill-region beg end region)))
(defun menu-bar-enable-clipboard ()
"Make CUT, PASTE and COPY (keys and menu bar items) use the clipboard.
;; Function for setting/saving default font.
(defun menu-set-font ()
- "Interactively select a font and make it the default."
+ "Interactively select a font and make it the default on all existing frames."
(interactive)
(set-frame-font (if (fboundp 'x-select-font)
(x-select-font)
(selected-frame)))
(defun menu-bar-positive-p (val)
- "Return non-nil iff VAL is a positive number."
+ "Return non-nil if VAL is a positive number."
(and (numberp val)
(> val 0)))
"Use Directory Names in Buffer Names"
"Directory name in buffer names (uniquify) %s"
"Uniquify buffer names by adding parent directory names"
- (require 'uniquify)
(setq uniquify-buffer-name-style
(if (not uniquify-buffer-name-style)
- 'forward))))
+ 'post-forward-angle-brackets))))
(bindings--define-key menu [edit-options-separator]
menu-bar-separator)
(bindings--define-key menu [separator-net]
menu-bar-separator)
+ (bindings--define-key menu [browse-web]
+ '(menu-item "Browse the Web..." browse-web))
(bindings--define-key menu [directory-search]
'(menu-item "Directory Search" eudc-tools-menu))
(bindings--define-key menu [compose-mail]
:help "Read the Introduction to Emacs Lisp Programming"))
menu))
-(defun menu-bar-help-extra-packages ()
- "Display help about some additional packages available for Emacs."
- (interactive)
- (let (enable-local-variables)
- (view-file (expand-file-name "MORE.STUFF"
- data-directory))
- (goto-address-mode 1)))
-
(defun help-with-tutorial-spec-language ()
"Use the Emacs tutorial, specifying which language you want."
(interactive)
(bindings--define-key menu [sep2]
menu-bar-separator)
(bindings--define-key menu [external-packages]
- '(menu-item "Finding Extra Packages" menu-bar-help-extra-packages
- :help "Lisp packages distributed separately for use in Emacs"))
+ '(menu-item "Finding Extra Packages" view-external-packages
+ :help "How to get more Lisp packages for use in Emacs"))
(bindings--define-key menu [find-emacs-packages]
'(menu-item "Search Built-in Packages" finder-by-keyword
:help "Find built-in packages and features by keyword"))
(cons "Edit" menu-bar-edit-menu))
(bindings--define-key global-map [menu-bar file]
(cons "File" menu-bar-file-menu))
-
-;; Put "Help" menu at the end, or Info at the front.
-;; If running under GNUstep, "Help" is moved and renamed "Info" (see below).
-(if (and (featurep 'ns)
- (not (eq system-type 'darwin)))
- (bindings--define-key global-map [menu-bar help-menu]
- (cons "Info" menu-bar-help-menu))
- (define-key-after global-map [menu-bar help-menu]
- (cons (purecopy "Help") menu-bar-help-menu)))
+(bindings--define-key global-map [menu-bar help-menu]
+ (cons (purecopy "Help") menu-bar-help-menu))
(defun menu-bar-menu-frame-live-and-visible-p ()
"Return non-nil if the menu frame is alive and visible.
(declare-function x-menu-bar-open "term/x-win" (&optional frame))
(declare-function w32-menu-bar-open "term/w32-win" (&optional frame))
+(defun lookup-key-ignore-too-long (map key)
+ "Call `lookup-key' and convert numeric values to nil."
+ (let ((binding (lookup-key map key)))
+ (if (numberp binding) ; `too long'
+ nil
+ binding)))
+
(defun popup-menu (menu &optional position prefix from-menu-bar)
"Popup the given menu and call the selected option.
MENU can be a keymap, an easymenu-style menu or a list of keymaps as for
(setq position (list menu-symbol (list frame '(menu-bar)
event 0)))
(setq map
- (or
- (lookup-key global-map (vector 'menu-bar menu-symbol))
- (lookup-key (current-local-map) (vector 'menu-bar
- menu-symbol))))))
+ (key-binding (vector 'menu-bar menu-symbol)))))
((and (not (keymapp map)) (listp map))
;; We were given a list of keymaps. Search them all
;; in sequence until a first binding is found.
(let ((mouse-click (apply 'vector event))
binding)
(while (and map (null binding))
- (setq binding (lookup-key (car map) mouse-click))
- (if (numberp binding) ; `too long'
- (setq binding nil))
+ (setq binding (lookup-key-ignore-too-long (car map) mouse-click))
(setq map (cdr map)))
- binding))
+ binding))
(t
;; We were given a single keymap.
(lookup-key map (apply 'vector event)))))
((eq type 'w32) (w32-menu-bar-open frame))
((and (null tty-menu-open-use-tmm)
(not (zerop (or (frame-parameter nil 'menu-bar-lines) 0))))
+ ;; Make sure the menu bar is up to date. One situation where
+ ;; this is important is when this function is invoked by name
+ ;; via M-x, in which case the menu bar includes the "Minibuf"
+ ;; menu item that should be removed when we exit the minibuffer.
+ (force-mode-line-update)
+ (redisplay)
(let* ((x tty-menu--initial-menu-x)
(menu (menu-bar-menu-at-x-y x 0 frame)))
(popup-menu (or
- (lookup-key global-map (vector 'menu-bar menu))
- (lookup-key (current-local-map) (vector 'menu-bar menu)))
+ (lookup-key-ignore-too-long
+ global-map (vector 'menu-bar menu))
+ (lookup-key-ignore-too-long
+ (current-local-map) (vector 'menu-bar menu))
+ (cdar (minor-mode-key-binding (vector 'menu-bar menu))))
(posn-at-x-y x 0 nil t) nil t)))
(t (with-selected-frame (or frame (selected-frame))
(tmm-menubar))))))