From 1865c0d5599d12cb42814941ccba77b0fc070cab Mon Sep 17 00:00:00 2001 From: Phil Sainty Date: Sun, 26 Jun 2016 17:00:45 +1200 Subject: [PATCH] Added support for `mode-line-mode-menu' --- delight.el | 60 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/delight.el b/delight.el index 840d03ee8..8e88e2eb2 100644 --- a/delight.el +++ b/delight.el @@ -1,10 +1,10 @@ -;;; delight.el - A dimmer switch for your lighter text. +;;; delight.el --- A dimmer switch for your lighter text. ;; ;; Author: Phil S. ;; URL: http://www.emacswiki.org/emacs/DelightedModes -;; Version: 1.02 +;; Version: 1.03 -;; Commentary: +;;; Commentary: ;; ;; Enables you to customise the mode names displayed in the mode line. ;; @@ -52,9 +52,12 @@ ;;; Changelog: ;; -;; 1.02 - Bug fix for missing 'cl requirement for destructuring-bind macro. -;; 1.01 - Added support for using the keyword :major as the FILE argument -;; for major modes, to avoid also processing them as minor modes. +;; 1.03 (2014-05-30) Added support for `mode-line-mode-menu'. +;; 1.02 (2014-05-04) Bug fix for missing 'cl requirement for +;; destructuring-bind macro. +;; 1.01 (2014-05-04) Allow the keyword :major as the FILE argument for +;; major modes, to avoid also processing them as minor modes. +;; 1.00 (2013-06-25) Initial release. ;;; Code: @@ -81,7 +84,8 @@ replacement buffer-local `mode-name' value to use when a buffer changes to that mode. In both cases VALUE is commonly a string, but may in fact contain any valid -mode-line construct. See `mode-line-format' for details. +mode-line construct. For details see the `mode-line-format' variable, and +Info node `(elisp) Mode Line Format'. The FILE argument is passed through to `eval-after-load'. If FILE is nil then the mode symbol is passed as the required feature. Both of these cases are @@ -99,7 +103,46 @@ to prevent the mode being treated as a minor mode." (eval-after-load (or file mode) `(let ((minor-delight (assq ',mode minor-mode-alist))) (when minor-delight - (setcar (cdr minor-delight) ',value))))))))) + (setcar (cdr minor-delight) ',value) + (delight-mode-line-mode-menu ',mode ',value))))))))) + +(defun delight-mode-line-mode-menu (mode value) + "Delight `mode-line-mode-menu' (the \"Toggle minor modes\" menu) +so that the Lighter text displayed in the menu matches that displayed in +the mode line (when such menu items exist). + +The expected naming scheme for the menu items is: \"Friendly name (Lighter)\" +e.g.: \"Highlight changes (Chg)\". + +We replace the \"Lighter\" portion of that with our delighted VALUE, for the +specified MODE, unless VALUE is empty/nil, in which case we remove the text +and parentheses altogether. + +If the delighted VALUE is not a string and not nil, we do nothing." + (when (string-or-null-p value) + (let* ((menu-keymap mode-line-mode-menu) + (menu-item (assq mode (cdr menu-keymap)))) + (when menu-item + ;; Lighter text is typically prefixed with a space to separate + ;; it from the preceding lighter. We need to trim that space. + (let* ((trimmed-value (if (and value (string-match "\\`\\s-+" value)) + (replace-match "" t t value) + value)) + (wrapped-value (if (> (length trimmed-value) 0) + (concat " (" trimmed-value ")") + "")) + (menu-def (cdr menu-item)) + (label (cadr menu-def)) + (new-label (and (stringp label) + (or (string-match "\\s-+(.+?)\\s-*\\'" label) + (string-match "\\s-*\\'" label)) + (replace-match wrapped-value t t label)))) + (when new-label + ;; Pure storage is used for the default menu items, so we + ;; cannot modify those objects directly. + (setq menu-def (copy-sequence menu-def)) + (setf (cadr menu-def) new-label) + (define-key menu-keymap (vector mode) menu-def))))))) (defun delight-major-mode () "Delight the 'pretty name' of the current buffer's major mode @@ -120,3 +163,4 @@ When `mode-name' is displayed in other contexts (such as in the ad-do-it)) (provide 'delight) +;;; delight.el ends here -- 2.39.2