--- /dev/null
+;;; delight.el - A dimmer switch for your lighter text.
+
+;; Commentary:
+;;
+;; Enables you to customise the mode names displayed in the mode line.
+;;
+;; For major modes, the buffer-local `mode-name' variable is modified,
+;; with advice around the `format-mode-line' function ensuring that the
+;; original value is used in contexts outside of mode line redraws.
+;;
+;; For minor modes, the associated value in `minor-mode-alist' is set.
+;;
+;; Example usage:
+;;
+;; (delight 'abbrev-mode " Abv" "abbrev")
+;;
+;; (delight '((abbrev-mode " Abv" "abbrev")
+;; (smart-tab-mode " \\t" smart-tab)
+;; (eldoc-mode nil "eldoc")
+;; (rainbow-mode)
+;; (emacs-lisp-mode "Elisp" "lisp-mode")))
+
+;;; Code:
+
+(defvar delighted ()
+ "List of specs for modifying the display of mode names in the mode line.")
+
+;;;###autoload
+(defun delight (spec &optional value file)
+ "Modify the lighter value displayed in the mode line for the given mode SPEC
+if and when the mode is loaded.
+
+SPEC can be either a mode symbol, or a list of the form ((MODE VALUE FILE) ...)
+
+For minor modes, VALUE is the replacement lighter value (or nil to disable).
+VALUE is typically a string, but may have other values. See `minor-mode-alist'
+for details.
+
+For major modes, VALUE is typically a string to which `mode-name' will be set,
+but any value suitable for `mode-line-format' may be used.
+
+The optional FILE argument is the file to pass to `eval-after-load'.
+If FILE is nil then the mode symbol is passed as the required feature."
+ (add-hook 'after-change-major-mode-hook 'delight-major-mode)
+ (let ((glum (if (consp spec) spec (list (list spec value file)))))
+ (while glum
+ (destructuring-bind (mode &optional value file) (pop glum)
+ (assq-delete-all mode delighted)
+ (add-to-list 'delighted (list mode value file))
+ (eval-after-load (or file mode)
+ `(let ((minor-delight (assq ',mode minor-mode-alist)))
+ (when minor-delight
+ (setcar (cdr minor-delight) ',value))))))))
+
+(defun delight-major-mode ()
+ "Delight the 'pretty name' of the current buffer's major mode
+during mode-line redraws. For other uses of `mode-name', this
+delight will be inhibited."
+ (let ((major-delight (assq major-mode delighted)))
+ (when major-delight
+ (set (make-local-variable 'mode-name-glum) mode-name)
+ (set (make-local-variable 'mode-name-delighted) (cadr major-delight))
+ (setq mode-name '(inhibit-mode-name-delight
+ mode-name-glum
+ mode-name-delighted)))))
+
+(defadvice format-mode-line (around delight-glum-mode-name activate)
+ "Delighted major modes must exhibit their original glum `mode-name' when
+`format-mode-line' is called. See `delight-major-mode'."
+ (let ((inhibit-mode-name-delight t))
+ ad-do-it))