mu4e: improve emacs menu-bar items

Fixes issue #2406.
This commit is contained in:
Dirk-Jan C. Binnema 2023-01-09 22:13:24 +02:00
parent 5e5a74ed22
commit 551bc46b47
6 changed files with 179 additions and 217 deletions

View File

@ -923,6 +923,16 @@ is supplied, or Transient Mark mode is enabled and the mark is active."
(define-key mu4e-compose-mode-map
(vector 'remap 'end-of-buffer) 'mu4e-compose-goto-bottom)
(defvar mu4e--compose-menu-items
'("--"
["Compose new" mu4e-compose-new
:help "Compose new message"]
["Reply" mu4e-compose-reply
:help "Reply to message"]
["Forward" mu4e-compose-forward
:help "Forward message"])
"Easy menu items for search.")
;;; _
(provide 'mu4e-compose)
;;; mu4e-compose.el ends here

View File

@ -224,6 +224,14 @@ as it is."
:lighter ""
(mu4e--modeline-register #'mu4e--context-modeline-item))
(defvar mu4e--context-menu-items
'("--"
["Switch-context" mu4e-context-switch
:help "Switch the mu4e context"])
"Easy menu items for mu4e-context.")
;;;
(provide 'mu4e-context)
;;; mu4e-context.el ends here

View File

@ -896,148 +896,118 @@ after the end of the search results."
(mu4e~headers-defun-mark-for unread)
(mu4e~headers-defun-mark-for action)
(declare-function mu4e-view-pipe "mu4e-view")
(defvar mu4e-headers-mode-map
(let ((map (make-sparse-keymap)))
(define-key map "j" #'mu4e~headers-jump-to-maildir)
(define-key map "q" #'mu4e~headers-quit-buffer)
(define-key map "g" #'mu4e-search-rerun) ;; for compatibility
(define-key map "%" #'mu4e-headers-mark-pattern)
(define-key map "t" #'mu4e-headers-mark-subthread)
(define-key map "T" #'mu4e-headers-mark-thread)
(define-key map "," #'mu4e-sexp-at-point)
(define-key map ";" #'mu4e-context-switch)
;; navigation between messages
(define-key map "p" #'mu4e-headers-prev)
(define-key map "n" #'mu4e-headers-next)
(define-key map (kbd "<M-up>") #'mu4e-headers-prev)
(define-key map (kbd "<M-down>") #'mu4e-headers-next)
(define-key map (kbd "[") #'mu4e-headers-prev-unread)
(define-key map (kbd "]") #'mu4e-headers-next-unread)
;; change the number of headers
(define-key map (kbd "C-+") #'mu4e-headers-split-view-grow)
(define-key map (kbd "C--") #'mu4e-headers-split-view-shrink)
(define-key map (kbd "<C-kp-add>") 'mu4e-headers-split-view-grow)
(define-key map (kbd "<C-kp-subtract>")
#'mu4e-headers-split-view-shrink)
;; switching to view mode (if it's visible)
(define-key map "y" #'mu4e-select-other-view)
;; marking/unmarking ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define-key map (kbd "<backspace>") #'mu4e-headers-mark-for-trash)
(define-key map (kbd "d") #'mu4e-headers-mark-for-trash)
(define-key map (kbd "<delete>") #'mu4e-headers-mark-for-delete)
(define-key map (kbd "<deletechar>") #'mu4e-headers-mark-for-delete)
(define-key map (kbd "D") #'mu4e-headers-mark-for-delete)
(define-key map (kbd "m") #'mu4e-headers-mark-for-move)
(define-key map (kbd "r") #'mu4e-headers-mark-for-refile)
(define-key map (kbd "?") #'mu4e-headers-mark-for-unread)
(define-key map (kbd "!") #'mu4e-headers-mark-for-read)
(define-key map (kbd "A") #'mu4e-headers-mark-for-action)
(define-key map (kbd "u") #'mu4e-headers-mark-for-unmark)
(define-key map (kbd "+") #'mu4e-headers-mark-for-flag)
(define-key map (kbd "-") #'mu4e-headers-mark-for-unflag)
(define-key map (kbd "=") #'mu4e-headers-mark-for-untrash)
(define-key map (kbd "&") #'mu4e-headers-mark-custom)
(define-key map (kbd "*")
#'mu4e-headers-mark-for-something)
(define-key map (kbd "<kp-multiply>")
#'mu4e-headers-mark-for-something)
(define-key map (kbd "<insertchar>")
#'mu4e-headers-mark-for-something)
(define-key map (kbd "<insert>")
#'mu4e-headers-mark-for-something)
(define-key map (kbd "#") #'mu4e-mark-resolve-deferred-marks)
(define-key map "U" #'mu4e-mark-unmark-all)
(define-key map "x" #'mu4e-mark-execute-all)
(define-key map "a" #'mu4e-headers-action)
;; message composition
(define-key map "R" #'mu4e-compose-reply)
(define-key map "F" #'mu4e-compose-forward)
(define-key map "C" #'mu4e-compose-new)
(define-key map "E" #'mu4e-compose-edit)
(define-key map (kbd "RET") #'mu4e-headers-view-message)
(define-key map [mouse-2] #'mu4e-headers-view-message)
(define-key map "$" #'mu4e-show-log)
(define-key map "H" #'mu4e-display-manual)
(define-key map "|" #'mu4e-view-pipe)
map)
"Keymap for mu4e's headers mode.")
(easy-menu-define mu4e-headers-mode-menu
mu4e-headers-mode-map "Menu for mu4e's headers-mode."
(append
'("Headers" ;;:visible mu4e-headers-mode
"--"
["Previous" mu4e-headers-prev
:help "Move to previous header"]
["Next" mu4e-headers-prev
:help "Move to next header"]
"--"
["Mark for move" mu4e-headers-mark-for-move
:help "Mark message for move"
])
mu4e--compose-menu-items
mu4e--search-menu-items
mu4e--context-menu-items
'(
"--"
["Quit" mu4e~headers-quit-buffer
:help "Quit the headers"]
)))
;;; Headers-mode and mode-map
(defvar mu4e-headers-mode-map nil
"Keymap for *mu4e-headers* buffers.")
(unless mu4e-headers-mode-map
(setq mu4e-headers-mode-map
(let ((map (make-sparse-keymap)))
(define-key map "j" #'mu4e~headers-jump-to-maildir)
(define-key map "q" #'mu4e~headers-quit-buffer)
(define-key map "g" #'mu4e-search-rerun) ;; for compatibility
(define-key map "%" #'mu4e-headers-mark-pattern)
(define-key map "t" #'mu4e-headers-mark-subthread)
(define-key map "T" #'mu4e-headers-mark-thread)
(define-key map "," #'mu4e-sexp-at-point)
(define-key map ";" #'mu4e-context-switch)
;; navigation between messages
(define-key map "p" 'mu4e-headers-prev)
(define-key map "n" 'mu4e-headers-next)
(define-key map (kbd "<M-up>") 'mu4e-headers-prev)
(define-key map (kbd "<M-down>") 'mu4e-headers-next)
(define-key map (kbd "[") 'mu4e-headers-prev-unread)
(define-key map (kbd "]") 'mu4e-headers-next-unread)
;; change the number of headers
(define-key map (kbd "C-+") 'mu4e-headers-split-view-grow)
(define-key map (kbd "C--") 'mu4e-headers-split-view-shrink)
(define-key map (kbd "<C-kp-add>") 'mu4e-headers-split-view-grow)
(define-key map (kbd "<C-kp-subtract>")
'mu4e-headers-split-view-shrink)
;; switching to view mode (if it's visible)
(define-key map "y" 'mu4e-select-other-view)
;; marking/unmarking ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define-key map (kbd "<backspace>") 'mu4e-headers-mark-for-trash)
(define-key map (kbd "d") 'mu4e-headers-mark-for-trash)
(define-key map (kbd "<delete>") 'mu4e-headers-mark-for-delete)
(define-key map (kbd "<deletechar>") 'mu4e-headers-mark-for-delete)
(define-key map (kbd "D") 'mu4e-headers-mark-for-delete)
(define-key map (kbd "m") 'mu4e-headers-mark-for-move)
(define-key map (kbd "r") 'mu4e-headers-mark-for-refile)
(define-key map (kbd "?") 'mu4e-headers-mark-for-unread)
(define-key map (kbd "!") 'mu4e-headers-mark-for-read)
(define-key map (kbd "A") 'mu4e-headers-mark-for-action)
(define-key map (kbd "u") 'mu4e-headers-mark-for-unmark)
(define-key map (kbd "+") 'mu4e-headers-mark-for-flag)
(define-key map (kbd "-") 'mu4e-headers-mark-for-unflag)
(define-key map (kbd "=") 'mu4e-headers-mark-for-untrash)
(define-key map (kbd "&") 'mu4e-headers-mark-custom)
(define-key map (kbd "*")
'mu4e-headers-mark-for-something)
(define-key map (kbd "<kp-multiply>")
'mu4e-headers-mark-for-something)
(define-key map (kbd "<insertchar>")
'mu4e-headers-mark-for-something)
(define-key map (kbd "<insert>")
'mu4e-headers-mark-for-something)
(define-key map (kbd "#") 'mu4e-mark-resolve-deferred-marks)
(define-key map "U" 'mu4e-mark-unmark-all)
(define-key map "x" 'mu4e-mark-execute-all)
(define-key map "a" 'mu4e-headers-action)
;; message composition
(define-key map "R" 'mu4e-compose-reply)
(define-key map "F" 'mu4e-compose-forward)
(define-key map "C" 'mu4e-compose-new)
(define-key map "E" 'mu4e-compose-edit)
(define-key map (kbd "RET") 'mu4e-headers-view-message)
(define-key map [mouse-2] 'mu4e-headers-view-message)
(define-key map "$" 'mu4e-show-log)
(define-key map "H" 'mu4e-display-manual)
(define-key map "|" 'mu4e-view-pipe)
;; menu
;;(define-key map [menu-bar] (make-sparse-keymap))
(let ((menumap (make-sparse-keymap)))
(define-key map [menu-bar headers] (cons "Mu4e" menumap))
(define-key menumap [mu4e~headers-quit-buffer]
'("Quit view" . mu4e~headers-quit-buffer))
(define-key menumap [display-help] '("Help" . mu4e-display-manual))
(define-key menumap [sepa0] '("--"))
(define-key menumap "|" '("Pipe through shell" . mu4e-view-pipe))
(define-key menumap [sepa1] '("--"))
(define-key menumap [execute-marks] '("Execute marks"
. mu4e-mark-execute-all))
(define-key menumap [unmark-all] '("Unmark all" . mu4e-mark-unmark-all))
(define-key menumap [unmark]
'("Unmark" . mu4e-headers-mark-for-unmark))
(define-key menumap [mark-pattern] '("Mark pattern" .
mu4e-headers-mark-pattern))
(define-key menumap [mark-as-read] '("Mark as read" .
mu4e-headers-mark-for-read))
(define-key menumap [mark-as-unread]
'("Mark as unread" . mu4e-headers-mark-for-unread))
(define-key menumap [mark-delete]
'("Mark for deletion" . mu4e-headers-mark-for-delete))
(define-key menumap [mark-untrash]
'("Mark for untrash" . mu4e-headers-mark-for-untrash))
(define-key menumap [mark-trash]
'("Mark for trash" . mu4e-headers-mark-for-trash))
(define-key menumap [mark-move]
'("Mark for move" . mu4e-headers-mark-for-move))
(define-key menumap [sepa2] '("--"))
(define-key menumap [resend] '("Resend" . mu4e-compose-resend))
(define-key menumap [forward] '("Forward" . mu4e-compose-forward))
(define-key menumap [reply] '("Reply" . mu4e-compose-reply))
(define-key menumap [compose-new] '("Compose new" . mu4e-compose-new))
(define-key menumap [sepa3] '("--"))
(define-key menumap [jump] '("Jump to maildir" .
mu4e~headers-jump-to-maildir))
(define-key menumap [search] '("Search" . mu4e-headers-search))
(define-key menumap [sepa4] '("--"))
(define-key menumap [view] '("View" . mu4e-headers-view-message))
(define-key menumap [next] '("Next" . mu4e-headers-next))
(define-key menumap [previous] '("Previous" . mu4e-headers-prev)))
map)))
(fset 'mu4e-headers-mode-map mu4e-headers-mode-map)
(defun mu4e~header-line-format ()
"Get the format for the header line."
(let ((uparrow (if mu4e-use-fancy-chars "" " ^"))
@ -1047,7 +1017,7 @@ after the end of the search results."
(+ mu4e--mark-fringe-len (floor (fringe-columns 'left t))) ?\s)
(mapcar
(lambda (item)
(let* ( ;; with threading enabled, we're necessarily sorting by date.
(let* (;; with threading enabled, we're necessarily sorting by date.
(sort-field (if mu4e-search-threads :date mu4e-search-sort-field))
(field (car item)) (width (cdr item))
(info (cdr (assoc field
@ -1065,15 +1035,15 @@ after the end of the search results."
(map (make-sparse-keymap)))
(when sortable
(define-key map [header-line mouse-1]
(lambda (&optional e)
;; getting the field, inspired by `tabulated-list-col-sort'
(interactive "e")
(let* ((obj (posn-object (event-start e)))
(field
(and obj (get-text-property 0 'field (car obj)))))
;; "t": if we're already sorted by field, the sort-order is
;; changed
(mu4e-search-change-sorting field t)))))
(lambda (&optional e)
;; getting the field, inspired by `tabulated-list-col-sort'
(interactive "e")
(let* ((obj (posn-object (event-start e)))
(field
(and obj (get-text-property 0 'field (car obj)))))
;; "t": if we're already sorted by field, the sort-order is
;; changed
(mu4e-search-change-sorting field t)))))
(concat
(propertize
(if width

View File

@ -515,18 +515,21 @@ the mode-line.")
(define-key map "b" #'mu4e-search-bookmark)
(define-key map "B" #'mu4e-search-bookmark-edit)
(let ((menumap (make-sparse-keymap)))
(define-key map [menu-bar search] (cons "Mu4e" menumap))
(define-key menumap [query-next]
'("Next query" . mu4e-search-next))
(define-key menumap [query-prev] '("Previous query" .
mu4e-search-prev))
(define-key menumap [narrow-search] '("Narrow search" .
mu4e-search-narrow))
(define-key menumap [bookmark] '("Search bookmark" .
mu4e-search-bookmark))
(define-key menumap [refresh] '("Refresh" . mu4e-search-rerun))
map)))
map))
(defvar mu4e--search-menu-items
'("--"
["Search" mu4e-search
:help "Search using expression"]
["Search bookmark" mu4e-search-bookmark
:help "Search some bookmark"]
["Previous query" mu4e-search-prev
:help "Run previous query"]
["Next query" mu4e-search-next
:help "Run next query"]
["Narrow search" mu4e-search-narrow
:help "Narrow the search query"])
"Easy menu items for search.")
(provide 'mu4e-search)
;;; mu4e-search.el ends here

View File

@ -951,57 +951,6 @@ This is useful for advising some Gnus-functionality that does not work in mu4e."
(define-key map "$" #'mu4e-show-log)
(define-key map "H" #'mu4e-display-manual)
;; menu
;;(define-key map [menu-bar] (make-sparse-keymap))
(let ((menumap (make-sparse-keymap)))
(define-key map [menu-bar headers] (cons "Mu4e" menumap))
(define-key menumap [quit-buffer]
'("Quit view" . mu4e-view-quit))
(define-key menumap [display-help] '("Help" . mu4e-view-quit))
(define-key menumap [sepa0] '("--"))
(define-key menumap [wrap-lines]
'("Toggle wrap lines" . visual-line-mode))
(define-key menumap [raw-view]
'("View raw message" . mu4e-view-raw-message))
(define-key menumap [pipe]
'("Pipe through shell" . mu4e-view-pipe))
(define-key menumap [sepa1] '("--"))
(define-key menumap [mark-delete]
'("Mark for deletion" . mu4e-view-mark-for-delete))
(define-key menumap [mark-untrash]
'("Mark for untrash" . mu4e-view-mark-for-untrash))
(define-key menumap [mark-trash]
'("Mark for trash" . mu4e-view-mark-for-trash))
(define-key menumap [mark-move]
'("Mark for move" . mu4e-view-mark-for-move))
(define-key menumap [sepa2] '("--"))
(define-key menumap [resend] '("Resend" . mu4e-compose-resend))
(define-key menumap [forward] '("Forward" . mu4e-compose-forward))
(define-key menumap [reply] '("Reply" . mu4e-compose-reply))
(define-key menumap [compose-new] '("Compose new" . mu4e-compose-new))
(define-key menumap [sepa3] '("--"))
(define-key menumap [query-next]
'("Next query" . mu4e-headers-query-next))
(define-key menumap [query-prev]
'("Previous query" . mu4e-headers-query-prev))
(define-key menumap [narrow-search]
'("Narrow search" . mu4e-headers-search-narrow))
(define-key menumap [bookmark]
'("Search bookmark" . mu4e-headers-search-bookmark))
(define-key menumap [jump]
'("Jump to maildir" . mu4e~headers-jump-to-maildir))
(define-key menumap [search]
'("Search" . mu4e-headers-search))
(define-key menumap [sepa4] '("--"))
(define-key menumap [next] '("Next" . mu4e-view-headers-next))
(define-key menumap [previous] '("Previous" . mu4e-view-headers-prev)))
;; Make 0..9 shortcuts for digit-argument. Actually, none of the bound
;; functions seem to use a prefix arg but those bindings existed because we
;; used to use `suppress-keymap'. And possibly users added their own
@ -1010,10 +959,32 @@ This is useful for advising some Gnus-functionality that does not work in mu4e."
(define-key map (kbd (format "%d" i)) #'digit-argument))
(set-keymap-parent map special-mode-map)
(set-keymap-parent map button-buffer-map)
map)
"Keymap for mu4e-view mode.")
(set-keymap-parent mu4e-view-mode-map button-buffer-map)
(easy-menu-define mu4e-view-mode-menu
mu4e-view-mode-map "Menu for mu4e's view-mode."
(append
'("View"
"--"
["Toggle wrap lines" visual-line-mode]
["View raw" mu4e-view-raw-message]
["Pipe through shell" mu4e-view-pipe]
"--"
["Mark for deletion" mu4e-view-mark-for-delete]
["Mark for untrash" mu4e-view-mark-for-untrash]
["Mark for trash" mu4e-view-mark-for-trash]
["Mark for move" mu4e-view-mark-for-move]
)
mu4e--compose-menu-items
mu4e--search-menu-items
mu4e--context-menu-items
'(
"--"
["Quit" mu4e-view-quit
:help "Quit the view"]
)))
(defcustom mu4e-raw-view-mode-hook nil
"Hook run when entering \\[mu4e-raw-view] mode."

View File

@ -953,7 +953,7 @@ headers-view.
@section Keybindings
Using the below key bindings, you can do various things with these
messages; these actions are also listed in the @t{Mu4e} menu in the
messages; these actions are also listed in the @t{Headers} menu in the
Emacs menu bar.
@verbatim
@ -1282,8 +1282,8 @@ to prevent this behavior, set @code{mu4e-view-scroll-to-next} to
@node MSGV Keybindings
@section Keybindings
You can find most things you can do with this message in the @emph{Mu4e}
menu, or by using the keyboard; the default bindings are:
You can find most things you can do with this message in the @emph{View} menu,
or by using the keyboard; the default bindings are:
@verbatim
key description