Update icicles
[emacs.git] / .emacs.d / elisp / icicle / icicles-mode.el
index 1323a69..084a3c7 100644 (file)
@@ -4,16 +4,16 @@
 ;; Description: Icicle Mode definition for Icicles
 ;; Author: Drew Adams
 ;; Maintainer: Drew Adams (concat "drew.adams" "@" "oracle" ".com")
-;; Copyright (C) 1996-2014, Drew Adams, all rights reserved.
+;; Copyright (C) 1996-2015, Drew Adams, all rights reserved.
 ;; Created: Mon Feb 27 10:21:10 2006
-;; Last-Updated: Wed Apr 23 10:56:06 2014 (-0700)
+;; Last-Updated: Thu Jan  1 10:56:08 2015 (-0800)
 ;;           By: dradams
-;;     Update #: 10194
+;;     Update #: 10251
 ;; URL: http://www.emacswiki.org/icicles-mode.el
 ;; Doc URL: http://www.emacswiki.org/Icicles
 ;; Keywords: internal, extensions, help, abbrev, local, minibuffer,
 ;;           keys, apropos, completion, matching, regexp, command
-;; Compatibility: GNU Emacs: 20.x, 21.x, 22.x, 23.x, 24.x
+;; Compatibility: GNU Emacs: 20.x, 21.x, 22.x, 23.x, 24.x, 25.x
 ;;
 ;; Features that might be required by this library:
 ;;
 ;;   `cus-load', `cus-start', `cus-theme', `dired', `dired+',
 ;;   `dired-aux', `dired-x', `doremi', `easymenu', `el-swank-fuzzy',
 ;;   `ffap', `ffap-', `fit-frame', `frame-cmds', `frame-fns',
-;;   `fuzzy', `fuzzy-match', `help+20', `hexrgb', `icicles-cmd1',
-;;   `icicles-cmd2', `icicles-fn', `icicles-mcmd', `icicles-opt',
-;;   `icicles-var', `image-dired', `info', `info+', `kmacro',
-;;   `levenshtein', `menu-bar', `menu-bar+', `misc-cmds', `misc-fns',
-;;   `mouse3', `mwheel', `naked', `pp', `pp+', `regexp-opt', `ring',
+;;   `fuzzy', `fuzzy-match', `help+20', `hexrgb', `highlight',
+;;   `icicles-cmd1', `icicles-cmd2', `icicles-fn', `icicles-mcmd',
+;;   `icicles-opt', `icicles-var', `image-dired', `image-file',
+;;   `info', `info+20', `kmacro', `levenshtein', `menu-bar',
+;;   `menu-bar+', `misc-cmds', `misc-fns', `mouse3', `mwheel',
+;;   `naked', `package', `pp', `pp+', `regexp-opt', `ring',
 ;;   `second-sel', `strings', `subr-21', `thingatpt', `thingatpt+',
 ;;   `unaccent', `w32-browser', `w32browser-dlgopen', `wid-edit',
 ;;   `wid-edit+', `widget'.
@@ -49,7 +50,7 @@
 ;;    `icicle-ORIG-comint-dynamic-complete',
 ;;    `icicle-ORIG-comint-dynamic-complete-filename',
 ;;    `icicle-ORIG-comint-replace-by-expanded-filename',
-;;    `icicle-ORIG-dired-read-shell-command',
+;;    `icicle-ORIG-complete', `icicle-ORIG-dired-read-shell-command',
 ;;    `icicle-ORIG-ess-complete-object-name',
 ;;    `icicle-ORIG-gud-gdb-complete-command',
 ;;    `icicle-ORIG-read-file-name', `icicle-ORIG-read-shell-command',
@@ -66,8 +67,9 @@
 ;;    `icicle-bind-other-keymap-keys',
 ;;    `icicle-cancel-Help-redirection', `icicle-define-cycling-keys',
 ;;    `icicle-define-icicle-maps', `icicle-define-minibuffer-maps',
-;;    `icicle-minibuffer-setup', `icicle-rebind-global',
-;;    `icicle-redefine-standard-functions',
+;;    `icicle-help-line-buffer', `icicle-help-line-file',
+;;    `icicle-last-non-minibuffer-buffer', `icicle-minibuffer-setup',
+;;    `icicle-rebind-global', `icicle-redefine-standard-functions',
 ;;    `icicle-redefine-standard-options',
 ;;    `icicle-redefine-std-completion-fns',
 ;;    `icicle-restore-completion-keys',
@@ -81,6 +83,7 @@
 ;;    `icicle-run-icicle-pre-command-hook',
 ;;    `icicle-select-minibuffer-contents', `icicle-set-calling-cmd',
 ;;    `icicle-show-current-help-in-mode-line',
+;;    `icicle-show-help-in-mode-line', `icicle-show-in-mode-line',
 ;;    `icicle-S-iso-lefttab-to-S-TAB', `icicle-top-level-prep',
 ;;    `icicle-unbind-isearch-keys',
 ;;    `icicle-unbind-key-completion-keys-for-map-var',
@@ -353,15 +356,23 @@ bindings in `*Completions*'.")
         ad-do-it)))
 
   (when (> emacs-major-version 21)
-    (defadvice describe-face (before icicle-respect-WYSIWYG activate)
-      "`read-face-name' respects `icicle-WYSIWYG-Completions-flag'.
-If non-nil, then it does not use `completing-read-multiple' (which
-cannot take advantage of WYSIWYG)."
-      (interactive (list (read-face-name "Describe face" (if (> emacs-major-version 23)
-                                                             (or (face-at-point t)  'default)
-                                                           "= `default' face")
-                                         (not icicle-WYSIWYG-Completions-flag))))))
-
+    (defadvice describe-face (before icicle-WYSIWYG-&-preds activate)
+      "Respect `icicle-WYSIWYG-Completions-flag'.  Provide preds for `M-&'.
+1. If `icicle-WYSIWYG-Completions-flag' is non-nil, then completion
+   does not use `completing-read-multiple' (which cannot take advantage
+   of WYSIWYG).
+2. During completion, `M-&' offers face predicates for narrowing."
+      (interactive
+       (let ((icicle-face-completing-p  t))
+         (list (read-face-name "Describe face" (if (> emacs-major-version 23)
+                                                   (or  (if (and (= emacs-major-version 24)
+                                                                 (< emacs-minor-version 4))
+                                                            (face-at-point)
+                                                          (face-at-point t))
+                                                       'default)
+                                                 "= `default' face")
+                               (not icicle-WYSIWYG-Completions-flag)))))))
+  
   ;; Eval this so that even if the library is byte-compiled with Emacs 20,
   ;; loading it into Emacs 21+ will define variable `icicle-mode'.
   (eval '(define-minor-mode icicle-mode
@@ -386,7 +397,7 @@ Commentary headers of files `icicles-cmd1.el' and `icicles-cmd2.el'."
           (cond (icicle-mode
                  ;; (when (interactive-p)
                  ;;   (unless (or window-system  (and (fboundp 'daemonp)  (daemonp)))
-                 ;;     (with-output-to-temp-buffer "*Attention*"
+                 ;;     (icicle-with-help-window "*Attention*"
                  ;;       (princ "You are using Icicles in a text terminal (no window ")
                  ;;       (princ "system/manager).\n\nIcicles makes use of many keys that are ")
                  ;;      (princ "unavailable when running\nEmacs in a text terminal.  You will ")
@@ -537,7 +548,7 @@ Commentary headers of files `icicles-cmd1.el' and `icicles-cmd2.el'."
     (cond (icicle-mode
            ;; (when (interactive-p)
            ;;   (unless (or window-system  (and (fboundp 'daemonp)  (daemonp)))
-           ;;     (with-output-to-temp-buffer "*Attention*"
+           ;;     (icicle-with-help-window "*Attention*"
            ;;       (princ "You are using Icicles in a text terminal (no window ")
            ;;       (princ "system/manager).\n\nIcicles makes use of many keys that are ")
            ;;       (princ "unavailable when running\nEmacs in a text terminal.  You will ")
@@ -1335,10 +1346,15 @@ Used on `pre-command-hook'."
 
     (define-key icicle-goto-menu-map [icicle-goto-global-marker]
       '(menu-item "+ Global Marker..." icicle-goto-global-marker
-        :enable (consp (icicle-markers global-mark-ring)) :keys "C-- C-x C-SPC"
+        :enable (consp global-mark-ring) :keys "C-- C-x C-SPC"
         :help "Go to a global marker, choosing it by the line that includes it"))
+    (define-key icicle-goto-menu-map [icicle-goto-any-marker]
+      '(menu-item "+ Marker Anywhere..." icicle-goto-any-marker
+        :enable (consp global-mark-ring) ; We do not use this ring, but this is a good test.
+        :keys "C-0 C-SPC"
+        :help "Go to a marker in any buffer, choosing it by the line that includes it"))
     (define-key icicle-goto-menu-map [icicle-goto-marker]
-      '(menu-item "+ Marker..." icicle-goto-marker
+      '(menu-item "+ Marker in This Buffer..." icicle-goto-marker
         :enable (mark t) :keys "C-- C-SPC"
         :help "Go to a marker in this buffer, choosing it by the line that includes it"))
     (define-key icicle-goto-menu-map [icicle-select-bookmarked-region]
@@ -2285,8 +2301,7 @@ Used on `pre-command-hook'."
     (define-key ielm-map (icicle-kbd "C-i") 'icicle-comint-dynamic-complete))
 
   ;; Bind keys in Tcl mode.
-  (when (and (boundp 'inferior-tcl-mode-map)  (memq 'comint-dynamic-complete
-                                                    icicle-functions-to-redefine))
+  (when (and (boundp 'inferior-tcl-mode-map)  (memq 'comint-dynamic-complete icicle-functions-to-redefine))
     (define-key inferior-tcl-mode-map (icicle-kbd "C-i") 'icicle-comint-dynamic-complete))
 
   ;; Bind keys in GUD (Debugger) mode.
@@ -2473,20 +2488,17 @@ is bound in all keymaps accessible from keymap MAP."
     (define-key 'facemenu-keymap "I" nil)) ; `M-o I'
 
   ;; Unbind keys in Shell mode.
-  (when (and (boundp 'shell-mode-map)  (memq 'icicle-comint-dynamic-complete
-                                             icicle-functions-to-redefine))
+  (when (and (boundp 'shell-mode-map)  (memq 'icicle-comint-dynamic-complete icicle-functions-to-redefine))
     (define-key shell-mode-map (icicle-kbd "C-i") (if (> emacs-major-version 23)
                                                       'completion-at-point
                                                     'comint-dynamic-complete)))
 
   ;; Unbind keys in Shell Script mode.
-  (when (and (boundp 'sh-mode-map)  (memq 'icicle-comint-dynamic-complete
-                                          icicle-functions-to-redefine))
+  (when (and (boundp 'sh-mode-map)  (memq 'icicle-comint-dynamic-complete icicle-functions-to-redefine))
     (icicle-unmap 'comint-dynamic-complete sh-mode-map 'icicle-comint-dynamic-complete))
 
   ;; Unbind keys in Ielm mode.
-  (when (and (boundp 'ielm-map)  (memq 'icicle-comint-dynamic-complete
-                                       icicle-functions-to-redefine))
+  (when (and (boundp 'ielm-map)  (memq 'icicle-comint-dynamic-complete icicle-functions-to-redefine))
     (define-key ielm-map (icicle-kbd "C-i") 'comint-dynamic-complete))
 
   ;; Unbind keys in Tcl mode.
@@ -2623,8 +2635,8 @@ is unbound in all keymaps accessible from keymap MAP."
 
        (when (fboundp 'icicle-complete-keys)
          (define-key map [menu-bar minibuf icicle-complete-keys]
-             '(menu-item "Show Available Keys (Complete Key)" icicle-complete-keys
-               :help "Show available keys (`C-g') or complete prefix key")))
+           '(menu-item "Show Available Keys (Complete Key)" icicle-complete-keys
+             :help "Show available keys (`C-g') or complete prefix key")))
        (define-key map [menu-bar minibuf completion-help]
          '(menu-item "Icicles Help" icicle-minibuffer-help
            :help "Display help for minibuffer input and completion" :keys "M-?"))
@@ -2652,13 +2664,13 @@ is unbound in all keymaps accessible from keymap MAP."
        (define-key map [menu-bar minibuf history]
          (list 'menu-item "History" icicle-minibuf-history-menu-map))
 
-         ;; Keyboard keys
+       ;; Keyboard keys
        (icicle-bind-custom-minibuffer-keys map icicle-minibuffer-key-bindings)
        (define-key map (icicle-kbd "C-g")  'icicle-abort-recursive-edit) ; `C-g'
        (dolist (key  icicle-completing-read+insert-keys)
-         (define-key map key 'icicle-completing-read+insert))            ; `C-M-S-c'
+         (define-key map key 'icicle-completing-read+insert)) ; `C-M-S-c'
        (dolist (key  icicle-read+insert-file-name-keys)
-         (define-key map key 'icicle-read+insert-file-name))             ; `C-M-S-f'
+         (define-key map key 'icicle-read+insert-file-name)) ; `C-M-S-f'
        )                                ; End `minibuffer-local-map'.
 
      ;; `minibuffer-local-ns-map': default minibuffer map when spaces are not allowed.
@@ -2679,8 +2691,8 @@ is unbound in all keymaps accessible from keymap MAP."
 
          (when (fboundp 'icicle-complete-keys)
            (define-key map [menu-bar minibuf icicle-complete-keys]
-               '(menu-item "Show Available Keys (Complete Key)" icicle-complete-keys
-                 :help "Show available keys (`C-g') or complete prefix key")))
+             '(menu-item "Show Available Keys (Complete Key)" icicle-complete-keys
+               :help "Show available keys (`C-g') or complete prefix key")))
          (define-key map [menu-bar minibuf completion-help]
            '(menu-item "Icicles Help" icicle-minibuffer-help
              :help "Display help for minibuffer input and completion" :keys "M-?"))
@@ -2712,9 +2724,9 @@ is unbound in all keymaps accessible from keymap MAP."
          (icicle-bind-custom-minibuffer-keys map icicle-minibuffer-key-bindings)
          (define-key map (icicle-kbd "C-g") 'icicle-abort-recursive-edit) ; `C-g'
          (dolist (key  icicle-completing-read+insert-keys)
-           (define-key map key 'icicle-completing-read+insert))           ; `C-M-S-c'
+           (define-key map key 'icicle-completing-read+insert)) ; `C-M-S-c'
          (dolist (key  icicle-read+insert-file-name-keys)
-           (define-key map key 'icicle-read+insert-file-name))            ; `C-M-S-f'
+           (define-key map key 'icicle-read+insert-file-name)) ; `C-M-S-f'
          ))                             ; End `minibuffer-local-ns-map'.
 
      ;; `minibuffer-local-isearch-map': minibuffer map for editing isearch strings.
@@ -2736,8 +2748,8 @@ is unbound in all keymaps accessible from keymap MAP."
 
          (when (fboundp 'icicle-complete-keys)
            (define-key map [menu-bar minibuf icicle-complete-keys]
-               '(menu-item "Show Available Keys (Complete Key)" icicle-complete-keys
-                 :help "Show available keys (`C-g') or complete prefix key")))
+             '(menu-item "Show Available Keys (Complete Key)" icicle-complete-keys
+               :help "Show available keys (`C-g') or complete prefix key")))
          (define-key map [menu-bar minibuf completion-help]
            '(menu-item "Icicles Help" icicle-minibuffer-help
              :help "Display help for minibuffer input and completion" :keys "M-?"))
@@ -2769,9 +2781,9 @@ is unbound in all keymaps accessible from keymap MAP."
          (icicle-bind-custom-minibuffer-keys map icicle-minibuffer-key-bindings)
          (define-key map (icicle-kbd "C-g") 'icicle-abort-recursive-edit) ; `C-g'
          (dolist (key  icicle-completing-read+insert-keys)
-           (define-key map key 'icicle-completing-read+insert))           ; `C-M-S-c'
+           (define-key map key 'icicle-completing-read+insert)) ; `C-M-S-c'
          (dolist (key  icicle-read+insert-file-name-keys)
-           (define-key map key 'icicle-read+insert-file-name))            ; `C-M-S-f'
+           (define-key map key 'icicle-read+insert-file-name)) ; `C-M-S-f'
          ))                             ; End `minibuffer-local-isearch-map'.
 
      ;; `minibuffer-local-completion-map': completion map.
@@ -2787,9 +2799,9 @@ is unbound in all keymaps accessible from keymap MAP."
          ;; Need `C-g' anyway, even if `minibuffer-local-must-match-map' inherits completion map.
          (define-key map (icicle-kbd "C-g") 'icicle-abort-recursive-edit) ; `C-g'
          (dolist (key  icicle-completing-read+insert-keys)
-           (define-key map key 'icicle-completing-read+insert))           ; `C-M-S-c'
+           (define-key map key 'icicle-completing-read+insert)) ; `C-M-S-c'
          (dolist (key  icicle-read+insert-file-name-keys)
-           (define-key map key 'icicle-read+insert-file-name))            ; `C-M-S-f'
+           (define-key map key 'icicle-read+insert-file-name)) ; `C-M-S-f'
          ))                             ; End `minibuffer-local-must-match-map'.
 
      ;; `completion-list-mode-map': map for `*Completions*' buffer.
@@ -2798,9 +2810,9 @@ is unbound in all keymaps accessible from keymap MAP."
        ;; Keyboard keys
        (icicle-bind-custom-minibuffer-keys map icicle-completion-list-key-bindings)
        (dolist (key  icicle-candidate-help-keys) ; `C-M-return', `C-help', `C-M-help', `C-f1',
-         (define-key map key 'icicle-help-on-candidate))                     ; `C-M-f1'
+         (define-key map key 'icicle-help-on-candidate)) ; `C-M-f1'
        (define-key map (icicle-kbd "C-g")      'icicle-abort-recursive-edit) ; `C-g'
-       (define-key map (icicle-kbd "C-M-S-t")  'icicle-top-level)            ; `C-M-S-t' (aka `C-M-T')
+       (define-key map (icicle-kbd "C-M-S-t")  'icicle-top-level) ; `C-M-S-t' (aka `C-M-T')
        ))                               ; End `completion-list-mode-map'.
 
     (t                                  ; TURN IT OFF *******************************
@@ -3353,10 +3365,15 @@ Usually run by inclusion in `minibuffer-setup-hook'."
           icicle-saved-proxy-candidates          nil
           icicle-auto-no-icomplete-mode-p        nil
           icicle-auto-no-sort-p                  nil
-          ;; `other-buffer' doesn't work, because it looks for a buffer only from the same frame.
-          icicle-pre-minibuffer-buffer           (cadr (buffer-list)) ; $$$$$$ (other-buffer nil t)
+          ;; Neither of these is OK:
+          ;;  `other-buffer' doesn't work, because it looks for a buffer only from the same frame.
+          ;;  And cadr of `buffer-list' could be just a higher-level minibuffer.
+          ;;    icicle-pre-minibuffer-buffer  (other-buffer nil t)
+          ;;    icicle-pre-minibuffer-buffer  (cadr (buffer-list)
+          icicle-pre-minibuffer-buffer           (icicle-last-non-minibuffer-buffer)
           )
-    (when (and (icicle-completing-p)  (> emacs-major-version 20))
+    (when (and (icicle-completing-p)    ; Function initializes variable `icicle-completing-p'.
+               (> emacs-major-version 20))
       (let ((prompt-prefix  (if icicle-candidate-action-fn "+ " ". ")))
         (put-text-property 0 1 'face
                            (cond ((and icicle-candidate-action-fn  (icicle-require-match-p))
@@ -3381,14 +3398,21 @@ Usually run by inclusion in `minibuffer-setup-hook'."
     (when (memq icicle-default-value '(preselect-start preselect-end))
       (icicle-select-minibuffer-contents))
     (when (and icicle-show-Completions-initially-flag
-               (not icicle-progressive-completing-p) ; If narrowed, then we have already completed.
-               (icicle-completing-p)    ; Function initializes variable `icicle-completing-p'.
+               ;; $$$$$$$$ (not icicle-progressive-completing-p) ; If narrowed, we have already completed.
+               icicle-completing-p      ; Var already initialized, above.
                (sit-for icicle-incremental-completion-delay)) ; Let user interrupt.
       (case icicle-default-cycling-mode
         (apropos    (icicle-apropos-complete))
         (otherwise  (icicle-prefix-complete)))) ; Prefix completion, by default.
     (run-hooks 'icicle-minibuffer-setup-hook)))
 
+(defun icicle-last-non-minibuffer-buffer ()
+  "Return the most recently used non-minibuffer buffer."
+  (if (fboundp 'minibufferp)            ; Emacs 22+
+      (let ((bufs  (icicle-remove-if 'minibufferp (buffer-list))))
+        (or (car bufs)  (car (buffer-list))))
+    (cadr (buffer-list))))              ; Punt - but could be just a higher-level minibuffer.
+
 (defun icicle-define-cycling-keys (map)
   "Define keys for cycling candidates.
 The modal keys are defined first, then the non-modal keys.
@@ -3545,6 +3569,146 @@ if `icicle-change-region-background-flag' is non-nil."
   "Show `icicle-mode-line-help'.  Used in `icicle-post-command-hook'."
   (when icicle-mode-line-help (icicle-show-help-in-mode-line icicle-mode-line-help)))
 
+;; Note: Property `icicle-mode-line-help' with a function value is not used yet in Icicles code.
+(defun icicle-show-help-in-mode-line (candidate)
+  "If short help for CANDIDATE is available, show it in the mode-line.
+Do this only if `icicle-help-in-mode-line-delay' is positive and the
+last command was not one that exits the minibuffer.
+
+For a string or symbol CANDIDATE: Use the help from property
+`icicle-mode-line-help', if that is non-nil, or the help from
+property `help-echo' if that is non-nil.  For a string CANDIDATE,
+check only the first char for the property.
+
+The value of property `icicle-mode-line-help' can be a string or a
+function.  If a string, use that as the help.  If a function, apply
+the function to the candidate and use the result as the help."
+  (when (and (> icicle-help-in-mode-line-delay 0)
+             (not (memq last-command '(exit-minibuffer minibuffer-complete-and-exit))))
+    (let* ((cand       (cond (;; Call to `lacarte-execute(-menu)-command' (in `lacarte.el').
+                              ;; Use command associated with menu item.
+                              (consp lacarte-menu-items-alist)
+                              (cdr (assoc candidate lacarte-menu-items-alist)))
+                             (;; Key-completion candidate.  Get command from candidate.
+                              icicle-completing-keys-p
+                              (if (string= ".." candidate)
+                                  "GO UP"
+                                (let ((cmd-name  (save-match-data
+                                                   (string-match "\\(.+\\)  =  \\(.+\\)" candidate)
+                                                   (substring candidate (match-beginning 2)
+                                                              (match-end 2)))))
+                                  (if (string= "..." cmd-name) "Prefix key" (intern-soft cmd-name)))))
+                             (;; Buffer or file name.
+                              (or (get-buffer candidate)
+                                  (icicle-file-name-input-p)
+                                  icicle-abs-file-candidates)
+                              (icicle-transform-multi-completion candidate))
+                             (t         ; Convert to symbol or nil.
+                              (intern-soft (icicle-transform-multi-completion candidate)))))
+           (doc        (progn (when (stringp candidate)
+                                (setq candidate  (icicle-transform-multi-completion candidate)))
+                              (cond ((and (stringp candidate) ; String with help as property.
+                                          (let ((prop  (or (get-text-property 0 'icicle-mode-line-help
+                                                                              candidate)
+                                                           (get-text-property 0 'help-echo candidate))))
+                                            (and prop
+                                                 (icicle-propertize
+                                                  (if (functionp prop) (funcall prop candidate) prop)
+                                                  'face 'icicle-mode-line-help)))))
+                                    ((and cand
+                                          (symbolp cand) ; Symbol.
+                                          (let ((doc2
+                                                 (cond ((get cand 'icicle-mode-line-help)) ; Icicles help prop.
+                                                       ((get cand 'help-echo)) ; General help prop.
+                                                       ((fboundp cand) ; Function.
+                                                        (or (documentation cand t) ; Functon's doc string.
+                                                            (if (string-match ; Easy-menu item.
+                                                                 "^menu-function-[0-9]+$" (symbol-name cand))
+                                                                (format "%s" (symbol-function cand))
+                                                              (format "Command `%s'" cand))))
+                                                       ((facep cand) (face-documentation cand)) ; Face.
+                                                       (t (documentation-property ; Variable.
+                                                           cand 'variable-documentation t)))))
+                                            (and doc2
+                                                 (icicle-propertize doc2  'face 'icicle-mode-line-help)))))
+                                    ((and (consp cand)  (eq (car cand) 'lambda)) ; Lambda form.
+                                     (icicle-propertize (format "%s" cand) 'face 'icicle-mode-line-help))
+                                    ((and (stringp cand) ; Prefix key, `..'.
+                                          (member cand '("Prefix key" "GO UP")))
+                                     (icicle-propertize cand 'face 'icicle-mode-line-help))
+                                    ((stringp candidate) ; String without help property.
+                                     (cond ((and (or (icicle-file-name-input-p) ; File name.
+                                                     icicle-abs-file-candidates)
+                                                 (or (icicle-file-remote-p candidate) ; Avoid Tramp.
+                                                     (file-exists-p candidate)))
+                                            (if (get-file-buffer candidate)
+                                                (concat (icicle-help-line-buffer (get-file-buffer candidate)
+                                                                                 'NO-BYTES-P
+                                                                                 'NO-FILE-P)
+                                                        " "
+                                                        (icicle-help-line-file cand))
+                                              (icicle-help-line-file candidate)))
+                                           ((get-buffer candidate) ; Non-file buffer.
+                                            (icicle-help-line-buffer candidate))
+                                           (t nil)))))) ; Punt.
+           (doc-line1  (and (stringp doc)  (string-match ".+$" doc)  (match-string 0 doc))))
+      (when doc-line1
+        (icicle-show-in-mode-line
+         doc-line1
+         (cond ((get-buffer-window "*Completions*" 'visible) "*Completions*")
+               ((eq (current-buffer) (window-buffer (minibuffer-window))) (cadr (buffer-list)))
+               (t (current-buffer))))))))
+
+(defun icicle-show-in-mode-line (text &optional buffer)
+  "Display TEXT in BUFFER's mode line.
+The text is shown for `icicle-help-in-mode-line-delay' seconds, or
+until a user event.  So call this last in a sequence of user-visible
+actions."
+  (message nil)                         ; Remove any msg, such as "Computing completion candidates...".
+  (with-current-buffer (or buffer  (current-buffer))
+    (make-local-variable 'mode-line-format) ; Needed for Emacs 21+.
+    (let ((mode-line-format  text))  (force-mode-line-update) (sit-for icicle-help-in-mode-line-delay))
+    (force-mode-line-update)))
+
+(defun icicle-help-line-buffer (buffer &optional no-bytes-p no-file-p)
+  "Simple help string for BUFFER.
+Non-nil NO-BYTES-P means do not include the number of bytes.
+Non-nil NO-FILE-P means do not include the buffer's file name."
+  (with-current-buffer buffer
+    (let* ((mode   (format "Mode: %s"
+                           (icicle-propertize
+                            (if (fboundp 'format-mode-line) (format-mode-line mode-name) mode-name)
+                            'face 'icicle-mode-line-help)))
+           (bytes  (format "Bytes: %s"
+                           (icicle-propertize (let ((size  (buffer-size)))
+                                                (if (> size most-positive-fixnum)
+                                                    (format "> %d" most-positive-fixnum)
+                                                  size))
+                                              'face 'icicle-mode-line-help)))
+           (file   (or (buffer-file-name)
+                       (and (eq major-mode 'dired-mode)  default-directory))))
+      (cond ((and no-bytes-p  no-file-p)  mode)
+            ((or no-file-p  (not file))   (concat mode ", " bytes))
+            (t
+             (setq file  (format "File: %s" (icicle-propertize (icicle-abbreviate-or-expand-file-name file)
+                                                               'face 'icicle-mode-line-help)))
+             (if no-bytes-p (concat mode ", " file) (concat mode ", " bytes ", " file)))))))
+
+(defun icicle-help-line-file (file)
+  "Simple help string for FILE."
+  (let ((attrs  (file-attributes file)))
+    (and attrs  (format "Bytes: %s, Saved: %s, Access: %s, Perm: %s"
+                        (let ((size  (nth 7 attrs)))
+                          (icicle-propertize (if (> size most-positive-fixnum)
+                                                 (format "> %d" most-positive-fixnum)
+                                               size)
+                                             'face 'icicle-mode-line-help))
+                        (icicle-propertize (format-time-string  "%c" (nth 5 attrs)) ; "%Y-%m-%d %H"
+                                           'face 'icicle-mode-line-help)
+                        (icicle-propertize (format-time-string  "%c" (nth 4 attrs)) ; "%Y-%m-%d %H"
+                                           'face 'icicle-mode-line-help)
+                        (icicle-propertize (nth 8 attrs) 'face 'icicle-mode-line-help)))))
+
 (defun icicle-redefine-standard-functions ()
   "Alias the functions in `icicle-functions-to-redefine' to Icicles versions."
   (when (fboundp 'icicle-completing-read)
@@ -3774,14 +3938,21 @@ if `icicle-change-region-background-flag' is non-nil."
 ;;; `bbdb-com.el' version 3.02 and later - `bbdb-complete-mail'.
 (let ((form  '(let ((icyp  (and (boundp 'icicle-mode)  icicle-mode)))
                (when icyp (icicle-mode -1))
-               (when (and (fboundp 'bbdb-complete-mail)
-                          (not (fboundp 'icicle-ORIG-bbdb-complete-mail)))
+               (when (and (fboundp 'bbdb-complete-mail)  (not (fboundp 'icicle-ORIG-bbdb-complete-mail)))
                  (fset 'icicle-ORIG-bbdb-complete-mail (symbol-function 'bbdb-complete-mail)))
                (when icyp (icicle-mode 1)))))
   (if (and (featurep 'bbdb-com)  (fboundp 'bbdb-complete-mail))
       (eval-after-load "icicles-mode" form)
     (eval-after-load "bbdb-com" form)))
 
+;;; `complete.el' - `complete'.
+(let ((form  '(let ((icyp  (and (boundp 'icicle-mode)  icicle-mode)))
+               (when icyp (icicle-mode -1))
+               (when (and (fboundp 'complete)  (not (fboundp 'icicle-ORIG-complete)))
+                 (fset 'icicle-ORIG-complete (symbol-function 'complete)))
+               (when icyp (icicle-mode 1)))))
+  (if (featurep 'completion) (eval-after-load "icicles-mode" form) (eval-after-load "completion" form)))
+
 ;;; `dired-aux.el' - `dired-read-shell-command'.
 (let ((form  '(let ((icyp  (and (boundp 'icicle-mode)  icicle-mode)))
                (when icyp (icicle-mode -1))