1

When I click on File I want to see f10 and not M-`

What can I change to provide this functionality? This question didn't really get the right answer.

2 Answers 2

3

f1 c (describe-key-briefly) works for mouse clicks and menu items too. So hit f1 c, click on the menu bar, and you'll see <menu-bar> <mouse-1> at that spot runs the command tmm-menubar-mouse. Whereas f1 c f10 says <f10> runs the command menu-bar-open. So to rebind:

(define-key global-map (kbd "<menu-bar> <mouse-1>") 'menu-bar-open) 

Clicking on a different option than File will still open the file menu

Right, menu-bar-open doesn't check xy location of the mouse click. Looking at the code of menu-bar-open I came up with this:

(defun menu-bar-open-xy (mouse-event) (interactive "e") (pcase mouse-event (`(mouse-1 (,_ menu-bar (,x . ,y) . ,_)) (let ((menu (menu-bar-menu-at-x-y x y))) (popup-menu (or (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))) (mouse-menu-bar-map)) (posn-at-x-y x y nil t) nil t))) (_ (error "unexpected event %S" mouse-event)))) (define-key global-map (kbd "<menu-bar> <mouse-1>") 'menu-bar-open-xy) 

The X co-ordinate is a bit off though, not clear why.

Clicking on File once file is open doesn't close the menu, just reopens it

Yeah, I'm not sure how to fix that. I guess that explains why this isn't the default in Emacs yet...

2
  • This works pretty well but there are two glaring problems: - Clicking on a different option than File will still open the file menu - Clicking on File once file is open doesn't close the menu, just reopens it Commented May 13, 2019 at 22:11
  • @Soren see edit, 2nd problem seems quite tough Commented May 14, 2019 at 0:05
0

That's a great question.

npostavs's answer is really nice, but has a subtle drawback: the x offset of the popup menu does not matches that of the initially-shown menu name.

So, here is a snippet that fixes this issue: it adds a small recursive function in lisp — given the main function at stake is only available in C code otherwise!

(defun menu-bar-get-minimal-x (menu-symbol x y) (let ((xx (- x 1))) (if (< xx tty-menu--initial-menu-x) x (if (equal (menu-bar-menu-at-x-y xx y (selected-frame)) menu-symbol) (menu-bar-get-minimal-x menu-symbol xx y) x)))) (defun menu-bar-open-x-y (mouse-event) (interactive "e") (pcase mouse-event (`(mouse-1 (,_ menu-bar (,x . ,y) . ,_)) (let ((menu (menu-bar-menu-at-x-y x y))) (popup-menu (or (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))) (mouse-menu-bar-map)) ;; this line differs from the initial answer (posn-at-x-y (menu-bar-get-minimal-x menu x y) y nil t) nil t))) (_ (error "unexpected event %S" mouse-event)))) (define-key global-map (kbd "<menu-bar> <mouse-1>") 'menu-bar-open-x-y) 

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.