(defvar minibuffer-default-in-prompt-regexps
'(("\\( (default\\>.*)\\):? \\'" . 1) ("\\( \\[.*\\]\\):? *\\'" . 1))
"*A list of regexps matching the parts of minibuffer prompts showing defaults.
When `minibuffer-electric-default-mode' is active, these regexps are
used to identify the portions of prompts to elide.
Each entry is either a string, which should be a regexp matching the
default portion of the prompt, or a cons cell, who's car is a regexp
matching the default part of the prompt, and who's cdr indicates the
regexp subexpression that matched.")
(defvar minibuf-eldef-frobbed-minibufs nil)
(defvar minibuf-eldef-initial-input)
(make-variable-buffer-local 'minibuf-eldef-initial-input)
(defvar minibuf-eldef-initial-buffer-length)
(make-variable-buffer-local 'minibuf-eldef-initial-buffer-length)
(defvar minibuf-eldef-showing-default-in-prompt)
(make-variable-buffer-local 'minibuf-eldef-showing-default-in-prompt)
(defvar minibuf-eldef-overlay)
(make-variable-buffer-local 'minibuf-eldef-overlay)
(defun minibuf-eldef-setup-minibuffer ()
"Set up a minibuffer for `minibuffer-electric-default-mode'.
The prompt and initial input should already have been inserted."
(let ((regexps minibuffer-default-in-prompt-regexps)
(match nil)
(inhibit-point-motion-hooks t))
(save-excursion
(save-restriction
(goto-char (point-min))
(narrow-to-region (point) (minibuffer-prompt-end))
(while regexps
(setq match (pop regexps))
(if (re-search-forward (if (stringp match) match (car match)) nil t)
(setq regexps nil)
(setq match nil)))))
(if (not match)
(remove-hook 'post-command-hook #'minibuf-eldef-update-minibuffer t)
(setq match (if (consp match) (cdr match) 0))
(setq minibuf-eldef-overlay
(make-overlay (match-beginning match) (match-end match)))
(setq minibuf-eldef-showing-default-in-prompt t)
(setq minibuf-eldef-initial-input
(minibuffer-contents-no-properties))
(setq minibuf-eldef-initial-buffer-length (point-max))
(add-to-list 'minibuf-eldef-frobbed-minibufs (current-buffer))
(add-hook 'post-command-hook #'minibuf-eldef-update-minibuffer nil t))))
(defun minibuf-eldef-update-minibuffer ()
"Update a minibuffer's prompt to include a default only when applicable.
This is intended to be used as a minibuffer post-command-hook for
`minibuffer-electric-default-mode'; the minibuffer should have already
been set up by `minibuf-eldef-setup-minibuffer'."
(unless (eq minibuf-eldef-showing-default-in-prompt
(and (= (point-max) minibuf-eldef-initial-buffer-length)
(string-equal (minibuffer-contents-no-properties)
minibuf-eldef-initial-input)))
(setq minibuf-eldef-showing-default-in-prompt
(not minibuf-eldef-showing-default-in-prompt))
(cond (minibuf-eldef-showing-default-in-prompt
(overlay-put minibuf-eldef-overlay 'invisible nil)
(overlay-put minibuf-eldef-overlay 'intangible nil))
(t
(overlay-put minibuf-eldef-overlay 'invisible t)
(overlay-put minibuf-eldef-overlay 'intangible t)))))
(define-minor-mode minibuffer-electric-default-mode
"Toggle Minibuffer Electric Default mode.
When active, minibuffer prompts that show a default value only show the
default when it's applicable -- that is, when hitting RET would yield
the default value. If the user modifies the input such that hitting RET
would enter a non-default value, the prompt is modified to remove the
default indication.
With prefix argument ARG, turn on if positive, otherwise off.
Returns non-nil if the new state is enabled."
:global t
:group 'minibuffer
(if minibuffer-electric-default-mode
(add-hook 'minibuffer-setup-hook 'minibuf-eldef-setup-minibuffer)
(remove-hook 'minibuffer-setup-hook 'minibuf-eldef-setup-minibuffer)
(dolist (minibuf minibuf-eldef-frobbed-minibufs)
(with-current-buffer minibuf
(remove-hook 'post-command-hook #'minibuf-eldef-update-minibuffer t)))
(setq minibuf-eldef-frobbed-minibufs nil)))
(provide 'minibuf-eldef)