Update icicles
authorJoerg Jaspert <joerg@debian.org>
Sun, 15 Feb 2015 22:26:35 +0000 (23:26 +0100)
committerJoerg Jaspert <joerg@debian.org>
Sun, 15 Feb 2015 22:26:35 +0000 (23:26 +0100)
15 files changed:
.emacs.d/elisp/icicle/icicles-autoloads.el
.emacs.d/elisp/icicle/icicles-chg.el
.emacs.d/elisp/icicle/icicles-cmd1.el
.emacs.d/elisp/icicle/icicles-cmd2.el
.emacs.d/elisp/icicle/icicles-doc1.el
.emacs.d/elisp/icicle/icicles-doc2.el
.emacs.d/elisp/icicle/icicles-face.el
.emacs.d/elisp/icicle/icicles-fn.el
.emacs.d/elisp/icicle/icicles-mac.el
.emacs.d/elisp/icicle/icicles-mcmd.el
.emacs.d/elisp/icicle/icicles-mode.el
.emacs.d/elisp/icicle/icicles-opt.el
.emacs.d/elisp/icicle/icicles-pkg.el
.emacs.d/elisp/icicle/icicles-var.el
.emacs.d/elisp/icicle/icicles.el

index e1f5caf..bb9b7e2 100644 (file)
@@ -3,22 +3,23 @@
 ;;; Code:
 (add-to-list 'load-path (or (file-name-directory #$) (car load-path)))
 \f
-;;;### (autoloads nil "icicles" "icicles.el" (21360 34997 0 0))
+;;;### (autoloads nil "icicles" "icicles.el" (21728 41268 575536
+;;;;;;  178000))
 ;;; Generated autoloads from icicles.el
  (autoload 'icy-mode    "icicles" "Toggle Icicle mode - see `icicle-mode'." t nil)
- (autoload 'icicle-mode "icicles" 
+ (autoload 'icicle-mode "icicles"
 "Icicle mode: Toggle minibuffer input completion and cycling.
  Non-nil prefix ARG turns mode on if ARG > 0, else turns it off.
  Icicle mode is a global minor mode.  It binds keys in the minibuffer.
- \ 
+ \
  For more information, use `\\<minibuffer-local-completion-map>\\[icicle-minibuffer-help]' \
  when the minibuffer is active.
- \ 
+ \
  Depending on your platform, if you use Icicles in a text terminal
  \(that is, without a window system/manager), you might need to change
  some of the key bindings if some of the default bindings are not
  available to you.
- \ 
+ \
  Icicle mode defines many top-level commands.  For a list, see the
  Commentary headers of files `icicles-cmd1.el' and `icicles-cmd2.el'."
  t nil)
@@ -28,7 +29,7 @@
 ;;;### (autoloads nil nil ("icicles-chg.el" "icicles-cmd1.el" "icicles-cmd2.el"
 ;;;;;;  "icicles-doc1.el" "icicles-doc2.el" "icicles-face.el" "icicles-fn.el"
 ;;;;;;  "icicles-mac.el" "icicles-mcmd.el" "icicles-mode.el" "icicles-opt.el"
-;;;;;;  "icicles-pkg.el" "icicles-var.el") (21360 34997 695906 997000))
+;;;;;;  "icicles-pkg.el" "icicles-var.el") (21728 41269 252628 217000))
 
 ;;;***
 \f
index 08d6048..a77ae12 100644 (file)
@@ -4,16 +4,16 @@
 ;; Description: Change logs for Icicles libraries.
 ;; Author: Drew Adams
 ;; Maintainer: Drew Adams (concat "drew.adams" "@" "oracle" ".com")
-;; Copyright (C) 2007-2014, Drew Adams, all rights reserved.
+;; Copyright (C) 2007-2015, Drew Adams, all rights reserved.
 ;; Created: Tue Nov 27 07:47:53 2007
-;; Last-Updated: Sun May 11 12:50:46 2014 (-0700)
+;; Last-Updated: Sun Feb  8 09:10:13 2015 (-0800)
 ;;           By: dradams
-;;     Update #: 10896
+;;     Update #: 11394
 ;; URL: http://www.emacswiki.org/icicles-chg.el
 ;; Doc URL: http://www.emacswiki.org/Icicles
 ;; Keywords: 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:
 ;;
  
 ;;;(@* "CHANGE LOG FOR `icicles-cmd1.el'")
 ;;
+;; 2015/02/08 dadams
+;;     icicle-bookmark-set: Soft-require Bookmark+ - don't test with featurep.
+;;                          Do not overwrite properties listed in option bmkp-properties-to-keep.
+;; 2014/12/15 dadams
+;;     Added: icicle-bookmark(-local|-remote)-non-dir-file(-other-window).
+;;     Added (commented out - not used yet): icicle-bookmark-non-dir-file-narrow.
+;; 2014/11/22 dadams
+;;     icicle-buffer-multi-complete: Do not prepend ^ if TAB completion method is not basic.
+;; 2014/10/26 dadams
+;;     For Emacs 25+: defalias icicle-ORIG-elisp-completion-at-point to elisp-completion-at-point.
+;; 2014/08/22 dadams
+;;     icicle-file-of-content-apropos-complete-match: Update icicle-new-bufs-to-kill before searching.
+;;     icicle-bookmark-jump-1: Better error if input BOOKMARK does not name an existing bookmark.
+;; 2014/08/21 dadams
+;;     Added: icicle-bookmark-annotated-narrow.
+;;     icicle-bookmark-bind-narrow-commands: Bind icicle-bookmark-annotated-narrow.
+;; 2014/08/19 dadams
+;;     Added: icicle-bookmark-(dired-this-dir|dired-wildcards|navlist)-narrow.
+;;     icicle-bookmark: Updated doc string for narrowing keys and to mention M-&.
+;;     icicle-bookmark-bind-narrow-commands:
+;;       Bind icicle-bookmark-*-narrow, for *:
+;;         dired-(this-dir|wildcards)|function|icicle-search-hits|lighted|marked|modified|navlist|
+;;         orphaned(-local|-remote)-file|sequence|snippet|tagged|variable-list
+;;     icicle-bookmark-*-narrow: Use named predicates now, instead of lambdas.
+;;     icicle-bookmark-url-narrow: Handle either kind of URL bookmark.
+;;     icicle-bookmarked-(buffer|file)-list: Added optional arg MSGP.
+;; 2014/08/16 dadams
+;;     icicle-customize-face(-other-window), icicle-face-list, icicle-customize-apropos-faces:
+;;       Bind icicle-face-completing-p.
+;;     icicle-customize-apropos: string-match -> icicle-string-match-p.
+;;                               Bug fix: 1st arg to icicle-string-matchp: if, not and.
+;; 2014/08/10 dadams
+;;     Moved to icicles-fn.el (and modified): icicle-binary-option-p.
+;;     icicle-apropos-variable: Bind icicle-variable-completing-p.
+;;     icicle-bookmark(-other-window), icicle-bookmark-list: Bind icicle-bookmark-completing-p.
+;;     icicle-apropos-variable: Bind icicle-variable-completing-p.
+;; 2014/08/06 dadams
+;;     icicle-other-window-or-frame:
+;;        C-u C-u is select win from any frame. C-u C-u C-u also choosed from all frames.
+;;     icicle-select-window: Negative prefix arg means use all frames.
+;;     icicle-choose-window-by-name: Negative prefix arg means use all frames. +/-99: do not select.
+;;     icicle-make-window-alist: ALL-P can have value visible; other non-nil now means use all frames.
+;; 2014/08/04 dadams
+;;     icicle-buffer-multi-complete: Filter with PRED.
+;; 2014/07/28 dadams
+;;     Added new version of icicle-bbdb-complete-mail.  Thx to Alan Schmitt for testing.
+;; 2014/07/14 dadams
+;;     icicle-cd-for-loc-files: Bind enable-recursive-minibuffers.
+;; 2014/06/19 dadams
+;;     icicle-explore: Added note to doc string about binding *-incremental-completion to always.
+;; 2014/06/06 dadams
+;;     Added: icicle-choose-window-for-buffer-display, icicle-choose-window-by-name,
+;;            icicle-read-choose-window-args.
+;;     Advised: display-buffer, switch-to-buffer, switch-to-buffer-other-window.
+;;     icicle-other-window-or-frame: C-u C-u does icicle-choose-window-for-buffer-display (Emacs 24+).
+;;     icicle-select-window-by-name:
+;;       Redefine using icicle-read-choose-window-args and icicle-choose-window-by-name.
+;; 2014/05/17 dadams
+;;     icicle-shell-dynamic-complete-as-command, icicle-apropos-zippy, icicle-describe-process:
+;;       with-output-to-temp-buffer -> icicle-with-help-window.
 ;; 2014/05/09 dadams
 ;;     icicle-repeat-complex-command*: Use trick only for Emacs 24.4+.
 ;; 2014/05/04 dadams
 ;;     Redefine icicle-recent-file(-other-window) as *-of-content* or *-no-search*, per Emacs version.
 ;;     icicle-execute-extended-command-1: Restore SPC to self inserting, for recursive minibuffers.
 ;;     icicle-find-file-abs-of-content: Pass nil as OTHER-WINDOW-P arg to *-find-file-or-expand-dir
-;;     icicle-find-file(-abs)-of-content*:
+;;     icicle-find-file(-abs)-of-content*:
 ;;       1. Do the cleanup also for undo code, not just last code.
 ;;       2. Just kill-buffer, instead of visiting and doing restore-buffer-modified-p first.
 ;; 2013/11/29 dadams
  
 ;;;(@* "CHANGE LOG FOR `icicles-cmd2.el'")
 ;;
+;; 2015/01/11 dadams
+;;     icicle-imenu-1: Bind icicle-remove-icicles-props-p to nil (for property icicle-whole-candidate).
+;; 2014/12/28 dadams
+;;     Require completion.el at compile time.
+;;     icicle-marker+text: Prefix buffer name with line number.
+;;     icicle-imenu-(command|non-interactive-function)(-full): Use icicle-alist-key-match, not assoc.
+;; 2014/11/28 dadams
+;;     Added: icicle-goto-any-marker.
+;;     icicle-goto-marker-or-set-mark-command: C-0 is now icicle-goto-any-marker. 
+;;     icicle-goto-marker-1:
+;;       Handle symbol all as arg.  Pass buffers or symbol global, not rings, to icicle-markers.
+;;       Remove duplicates.
+;;     icicle-marker+text: No-op if MARKER buffer is invalid.
+;;     icicle-markers: Arg is now BUFFERS, not a marker ring: the symbol global or a list of buffers.
+;; 2014/10/19 dadams
+;;     icicle-Info-index: Updated doc string for highlighting of visited nodes.
+;; 2014/10/17 dadams
+;;     icicle-this-command-keys-prefix:
+;;       If in minibuffer, ignore prefix key of icicle-key-complete-keys-for-minibuffer.
+;;     icicle-same-vector-keyseq-p:
+;;       Wrap with (kbd (key-description before comparing, to treat as same: [ESC ...], [27 ...].
+;; 2014/10/15 dadams
+;;     icicle-imenu-1: Add contents of imenu-after-jump-hook to icicle-search-hook.
+;; 2014/09/02 dadams
+;;     icicle-search-replace-match: Temporary (?) fix for braindead Emacs 24.4 regression (bug #18388).
+;; 2014/08/31 dadams
+;;     icicle-search-highlight-and-maybe-replace: Removed code that reset match data to
+;;       icicle-search-regexp when icicle-search-replace-whole-candidate-flag=nil.  IOW, returned to
+;;       fix of 2013-12-10, removing unwise change of 2013-12-26 that treated nil case the same as
+;;       non-nil case.  For nil case, need keep match data for current-input match.
+;; 2014/08/24 dadams
+;;     icicle-search-bookmark, icicle-search-bookmarks-together: Better prompt for context regexp.
+;;     icicle-search-bookmark: Bind icicle-bookmark-completing-p.
+;; 2014/08/23 dadams
+;;     icicle-search-regexp-scan: Add each context number and total number to icicle-mode-line-help.
+;; 2014/08/22 dadams
+;;     icicle-pick-color-by-name(-1): Added optional arg MSGP.  Show message if non-nil.
+;; 2014/08/21 dadams
+;;     Added: icicle-pick-color-by-name-1 - from icicle-pick-color-by-name-action.
+;;     icicle-pick-color-by-name: Bind icicle-list-use-nth-parts.  Use icicle-pick-color-by-name-1.
+;;     icicle-pick-color-by-name-action: If palette is not shown, do not try to redisplay it.
+;;                                       Use icicle-pick-color-by-name-1.
+;;     icicle-color-from-multi-completion-input: Removed bindings of icicle-list-*.
+;;     icicle-bookmark-tagged(-other-window): Bind icicle-bookmark-completing-p.
+;; 2014/08/18 dadams
+;;     icicle-choose-(in)visible-faces: Bind icicle-face-completing-p.
+;; 2014/08/17 dadams
+;;     Added: icicle-color-from-multi-completion-input.
+;;     icicle-read-color: Wrap call to icicle-read-color-WYSIWYG in condition-case.  Removed all of the
+;;                        rest of the code, except check for empty input.
+;;     icicle-read-color-WYSIWYG: Just call icicle-color-from-multi-completion-input, to handle input.
+;;     icicle-pick-color-by-name: Redefined as defun, not using icicle-define-command.
+;;                                Use icicle-read-color.  Bind icicle-color-completing-p.
+;;     icicle-pick-color-by-name-action: Redefined to use icicle-color-from-multi-completion-input.
+;;     Added M-c binding for palette.
+;;     icicle-widget-color-complete: Bind icicle-color-completing.
+;; 2014/08/16 dadams
+;;     Renamed: icicle-read-color-wysiwyg to icicle-read-color-WYSIWYG.
+;;     icicle-read-color-WYSIWYG: Bind icicle-color-completing-p.
+;;     icicle-imenu-1: Fixed bug introduced 2014/06/21: Set REGEXP from SUBMENU.
+;; 2014/08/12 dadams
+;;     Added: icicle-wide-n, icicle-wide-n-action.
+;; 2014/08/10 dadams
+;;     Added: icicle-describe-package.
+;;     Moved to icicles-fn.el (and modified): icicle-defined-thing-p.
+;;     icicle-choose-faces: Bind icicle-face-completing-p.
+;; 2014/08/06 dadams
+;;     icicle-complete-keys, icicle-complete-menu-bar:
+;;       Bind icicle-must-pass-after-match-predicate to nil.  (M-x ESC S-TAB did not complete.)
+;; 2014/07/31 dadams
+;;     icicle-complete-keys-action: Do not use icicle-orig-buff, icicle-orig-window) - not bound.
+;;       See change-log entry for 2014/02/24.  Must have forgotten to finish that change by doing this.
+;; 2014/07/28 dadams
+;;     icicle-complete: Added sort orders.  Bind completion-ignore-case.
+;; 2014/07/27 dadams
+;;     Added: icicle-complete: Icicles version of command complete from completion.el.
+;; 2014/06/21 dadams
+;;     icicle-imenu-1: Handle multiple submenus with the same name (e.g. Functions).
+;; 2014/06/19 dadams
+;;     icicle-apply, icicle-search:
+;;       Added note to doc string about binding *-incremental-completion to always.
+;; 2014/05/17 dadams
+;;     icicle-color-help, icicle-tags-search: with-output-to-temp-buffer -> icicle-with-help-window.
 ;; 2014/05/11 dadams
 ;;     icicle-WYSIWYG-font:
 ;;       Fixed wrt Emacs bug #17457: Do not truncate before calling font-info, and ignore its errors.
 ;;     Use (featurep 'icomplete), not (boundp 'icomplete-mode), everywhere.
 ;; 2014/03/03 dadams
 ;;     icicle-search-xml-element: Try to handle attributes and <ELTNAME/> too.
-;; 2014/03/24 dadams
+;; 2014/02/24 dadams
 ;;     icicle-complete-keys, icicle-complete-menu-bar:
 ;;       Do not bind icicle-orig-buff or icicle-orig-window - they are the minibuffer buf & window.
 ;; 2014/02/07 dadams
 ;;       Wrap body in condition-case, so can tolerate non-error lines as no-op in compilation buffer.
 ;; 2014/01/11 dadams
 ;;     icicle-this-command-keys-prefix:
-;;       Reverted change made 2013-12-01.  S-TAB following any prefix key should complete that key.
+;;       Reverted change made 2013/12/01.  S-TAB following any prefix key should complete that key.
 ;; 2014/01/06 dadams
 ;;     icicle-vardoc, icicle-fundoc, icicle-plist, icicle-doc:
 ;;       Bind icicle--last-toggle-transforming-msg.
 ;;     icicle-cmd2-after-load-highlight:
 ;;       For Emacs < 24, require wid-edit.el before defalias to widget-color-complete.
 ;; 2012/08/12 dadams
-;;     icicle-read-color-WYSIWYG: Convert raw prefix arg `-' to -1.
+;;     icicle-read-color-wysiwyg: Convert raw prefix arg `-' to -1.
 ;; 2012/08/06 dadams
 ;;     Renamed old-* to icicle-ORIG-*:
 ;;       icicle-ORIG-color, icicle-ORIG-read-color, icicle-ORIG-widget-color-complete.
  
 ;;;(@* "CHANGE LOG FOR `icicles-face.el'")
 ;;
+;; 2014/10/19 dadams
+;;     icicle-historical-candidate-other: Updated doc string for icicle-Info-highlight-visited-nodes.
 ;; 2013/07/07 dadams
 ;;     Added: icicle-key-complete-menu, icicle-key-complete-menu-local.
 ;; 2013/02/04 dadams
  
 ;;;(@* "CHANGE LOG FOR `icicles-fn.el'")
 ;;
+;; 2015/02/07 dadams
+;;     icicle-unsorted-file-name-prefix-candidates: For proxy cands and extra cands, use relative name.
+;; 2015/01/21 dadams
+;;     icicle-choose-completion-string (Emacs 23.2+): Delete region even for INSERT-FUNCTION case.
+;; 2015/01/20 dadams
+;;     icicle-choose-completion-string (Emacs 23.2+): Update for Emacs 24+.
+;;       Added arg INSERT-FUNCTION.  Remove mouse-face from copy of CHOICE, before inserting it,
+;;       instead of removing it from buffer text after inserting.
+;;       Delete region up to read-only limits.
+;; 2014/12/23 dadams
+;;     Added: icicle-alist-key-match.
+;; 2014/12/15 dadams
+;;     Added: icicle-bookmark-non-dir-file-p.
+;; 2014/11/15 dadams
+;;     Moved to icicles-mode.el: icicle-help-line-buffer, icicle-help-line-file,
+;;                               icicle-show-help-in-mode-line, icicle-show-in-mode-line.
+;; 2014/11/08 dadams
+;;     icicle-barf-if-*: Use or, not unless, so return non-nil if no error raised.
+;; 2014/10/27 dadams
+;;     icicle-make-char-candidate, icicle-read-char-by-name:
+;;       Respect icicle-read-char-by-name-multi-completion-flag: nothing special if nil.
+;;     icicle-read-char-by-name: Do not override option icicle-show-multi-completion-flag.
+;; 2014/10/19 dadams
+;;     icicle-display-candidates-in-Completions: Moved to icicles-mcmd.el.  It is now a command.
+;;       Highlight Info index-entry cand on demand with C-x C-M-l, or automatically per new option
+;;       icicle-Info-highlight-visited-nodes.
+;; 2014/09/12 dadams
+;;     icicle-display-candidates-in-Completions:
+;;       Handle possibility that image-dired-get-thumbnail-image returns nil, i.e.,  if it cannot
+;;         make/get a thumbnail for the image.
+;;       Handle Emacs 20 crash for expand-file-name with nil second arg.
+;;     icicle-expand-file-name-20: Make arg DIR optional.
+;; 2014/08/29 dadams
+;;     Added: icicle-file-elc-p.
+;; 2014/08/22 dadams
+;;     Added: icicle-file-desktop-p.
+;;     icicle-file-compressed-p: Handle cons argument.
+;; 2014/08/21 dadams
+;;     Added: icicle-bookmark-annotated-p.
+;; 2014/08/19 dadams
+;;     Added: icicle-bookmark-navlist-p.
+;;     Removed (commented out):
+;;       icicle-bookmark-last-specific-(buffer|file)-p, icicle-bookmark-this-file-p (not used yet).
+;;     icicle-bookmark(-autonamed)-this-buffer-p, icicle-bookmark-(dired|file)-this-dir-p:
+;;       Wrap body in with-current-buffer, for ORIG buf.
+;; 2014/08/17 dadams
+;;     Moved to icicles-opt.el: icicle-color-defined-p.
+;; 2014/08/12 dadams
+;;     icicle-special-candidates-first-p: Use icicle-special-candidate-p.
+;; 2014/08/10 dadams
+;;     Added:
+;;       icicle-bookmark-autofile-p, icicle-bookmark-autonamed-p,
+;;       icicle-bookmark-autonamed-this-buffer-p, icicle-bookmark-bookmark-file-p,
+;;       icicle-bookmark-bookmark-list-p, icicle-bookmark-desktop-p, icicle-bookmark-dired-p,
+;;       icicle-bookmark-dired-this-dir-p, icicle-bookmark-dired-wildcards-p, icicle-bookmark-file-p,
+;;       icicle-bookmark-file-this-dir-p, icicle-bookmark-flagged-p, icicle-bookmark-function-p,
+;;       icicle-bookmark-gnus-p, icicle-bookmark-icicle-search-hits-p, icicle-bookmark-image-p,
+;;       icicle-bookmark-info-p, icicle-bookmark-last-specific-buffer-p,
+;;       icicle-bookmark-last-specific-file-p, icicle-bookmark-lighted-p,
+;;       icicle-bookmark-local-directory-p, icicle-bookmark-local-file-p, icicle-bookmark-man-p,
+;;       icicle-bookmark-marked-p, icicle-bookmark-modified-p, icicle-bookmark-non-file-p,
+;;       icicle-bookmark-omitted-p, icicle-bookmark-orphaned-file-p,
+;;       icicle-bookmark-orphaned-local-file-p, icicle-bookmark-orphaned-remote-file-p,
+;;       icicle-bookmark-region-p, icicle-bookmark-remote-file-p, icicle-bookmark-sequence-p,
+;;       icicle-bookmark-snippet-p, icicle-bookmark-tagged-p, icicle-bookmark-temporary-p,
+;;       icicle-bookmark-this-buffer-p, icicle-bookmark-this-file-p, icicle-bookmark-url-p,
+;;       icicle-bookmark-url-browse-p, icicle-bookmark-variable-list-p, icicle-bookmark-w3m-p,
+;;       icicle-buffer-modified-p, icicle-color-defined-p, icicle-color-gray-p,
+;;       icicle-color-supported-p, icicle-compilation-buffer-p, icicle-custom-variable-p,
+;;       icicle-face-bold-p, icicle-face-differs-from-default-p, icicle-face-inverse-video-p,
+;;       icicle-face-italic-p, icicle-face-nontrivial-p, icicle-face-underline-p,
+;;       icicle-ffap-file-remote-p, icicle-ffap-url-p, icicle-file-accessible-directory-p,
+;;       icicle-file-compressed-p, icicle-file-directory-p, icicle-file-executable-p,
+;;       icicle-file-exists-p, icicle-file-locked-p, icicle-file-name-absolute-p,
+;;       icicle-file-regular-p, icicle-file-symlink-p, icicle-frame-iconified-p,
+;;       icicle-frame-invisible-p,  icicle-frame-splittable-p, icicle-frame-thumbnail-p,
+;;       icicle-frame-unsplittable-p, icicle-interesting-buffer-p, icicle-next-error-buffer-p,
+;;       icicle-nondirectory-p, icicle-not-special-candidate-p, icicle-package-built-in-p,
+;;       icicle-package-disabled-p, icicle-package-installed-p, icicle-recentf-include-p,
+;;       icicle-recentf-keep-p, icicle-special-candidate-p, icicle-special-display-p, 
+;;       icicle-special-variable-p, icicle-window-at-bottom-p, icicle-window-at-left-p,
+;;       icicle-window-at-right-p, icicle-window-at-top-p, icicle-window-dedicated-p,
+;;       icicle-window-deletable-p, icicle-window-invisible-p.
+;;     Moved here from icicles-opt.el (and modified): icicle-image-file-p.
+;;     Moved here from icicles-cmd1.el (and modified): icicle-binary-option-p.
+;;     Moved here from icicles-cmd2.el (and modified): icicle-defined-thing-p.
+;;     Renamed: icicle-lisp-vanilla-completing-read to icicle-completing-read-default.
+;;     icicle-completing-read-default: Rewrote based on completing-read-default.  Added opt arg KEYMAP.
+;;     icicle-completing-read: Added optional arg KEYMAP.
+;;     icicle-read-from-minibuffer: When Emacs < 23 and DEFAULT-VALUE is a list, set it to the car.
+;;     Advise read-file-local-variable: Bind icicle-variable-completing-p.
+;;     icicle-file-readable-p, icicle-file-remote-p, icicle-looks-like-dir-name-p:
+;;       Make it work also for a cons (completion) arg.
+;;     icicle-completing-p: Rewrote to just look for a binding of [icicle-is-completion-map].
+;; 2014/07/29 dadams
+;;     icicle-read-file-name: For Emacs 23+ do not bind ffap vars to nil, so get multiple M-n defaults.
+;;       This reverses the change from 2008/02/03.
+;; 2014/05/19 dadams
+;;     icicle-completing-read: Use only first default to prepare for icicle-handle-default-for-prompt.
+;; 2014/05/17 dadams
+;;     icicle-read-shell-command-completing: with-output-to-temp-buffer -> icicle-with-help-window.
+;; 2014/05/16 dadams
+;;     icicle-completing-read, args DEF and INCLUDE passed to icicle-handle-default-for-prompt:
+;;       If insert-default-directory then show DEF as relative to default-directory.
+;;       Pass non-nil INCLUDE only if insert-default-directory does not insert it as input.
 ;; 2014/04/29 dadams
 ;;     Added: icicle-mouseover-help, icicle-create-thumb.
 ;;     icicle-display-candidates-in-Completions: Provide mouseover tooltip image preview.
 ;;       Handle lambdas, menu-function-# from easy-menu, and prefix keys.
 ;;     icicle-make-color-candidate: Construct short help only if user will see it.
 ;; 2009/04/10 dadams
-;;     Added: icicle-candidate-short-help, icicle-color-completion-setup (from i*-read-color).
+;;     Added: icicle-candidate-short-help, icicle-color-completion-setup (from icicle-read-color).
 ;;     Moved here from icicle-cmds.el:
 ;;      icicle-remove-color-duplicates, icicle-color-help, icicle-make-color-candidate.
 ;;     icicle-make-color-candidate: Added short help, using icicle-candidate-short-help.
 ;;       macros needs to be byte-compiled anew after loading the updated macros.
 ;; ****************************************************************************************************
 ;;
+;; 2015/01/21 dadams
+;;     icicle-define-sort-command: Removed extra %s in call to message.
+;; 2014/11/07 dadams
+;;     Added: icicle-with-icy-mode-OFF, icicle-with-icy-mode-ON.
+;; 2014/08/24 dadams
+;;     icicle-define-search-bookmark-command: Better prompt for context regexp.
+;; 2014/08/23 dadams
+;;     icicle-define(-file)-command:
+;;       Hopefully fixed pb introduced on 2013-12-01: lost ici*-*-list return from interactive specs.
+;;       Use icicle-condition-case-no-debug, not unwind-protect.  Put LAST-SEXP inside catch.
+;; 2014/08/22 dadams
+;;     icicle-define(-file)-command: Added unwind-protect, so LAST-SEXP is always evaluated.
+;;                                   (C-g in content-searching was sometimes not killing some buffers.)
+;; 2014/08/10 dadams
+;;     icicle-(buffer|file)-bindings: Bind icicle-(buffer|file)-completing-p.
+;;     icicle-define-bookmark-command-1, icicle-define-search-bookmark-command:
+;;       Bind icicle-multi-completing-p, icicle-bookmark-completing-p.
+;; 2014/05/17 dadams
+;;     Added: icicle-with-help-window.
 ;; 2014/04/28 dadams
-;;     icicle(-file)-define-command: Fix pb introduced 2013-12-01: If icicle-top-level not called...
+;;     icicle-define(-file)-command: Fix pb introduced 2013/12/01: If icicle-top-level not called...
 ;; 2014/04/05 dadams
 ;;     Added: icicle-menu-bar-make-toggle - same as bmkp-menu-bar-make-toggle in bookmark+-mac.el.
 ;; 2014/04/01 dadams
 ;;     icicle-define-bookmark-command-1:
 ;;       Faces icicle-annotation & icicle-msg-emphasis, not file-name-shadow & bookmark-menu-heading.
 ;; 2014/03/08 dadams
-;;     icicle(-file)-define-command:
+;;     icicle-define(-file)-command:
 ;;       Use generated let-var CHOICE for (CMD|FILE)-CHOICE.
 ;;       Handle hiding common match, incremental completion and icomplete mode per command properties.
 ;; 2013/12/01 dadams
  
 ;;;(@* "CHANGE LOG FOR `icicles-mcmd.el'")
 ;;
+;; 2015/01/21 dadams
+;;     icicle-choose-completion (Emacs 23.2+):
+;;       Wrap icicle-choose-completion-string in with-current-buffer, per vanilla.
+;; 2014/12/23 dadams
+;;     icicle-forward-char-magic:
+;;       Narrow & ignore errors.  C-t in empty minibuffer: "Invalid search bound (wrong side of point)"
+;; 2014/10/19 dadams
+;;     icicle-display-candidates-in-Completions: Moved here from icicles-fn.el.
+;; 2014/09/18 dadams
+;;     icicle-mouse-candidate-read-fn-invoke, icicle-Completions-mouse-3-menu:
+;;       Removed unused bindings for POSN-(COLfrom|ROW) from posn-col-row.
+;; 2014/009/10 dadams
+;;     Added: icicle-looking-at-literally-p.
+;;     Renamed: icicle-looking-back-at-p to icicle-looking-back-at-literally-p.
+;;     icicle-backward-delete-char-untabify-magic, icicle-delete-backward-char-magic:
+;;       Use icicle-looking-back-at-literally-p, not icicle-looking-back-at-p.
+;;     icicle-delete-char-magic: Use icicle-looking-at-literally-p, not icicle-looking-at-p.
+;; 2014/08/22 dadams
+;;     icicle-narrow-candidates-with-predicate:
+;;       Must also match current candidates (incorporate M-*).
+;;       Use same code as icicle-narrow-candidates, and just bind icicle-must-pass-predicate, instead
+;;         of setting minibuffer-completion-predicate or read-file-name-predicate.
+;;         So this is no longer the same logic as for icicle-remove-cand-from-lists.
+;;     icicle-narrow-candidates:
+;;       For cons, obarray, etc. case: use ICICLE-CANDS-TO-NARROW, not icicle-completion-candidates.
+;;     icicle-apropos-complete-and-narrow: Added prefix arg, to do predicate narrowing.
+;;     icicle-looking-at-p: Redefined to use defalias or looking-at.
+;; 2014/08/16 dadams
+;;     icicle-narrow-candidates-with-predicate: Bind icicle-must-pass-after-match-predicate to nil.
+;; 2014/08/10 dadams
+;;     Added: icicle-cand-preds (var and fn).
+;;     icicle-narrow-candidates-with-predicate:
+;;       Rewrote to provide completion against predefined predicates (Emacs 24+).
+;;       Added prefix arg, ALLP.
+;; 2014/07/27 dadams
+;;     Updated delete-selection PUT for icicle-self-insert per Emacs 24.4+.
+;; 2014/06/21 dadams
+;;     icicle-candidate-set-retrieve-1: Mention whether added or restored in msg.
+;; 2014/06/07 dadams
+;;     icicle-switch-to/from-minibuffer:
+;;       Test for non icicle-pre-minibuffer-buffer, not for eq minibuf win.
+;;       Call icicle-msg-maybe-in-minibuffer before buffer switch.
+;;       Reduce minibuffer-message-timeout to 1.
+;; 2014/05/17 dadams
+;;     icicle-minibuffer-help, icicle-all-candidates-action-1, icicle-describe-file:
+;;       with-output-to-temp-buffer -> icicle-with-help-window.
+;; 2014/05/14 dadams
+;;     icicle-prefix-complete-1: Bind temp-buffer-window-show-hook to nil also (Emacs 24.4+).
 ;; 2014/04/23 dadams
 ;;     Use cl-flet if available.
 ;;     Typo: icicle-toggle-show-image-file-thumbnail -> icicle-cycle-image-file-thumbnail.
  
 ;;;(@* "CHANGE LOG FOR `icicles-mode.el'")
 ;;
+;; 2014/11/28 dadams
+;;     icicle-define-icicle-maps:
+;;       Added entry for icicle-goto-any-marker.
+;;       Check global-mark-ring for :enable - do not call icicle-markers.
+;;     icicle-show-help-in-mode-line: No-op if last command exited minibuffer.
+;; 2014/11/15 dadams
+;;     Moved here from icicles-fn.el: icicle-help-line-buffer, icicle-help-line-file,
+;;                                    icicle-show-help-in-mode-line, icicle-show-in-mode-line.
+;; 2014/08/23 dadams
+;;     describe-face (advice): face-at-point arity is different for Emacs 24 < 24.4.
+;; 2014/08/10 dadams
+;;     describe-face (advice): Bind icicle-face-completing-p.
+;;     icicle-minibuffer-setup: Do not exclude completing during progressive completion - e.g. for M-&.
+;; 2014/07/27 dadams
+;;     Added icicle-ORIG-complete (original def of command complete from completion.el).
+;; 2014/06/07 dadams
+;;     Added: icicle-last-non-minibuffer-buffer.
+;;     icicle-minibuffer-setup: Use icicle-last-non-minibuffer-buffer for icicle-pre-minibuffer-buffer.
 ;; 2014/04/23 dadams
 ;;     Use cl-flet if available.
 ;; 2014/04/21 dadams
 ;;       Add only (non-mouse command) symbols to history.
 ;;     icy-mode (Emacs 23+):
 ;;       Enable/disable advice icicle-save-to-history when mode is turned on/off.
-;;       Enable the advics only if non-nil icicle-populate-interactive-history-flag.
+;;       Enable the advice only if non-nil icicle-populate-interactive-history-flag.
 ;;     icy-mode (Emacs 20-21): Remove advice icicle-save-to-history.
 ;; 2009/07/26 dadams
 ;;     Advise call-interactively to save command to icicle-interactive-history.
  
 ;;;(@* "CHANGE LOG FOR `icicles-opt.el'")
 ;;
+;; 2014/12/15 dadams
+;;     icicle-cand-preds-for-bookmark: Added icicle-bookmark-non-dir-file-p.
+;; 2014/10/27 dadams
+;;     Added: icicle-read-char-by-name-multi-completion-flag.
+;; 2014/10/26 dadams
+;;     icicle-functions-to-redefine: For Emacs 25+, use elisp-completion-at-point.
+;; 2014/10/19 dadams
+;;     Added: icicle-Info-highlight-visited-nodes (replaces icicle-Info-visited-max-candidates).
+;;     Removed: icicle-Info-visited-max-candidates.
+;;     icicle-completion-key-bindings: Bind icicle-display-candidates-in-Completions to C-x C-M-l.
+;; 2014/10/17 dadams
+;;     icicle-key-complete-keys-for-minibuffer: Added [ESC backtab].
+;; 2014/09/24 dadams
+;;     icicle-custom-themes-update-flag: Added missing :type and :group.
+;; 2014/09/15 dadams
+;;     icicle-top-level-key-bindings: Do not bind icicle-dired* if Dired+ is loaded (it has better).
+;; 2014/08/29 dadams
+;;     icicle-file-skip-functions, icicle-cand-preds-for-file: Added icicle-file-elc-p.
+;; 2014/08/22 dadams
+;;     icicle-cand-preds-for-file: Added icicle-file-desktop-p.
+;; 2014/08/21 dadams
+;;     icicle-cand-preds-for-bookmark: Added icicle-bookmark-annotated-p.
+;; 2014/08/19 dadams
+;;     icicle-cand-preds-for-bookmark: Updated list (removed 3, added 1 today).
+;; 2014/08/17 dadams
+;;     Moved here from icicles-fn.el: icicle-color-defined-p.
+;; 2014/08/11 dadams
+;;     icicle-cand-preds-for-(buffer|file): Added :group for buffers|files.
+;; 2014/08/10 dadams
+;;     Added: icicle-cand-preds-all, icicle-cand-preds-for-bookmark, icicle-cand-preds-for-buffer,
+;;            icicle-cand-preds-for-color, icicle-cand-preds-for-face, icicle-cand-preds-for-file,
+;;            icicle-cand-preds-for-frame, icicle-cand-preds-for-misc, icicle-cand-preds-for-package,
+;;            icicle-cand-preds-for-symbol, icicle-cand-preds-for-variable,
+;;            icicle-cand-preds-for-window.
+;;     Moved icicle-image-file-p to icicles-fn.el.
+;;     icicle-top-level-key-bindings: Added icicle-describe-package.
+;; 2014/07/27 dadams
+;;     Added: icicle-cmpl-include-cdabbrev-flag, icicle-cmpl-max-candidates-to-cycle.
+;;     icicle-functions-to-redefine: Added complete to the list of functions.
+;; 2014/06/21 dadams
+;;     icicle-completion-key-bindings:
+;;       Added bindings for bmkp-(set|retrieve(-more)-icicle-search-hits-bookmark.
+;; 2014/05/16 dadams
+;;     icicle-default-value: Updated doc string for change to t value behavior.
 ;; 2014/04/29 dadams
 ;;     Added: icicle-image-preview-in-tooltip.
 ;; 2014/04/25 dadams
  
 ;;;(@* "CHANGE LOG FOR `icicles-var.el'")
 ;;
+;; 2014/08/10 dadams
+;;     Added: icicle-completion-map-vars.
+;; 2014/08/04 dadams
+;;     icicle-read-expression-map: Typo introduced 2013/12/03: lisp-indent-line, not indent-lisp-line.
+;;                                 Use indent-sexp for Emacs 20-21 (no indent-pp-sexp).
+;; 2014/06/06 dadams
+;;     Added: icicle-next-window-for-display-buffer.
 ;; 2014/04/20 dadams
 ;;     Added: icicle-auto-no-icomplete-mode-p.
 ;;     Moved to icicles-opt.el (which is loaded first):
  
 ;;;(@* "CHANGE LOG FOR `icicles.el'")
 ;;
+;; 2015/01/04 dadams
+;;     Version 2015.01.04.
+;; 2014/08/10 dadams
+;;     New version, 2014.08.09: M-& completes.
+;; 2014/05/17 dadams
+;;     icicle-with-help-window, icicle-with-selected-window: Added to font-lock-keywords.
+;;     icicle-with-help-window: Specified common-lisp-indent-function.
 ;; 2014/04/23 dadams
 ;;     Put common-lisp-indent-function property on cl-flet.
 ;; 2014/04/06 dadams
index 2c51b85..b7013a6 100644 (file)
@@ -4,27 +4,31 @@
 ;; Description: Top-level commands 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 09:25:04 2006
-;; Last-Updated: Fri May  9 09:27:47 2014 (-0700)
+;; Last-Updated: Sun Feb  8 09:08:07 2015 (-0800)
 ;;           By: dradams
-;;     Update #: 26968
+;;     Update #: 27383
 ;; URL: http://www.emacswiki.org/icicles-cmd1.el
 ;; Doc URL: http://www.emacswiki.org/Icicles
 ;; Keywords: 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:
 ;;
-;;   `apropos', `apropos-fn+var', `avoid', `cl', `cus-edit',
-;;   `cus-face', `cus-load', `cus-start', `cus-theme', `doremi',
-;;   `easymenu', `el-swank-fuzzy', `ffap', `ffap-', `frame-cmds',
-;;   `frame-fns', `fuzzy', `fuzzy-match', `hexrgb', `icicles-fn',
-;;   `icicles-mcmd', `icicles-opt', `icicles-var', `image-dired',
-;;   `kmacro', `levenshtein', `misc-fns', `mouse3', `mwheel',
-;;   `naked', `regexp-opt', `ring', `second-sel', `strings',
-;;   `thingatpt', `thingatpt+', `wid-edit', `wid-edit+', `widget'.
+;;   `apropos', `apropos+', `apropos-fn+var', `avoid', `bookmark',
+;;   `bookmark+', `bookmark+-1', `bookmark+-bmu', `bookmark+-key',
+;;   `bookmark+-lit', `cl', `cmds-menu', `cus-edit', `cus-face',
+;;   `cus-load', `cus-start', `cus-theme', `doremi', `easymenu',
+;;   `el-swank-fuzzy', `ffap', `ffap-', `fit-frame', `frame-cmds',
+;;   `frame-fns', `fuzzy', `fuzzy-match', `help+20', `hexrgb',
+;;   `icicles-fn', `icicles-mcmd', `icicles-opt', `icicles-var',
+;;   `image-dired', `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', `thingatpt', `thingatpt+', `unaccent',
+;;   `w32browser-dlgopen', `wid-edit', `wid-edit+', `widget'.
 ;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;
@@ -73,6 +77,7 @@
 ;;    (+)`icicle-bookmark-all-tags-other-window',
 ;;    (+)`icicle-bookmark-all-tags-regexp',
 ;;    (+)`icicle-bookmark-all-tags-regexp-other-window',
+;;    `icicle-bookmark-annotated-narrow',
 ;;    (+)`icicle-bookmark-autofile',
 ;;    (+)`icicle-bookmark-autofile-all-tags',
 ;;    (+)`icicle-bookmark-autofile-all-tags-other-window',
 ;;    (+)`icicle-bookmark-cmd', (+)`icicle-bookmark-desktop',
 ;;    `icicle-bookmark-desktop-narrow', (+)`icicle-bookmark-dired',
 ;;    `icicle-bookmark-dired-narrow',
+;;    `icicle-bookmark-dired-this-dir-narrow',
+;;    `icicle-bookmark-dired-wildcards-narrow',
 ;;    (+)`icicle-bookmark-dired-other-window',
 ;;    (+)`icicle-bookmarked-buffer-list',
 ;;    (+)`icicle-bookmarked-file-list', (+)`icicle-bookmark-file',
 ;;    (+)`icicle-bookmark-local-file-other-window',
 ;;    (+)`icicle-bookmark-man', `icicle-bookmark-man-narrow',
 ;;    (+)`icicle-bookmark-man-other-window',
-;;    (+)`icicle-bookmark-non-file',
+;;    `icicle-bookmark-navlist-narrow', (+)`icicle-bookmark-non-file',
 ;;    `icicle-bookmark-non-file-narrow',
 ;;    (+)`icicle-bookmark-non-file-other-window',
 ;;    (+)`icicle-bookmark-other-window', (+)`icicle-bookmark-region',
 ;;    (+)`icicle-buffer-no-search',
 ;;    (+)`icicle-buffer-no-search-other-window',
 ;;    (+)`icicle-buffer-other-window', `icicle-cd-for-abs-files',
-;;    `icicle-cd-for-loc-files', (+)`icicle-clear-history',
-;;    (+)`icicle-clear-current-history', (+)`icicle-color-theme',
-;;    `icicle-comint-dynamic-complete',
+;;    `icicle-cd-for-loc-files', `icicle-choose-window-by-name',
+;;    `icicle-choose-window-for-buffer-display',
+;;    (+)`icicle-clear-history', (+)`icicle-clear-current-history',
+;;    (+)`icicle-color-theme', `icicle-comint-dynamic-complete',
 ;;    `icicle-comint-dynamic-complete-filename',
 ;;    `icicle-comint-replace-by-expanded-filename',
 ;;    (+)`icicle-command-abbrev', (+)`icicle-command-abbrev-command',
 ;;  Non-interactive functions defined here:
 ;;
 ;;    `custom-variable-p', `icicle-apropos-opt-action',
-;;    `icicle-binary-option-p', `icicle-bookmark-act-on-prop',
+;;    `icicle-bookmark-act-on-prop',
 ;;    `icicle-bookmark-bind-narrow-commands',
 ;;    `icicle-bookmark-cleanup', `icicle-bookmark-cleanup-on-quit',
 ;;    `icicle-bookmark-delete-action', `icicle-bookmark-help',
 ;;    `icicle-bookmark-propertize-candidate',
 ;;    `icicle-pp-display-expression',
 ;;    `icicle-read-args-w-val-satisfying',
+;;    `icicle-read-choose-window-args',
 ;;    (+)`icicle-recent-file-of-content-1',
 ;;    `icicle-recent-files-without-buffers.',
 ;;    `icicle-remove-buffer-candidate-action',
 ;;  ***** NOTE: The following functions defined in `dabbrev.el' have
 ;;              been REDEFINED HERE:
 ;;
-;;  `dabbrev-completion' - Use Icicles minibuffer completion when there
-;;                         are multiple candidates.
+;;    `dabbrev-completion' - Use Icicles minibuffer completion when
+;;                           there are multiple candidates.
 ;;
 ;;
 ;;  ***** NOTE: The following functions defined in `bbdb-com.el' have
 ;;              been REDEFINED HERE:
-;;              (BBDB is available here: http://bbdb.sourceforge.net/.)
+;;              (BBDB is here: http://bbdb.sourceforge.net/.)
 ;;
-;;  `icicle-bbdb-complete-mail', `bbdb-complete-name' -
-;;                         Use Icicles minibuffer completion when there
-;;                         are multiple candidates.
+;;    `icicle-bbdb-complete-mail', `bbdb-complete-name' -
+;;                           Use Icicles minibuffer completion when
+;;                           there are multiple candidates.
 ;;
 ;;
 ;;  ***** NOTE: The following functions defined in `lisp.el' have
 ;;              been REDEFINED in Icicles:
 ;;
-;;  `lisp-complete-symbol' - Selects `*Completions*' window even if on
-;;                           another frame.
+;;    `lisp-complete-symbol' - Select `*Completions*' window even if
+;;                             on another frame.
 ;;
 ;;
 ;;  ***** NOTE: The following function defined in `simple.el' has
 ;;              been REDEFINED HERE:
 ;;
-;;  `repeat-complex-command' - Use `completing-read' to read command.
+;;    `repeat-complex-command' - Use `completing-read'.
 ;;
 ;;
 ;;  ***** NOTE: The following functions defined in `cus-edit.el' have
 ;;              been REDEFINED HERE:
 ;;
-;;  `customize-apropos', `customize-apropos-faces',
-;;  `customize-apropos-groups', `customize-apropos-options' -
-;;     Use `completing-read' to read the regexp.
-;;  `customize-face', `customize-face-other-window' - Multi-commands.
+;;    `customize-apropos', `customize-apropos-faces',
+;;    `customize-apropos-groups',
+;;    `customize-apropos-options' - Use `completing-read'.
+;;    `customize-face', `customize-face-other-window' - Multi-commands.
+;;
+;;
+;;  ***** NOTE: The following functions defined in `window.el' are
+;;              ADVISED HERE:
+;;
+;;    `display-buffer', `switch-to-buffer',
+;;    `switch-to-buffer-other-window'.
 ;;
 ;;
 ;;  Key bindings made by Icicles: See "Key Bindings" in
 ;;
 ;;; Code:
 
-(eval-when-compile (require 'cl)) ;; lexical-let[*], pushnew
+(eval-when-compile (require 'cl)) ;; lexical-let[*], case, pushnew
                                   ;; plus, for Emacs < 21: dolist, push
 (eval-when-compile (when (>= emacs-major-version 21) (require 'recentf))) ;; recentf-mode
 (require 'apropos-fn+var nil t) ;; (no error if not found):
   ;; icicle-kmacro-alist, icicle-last-apropos-complete-match-fn, icicle-last-transform-function,
   ;; icicle-list-use-nth-parts, icicle-multi-completing-p, icicle-must-match-regexp,
   ;; icicle-must-not-match-regexp, icicle-must-pass-after-match-predicate, icicle-narrow-regexp,
-  ;; icicle-new-last-cmd, icicle-orig-buff, icicle-orig-must-pass-after-match-pred, icicle-orig-pt-explore,
-  ;; icicle-orig-window, icicle-orig-win-explore, icicle-other-window, icicle-path-variables,
-  ;; icicle-predicate-types-alist, icicle-pref-arg, icicle-pre-minibuffer-buffer,
-  ;; icicle-previous-raw-file-name-inputs, icicle-previous-raw-non-file-name-inputs, icicle-prompt,
-  ;; icicle-proxy-candidates, icicle-read-expression-map, icicle-remove-icicles-props-p, icicle-re-no-dot,
+  ;; icicle-new-last-cmd, icicle-next-window-for-display-buffer, icicle-orig-buff,
+  ;; icicle-orig-must-pass-after-match-pred, icicle-orig-pt-explore, icicle-orig-window,
+  ;; icicle-orig-win-explore, icicle-other-window, icicle-path-variables, icicle-predicate-types-alist,
+  ;; icicle-pref-arg, icicle-pre-minibuffer-buffer, icicle-previous-raw-file-name-inputs,
+  ;; icicle-previous-raw-non-file-name-inputs, icicle-prompt, icicle-proxy-candidates,
+  ;; icicle-read-expression-map, icicle-remove-icicles-props-p, icicle-re-no-dot,
   ;; icicle-saved-completion-candidates, icicle-search-history, icicle-transform-before-sort-p,
   ;; icicle-use-candidates-only-once-alt-p, icicle-whole-candidate-as-text-prop-p
 (require 'icicles-fn)                   ; (This is required anyway by `icicles-mcmd.el'.)
   (defvar minibuffer-local-filename-syntax))
 
 (defvar apropos-do-all)                 ; In `apropos.el'
-(defvar bbdb-complete-mail-allow-cycling) ; In `bbdb-com.el'
+(defvar bbdb-complete-mail-allow-cycling) ; In `bbdb.el'
 (defvar bbdb-complete-name-allow-cycling) ; In `bbdb-com.el', older BBDB versions
 (defvar bbdb-completion-list)           ; In `bbdb-come.el'
 (defvar bbdb-extract-address-components-func) ; In `bbdb-com.el'
 (defvar bbdb-expand-mail-aliases)       ; In `bbdb-com.el'
+(defvar bbdb-complete-mail-allow-cycling) ; In `bbdb.el'
 (defvar bbdb-complete-name-hooks)       ; In `bbdb-com.el', older BBDB versions
 (defvar bbdb-completion-display-record) ; In `bbdb.el'
 (defvar bbdb-completion-type)           ; In `bbdb.el'
 (defvar bbdb-hashtable)                 ; In `bbdb.el'
+(defvar bbdb-quoted-string-syntax-table) ; In `bbdb-com.el'
 (defvar bbdb-version)                   ; In `bbdb.el'
 (defvar bmkp-non-file-filename)         ; In `bookmark+-1.el'
 (defvar bmkp-prompt-for-tags-flag)      ; In `bookmark+-1.el'
@@ -1128,7 +1147,7 @@ Return t if successful."
     (let ((success  (let ((comint-completion-addsuffix  nil)
                           (icicle-candidate-help-fn
                            (lambda (cand)
-                             (with-output-to-temp-buffer "*Help*"
+                             (icicle-with-help-window "*Help*"
                                (princ (shell-command-to-string (concat "apropos "
                                                                        (shell-quote-argument cand))))))))
                       (icicle-comint-dynamic-simple-complete filenondir completions))))
@@ -1479,174 +1498,246 @@ Vanilla `dabbrev--abbrev-at-point' raises an error if no match."
       abv))
 
 
-;; REPLACE ORIGINAL `bbdb-complete-mail' defined in `bbdb-com.el', version 3.02
+;; REPLACE ORIGINAL `bbdb-complete-mail' defined in `bbdb.el', version 3.1
 ;; saving it for restoration when you toggle `icicle-mode'.
 ;;
-;; BBDB Version 3.02, the Insidious Big Brother Database, is available here: http://melpa.milkbox.net/.
+;; BBDB Version 3.1, the Insidious Big Brother Database, is available from these locations:
+;; * http://download.savannah.gnu.org/releases/bbdb/
+;; * http://melpa.milkbox.net/
 ;;
 ;; Uses Icicles completion when there are multiple candidates.
 ;;
-;; Free vars here: `bbdb-*' are bound in `bbdb-com.el'.
-(defun icicle-bbdb-complete-mail (&optional start-pos cycle-completion-buffer)
-  "In a mail buffer, complete the user name or mail address before point.
-Completes up to the preceding newline, colon or comma, or the value of
-START-POS.
+;; Free vars here: `bbdb-*' are bound in `bbdb.el'.
+(defun icicle-bbdb-complete-mail (&optional beg cycle-completion-buffer)
+  "In a mail buffer, complete the user name or mail before point.
+Completes up to the preceeding colon, comma, or BEG.
 Return non-nil if there is a valid completion, else return nil.
+
 You can control completion behaviour using `bbdb-completion-list'
 \(`bbdb-completion-type' in older BBDB versions).
 
-If what has been typed is unique, insert an entry \"User Name
-<mail-address>\" - but see `bbdb-mail-allow-redundancy'
-\(`bbdb-dwim-net-address-allow-redundancy' in older BBDB versions).
-If it is a valid completion but not unique, you can choose from the
-list of completions using Icicles completion.
+If what you have typed matches a unique BBDB record then insert an
+address formatted by `bbdb-dwim-mail'.  Display this record if
+`bbdb-completion-display-record' is non-nil.
+
+If what you have typed is a valid completion but not unique, you can
+choose from the list of completions using Icicles completion.
 
 If your input is completed and `bbdb-complete-mail-allow-cycling' is
-true (`bbdb-complete-name-allow-cycling' for older BBDB versions),
-you can repeat to cycle through the nets for the matching record.
+true (`bbdb-complete-name-allow-cycling' for older BBDB versions)then
+you can repeat to cycle through mail messages for the matching record.
+
+If BBDB would format a given address different from what is in the
+mail buffer, the first round of cycling reformats the address
+accordingly, then you cycle through the mails for the matching record.
 
 When called with a prefix arg, display a list of all mail messages
 available for cycling.
 
-See your version of BBDB for more information."
+Set variable `bbdb-complete-mail' to non-nil to enable this feature as
+part of your MUA setup."
   (interactive (list nil current-prefix-arg))
-  (unless (and (require 'bbdb nil t)  (require 'bbdb-com nil t)
-               (fboundp 'bbdb-complete-mail))
-    (icicle-user-error "`icicle-bbdb-complete-mail' requires a BBDB version such as 3.02"))
-  (bbdb-buffer)                         ; Make sure database is initialized.
-  (lexical-let* ((end                     (point))
-                 (beg                     (or start-pos  (save-excursion
-                                                           (re-search-backward "\\(\\`\\|[\n:,]\\)[ \t]*")
-                                                           (goto-char (match-end 0)) (point))))
-                 (orig                    (buffer-substring beg end))
-                 (typed                   (downcase orig))
-                 (pattern                 (bbdb-string-trim typed))
-                 (completion-ignore-case  t)
-                 (completion              (try-completion pattern bbdb-hashtable #'bbdb-completion-predicate))
-                 (all-the-completions     ())
-                 dwim-completions  one-record  done)
-    ;; [:,] match would be interpreted as START-POS (e.g., a comma in LF-NAME).  Compensate.
-    (when (and (stringp completion)  (string-match "[:,]" completion))
-      (setq completion  (substring completion 0 (match-beginning 0))))
-    ;; Cannot use `all-completions' to set `all-the-completions' because it converts symbols to strings.
-    (all-completions pattern bbdb-hashtable (lambda (sym)
-                                              (when (bbdb-completion-predicate sym)
-                                                (push sym all-the-completions))))
-    ;; Resolve records matching pattern.  Multiple completions could match the same record.
-    (let ((records  (icicle-delete-dups (apply #'append (mapcar #'symbol-value all-the-completions)))))
-      (setq one-record  (and (not (cdr records))  (car records)))) ; Only one matching record.
-    (icicle-remove-Completions-window)
-    (cond (one-record
-           ;; Only one matching record.
-           ;; Determine mail address of ONE-RECORD to use for ADDRESS.
-           ;; Do we have a preferential order for the following tests?
-           (let ((completion-list  (if (eq t bbdb-completion-list)
-                                       '(fl-name lf-name mail aka organization)
-                                     bbdb-completion-list))
-                 (mails            (bbdb-record-mail one-record))
-                 mail elt)
-             (unless mails (error "Matching record has no `mail' field"))
-             ;; (1) If PATTERN matches name, AKA, or organization of ONE-RECORD,
-             ;;     then ADDRESS is the first mail address of ONE-RECORD.
-             (when (try-completion pattern (append (and (memq 'fl-name completion-list)
-                                                        (list (or (bbdb-record-name one-record)  "")))
-                                                   (and (memq 'lf-name completion-list)
-                                                        (list (or (bbdb-record-name-lf one-record)  "")))
-                                                   (and (memq 'aka completion-list)
-                                                        (bbdb-record-field one-record 'aka-all))
-                                                   (and (memq 'organization completion-list)
-                                                        (bbdb-record-organization one-record))))
-               (setq mail  (car mails)))
-             ;; (2) If PATTERN matches one or multiple mail addresses of ONE-RECORD,
-             ;;     then we take the first one matching PATTERN.
-             (unless mail (while (setq elt  (pop mails))
-                            (if (try-completion pattern (list elt))
-                                (setq mail   elt
-                                      mails  ()))))
-             (unless mail (error "`icicle-bbdb-complete-mail': No match for `%s'" pattern)) ; Indicates a bug!
-             (let ((address  (bbdb-dwim-mail one-record mail)))
-               (if (string= address (buffer-substring-no-properties beg end))
-                   (unless (and bbdb-complete-mail-allow-cycling  (< 1 (length (bbdb-record-mail one-record))))
-                     (setq done  'UNCHANGED))
-                 (delete-region beg end) ; Replace text with expansion.
-                 (insert address)
-                 (bbdb-complete-mail-cleanup address)
-                 (setq done  'UNIQUE)))))
-          ;; Completed partially.
-          ;; Cannot use trimmed version of pattern here, else recurse infinitely on, e.g., common first names.
-          ((and (stringp completion)  (not (string= typed completion)))
-           (delete-region beg end)
-           (insert completion)
-           (setq done  'PARTIAL))
-          ;; Partial match not allowing further partial completion.
-          (completion
-           (let ((completion-list  (if (eq t bbdb-completion-list)
-                                       '(fl-name lf-name mail aka organization)
-                                     bbdb-completion-list))
-                 sname  records)
-             ;; Collect dwim-addresses for each completion, but only once for each record!
-             ;; Add if mail is part of the completions.
-             (dolist (sym  all-the-completions)
-               (setq sname  (symbol-name sym))
-               (dolist (record  (symbol-value sym))
-                 (unless (memq record records)
-                   (push record records)
+  (unless (and (require 'bbdb nil t)  (require 'bbdb-com nil t)  (fboundp 'bbdb-complete-mail))
+    (icicle-user-error "`icicle-bbdb-complete-mail' requires a BBDB version such as 3.1"))
+  (bbdb-buffer)                         ; Make sure the database is initialized.
+  ;; Completion should begin after the preceding comma (separating
+  ;; two addresses) or colon (separating the header field name
+  ;; from the header field body).  We want to ignore these characters
+  ;; if they appear inside a quoted string (RFC 5322, Sec. 3.2.4).
+  ;; Note also that a quoted string may span multiple lines
+  ;; (RFC 5322, Sec. 2.2.3).
+  ;; So to be save, we go back to the beginning of the header field body
+  ;; (past the colon, when we are certainly not inside a quoted string),
+  ;; then we parse forward, looking for commas not inside a quoted string
+  ;; and positioned before END.  - This fails with an unbalanced quote.
+  ;; But an unbalanced quote is bound to fail anyway.
+  (when (and (not beg)  (<= (point) (save-restriction ; `mail-header-end'
+                                      (widen)
+                                      (save-excursion (rfc822-goto-eoh) (point)))))
+    (let ((end  (point))
+          start pnt state)
+      (save-excursion
+        ;; A header field name must appear at the beginning of a line,
+        ;; and it must be terminated by a colon.
+        (re-search-backward "^[^ \t\n:][^:]*:[ \t\n]+")
+        (setq beg    (match-end 0)
+              start  beg)
+        (goto-char beg)
+        ;; If we are inside a syntactically correct header field,
+        ;; all continuation lines in between the field name and point
+        ;; must begin with a white space character.
+        (if (re-search-forward "\n[^ \t]" end t)
+            ;; An invalid header is identified via BEG set to nil.
+            (setq beg  nil)
+          ;; Parse field body up to END
+          (with-syntax-table bbdb-quoted-string-syntax-table
+            (while (setq pnt  (re-search-forward ",[ \t\n]*" end t))
+              (setq state  (parse-partial-sexp start pnt nil nil state)
+                    start  pnt)
+              (unless (nth 3 state) (setq beg  pnt))))))))
+  ;; Noa meaningful way to set BEG if we are not in a message header.
+  (unless beg (message "Not a valid buffer position for mail completion") (sit-for 1))
+  (let* ((end                     (point))
+         (done                    (and (not beg)  'NOTHING))
+         (orig                    (and beg  (buffer-substring beg end)))
+         (completion-ignore-case  t)
+         (completion              (and orig  (try-completion orig bbdb-hashtable
+                                                             #'bbdb-completion-predicate)))
+         all-comps dwim-completions one-record)
+    (unless done
+      ;; We get fooled if a partial COMPLETION matches "," (for example,
+      ;; a comma in lf-name).  Such a partial COMPLETION cannot be protected
+      ;; by quoting.  Then the comma gets interpreted as BEG.
+      ;; So we never perform partial completion beyond the first comma.
+      ;; This works even if we have just one record matching ORIG (thus
+      ;; allowing dwim-completion) because ORIG is a substring of COMPLETION
+      ;; even after COMPLETION got truncated; and ORIG by itself must be
+      ;; sufficient to identify this record.
+      ;; Yet if multiple records match ORIG we can only offer a *Completions* buffer.
+      (when (and (stringp completion)  (string-match "," completion))
+        (setq completion  (substring completion 0 (match-beginning 0))))
+      ;; We cannot use the return value of function `all-completions' to set
+      ;; var ALL-COMPS because that function converts all symbols into strings
+      (all-completions orig bbdb-hashtable (lambda (sym)
+                                             (when (bbdb-completion-predicate sym)
+                                               (push sym all-comps))))
+      ;; Resolve the records matching ORIG:
+      ;; Multiple completions may match the same record
+      (let ((records  (icicle-delete-dups (apply #'append (mapcar #'symbol-value all-comps)))))
+        ;; Is there only one matching record?
+        (setq one-record  (and (not (cdr records))  (car records))))
+      (icicle-remove-Completions-window)
+      (cond (one-record                 ; Only one matching record.
+             (let ((completion-list  (if (eq t bbdb-completion-list)
+                                         '(fl-name lf-name mail aka organization)
+                                       bbdb-completion-list))
+                   (mails            (bbdb-record-mail one-record))
+                   mail elt)
+               (if (not mails)
+                   (progn (message "Matching record has no `mail' field") (sit-for 1)
+                          (setq done  'NOTHING))
+                 ;; Determine the mail address of ONE-RECORD to use for ADDRESS.
+                 ;; Do we have a preferential order for the following tests?
+
+                 ;; (1) If ORIG matches name, AKA, or organization of ONE-RECORD,
+                 ;;     then ADDRESS will be the first mail address of ONE-RECORD.
+                 (when (try-completion orig (append (and (memq 'fl-name completion-list)
+                                                         (list (or (bbdb-record-name one-record)  "")))
+                                                    (and (memq 'lf-name completion-list)
+                                                         (list (or (bbdb-record-name-lf one-record)  "")))
+                                                    (and (memq 'aka completion-list)
+                                                         (bbdb-record-field one-record 'aka-all))
+                                                    (and (memq 'organization completion-list)
+                                                         (bbdb-record-organization one-record))))
+                   (setq mail  (car mails)))
+                 ;; (2) If ORIG matches one or multiple mail addresses of ONE-RECORD,
+                 ;;     then we take the first one matching ORIG.
+                 ;;     We got here with MAIL nil only if `bbdb-completion-list'
+                 ;;     includes 'mail or 'primary.
+                 (unless mail (while (setq elt  (pop mails))
+                                (when (try-completion orig (list elt))
+                                  (setq mail   elt
+                                        mails  ()))))
+                 (unless mail (error "`icicle-bbdb-complete-mail': No match for `%s'" orig)) ; Indicates a bug!
+                 (let ((dwim-mail  (bbdb-dwim-mail one-record mail)))
+                   (if (string= dwim-mail orig)
+                       ;; We get here if `bbdb-mail-avoid-redundancy' is 'mail-only
+                       ;; and `bbdb-completion-list' includes 'mail.
+                       (unless (and bbdb-complete-mail-allow-cycling
+                                    (< 1 (length (bbdb-record-mail one-record))))
+                         (setq done  'UNCHANGED))
+                     (delete-region beg end) ; Replace text with expansion.
+                     (insert dwim-mail)
+                     (bbdb-complete-mail-cleanup dwim-mail beg)
+                     (setq done  'UNIQUE))))))
+            ((and (stringp completion)  (not (bbdb-string= orig completion))) ; Complete partially
+             (delete-region beg end)
+             (insert completion)
+             (setq done  'PARTIAL))
+            (completion                 ; Partial match not allowing further partial completion
+             (let ((completion-list  (if (eq t bbdb-completion-list)
+                                         '(fl-name lf-name mail aka organization)
+                                       bbdb-completion-list))
+                   sname)
+               ;; Now collect all the dwim-addresses for each completion.
+               ;; Add it if the mail is part of the completions
+               (dolist (sym  all-comps)
+                 (setq sname  (symbol-name sym))
+                 (dolist (record  (symbol-value sym))
                    (let ((mails  (bbdb-record-mail record))
                          accept)
                      (when mails
                        (dolist (field  completion-list)
                          (if (case field
-                               (fl-name (bbdb-string= sname (bbdb-record-name record)))
-                               (lf-name (bbdb-string= sname (bbdb-cache-lf-name (bbdb-record-cache record))))
-                               (aka (member-ignore-case sname (bbdb-record-field record 'aka-all)))
+                               (fl-name      (bbdb-string= sname (bbdb-record-name record)))
+                               (lf-name      (bbdb-string= sname (bbdb-cache-lf-name
+                                                                  (bbdb-record-cache record))))
+                               (aka          (member-ignore-case sname (bbdb-record-field record 'aka-all)))
                                (organization (member-ignore-case sname (bbdb-record-organization record)))
-                               (primary (bbdb-string= sname (car mails)))
-                               (otherwise nil))
+                               (primary      (bbdb-string= sname (car mails)))
+                               (otherwise    nil))
                              (push (car mails) accept)
                            (when (eq field 'mail)
-                             (dolist (mail  mails)
-                               (when (bbdb-string= sname mail) (push mail accept))))))
-                       (when accept
-                         ;; If DWIM-COMPLETIONS contains only one element, set DONE to `UNIQUE' (see below)
-                         ;;  and we want to know ONE-RECORD.
-                         (setq one-record  record)
-                         (dolist (mail  (delete-dups accept))
-                           (push (bbdb-dwim-mail record mail) dwim-completions))))))))
-             (cond ((not dwim-completions) (error "No mail address for \"%s\"" orig))
-                   ;; DWIM-COMPLETIONS might contain only one element, if multiple completions match the
-                   ;; same record.  In that case proceed with DONE set to `UNIQUE'.
-                   ((eq 1 (length dwim-completions))
-                    (delete-region beg end)
-                    (insert (car dwim-completions))
-                    (bbdb-complete-mail-cleanup (car dwim-completions))
-                    (setq done  'UNIQUE))
-                   (t
-                    (setq done  'CHOOSE))))))
+                             (dolist (mail  mails) (when (bbdb-string= sname mail) (push mail accept))))))
+                       (dolist (mail  (icicle-delete-dups accept))
+                         (push (bbdb-dwim-mail record mail) dwim-completions))))))
+               (setq dwim-completions  (sort (icicle-delete-dups dwim-completions) 'string<))
+               (cond ((not dwim-completions)
+                      (message "Matching record has no mail field") (sit-for 1)
+                      (setq done 'NOTHING))
+                     ;; DWIM-COMPLETIONS may contain only one element,
+                     ;; if multiple completions match the same record.
+                     ;; Then we may proceed with DONE set to `UNIQUE'.
+                     ((eq 1 (length dwim-completions))
+                      (delete-region beg end)
+                      (insert (car dwim-completions))
+                      (bbdb-complete-mail-cleanup (car dwim-completions) beg)
+                      (setq done  'UNIQUE))
+                     (t
+                      (setq done  'CHOOSE)))))))
+
     ;; If no completion so far, consider cycling.
     ;; Completion is controlled by option `bbdb-completion-list'.  Cycling assumes that ORIG already holds
     ;; a valid RFC 822 mail address.  So cycling can consider different records than completion.
     (when (and (not done)  bbdb-complete-mail-allow-cycling)
       ;; Find the record we are working on.
-      (let* ((address  (mail-extract-address-components orig))
-             (record   (and (listp address)  (car (bbdb-message-search (nth 0 address) (nth 1 address)))))
-             (mails    (and record  (bbdb-record-mail record))))
-        (when mails
-          ;; Cycle, even if MAILS has only one address. `bbdb-dwim-mail' can give something different.
-          ;; E.g., header "JOHN SMITH <FOO@BAR.COM>" can be replaced by "John Smith <foo@bar.com>".
-          (cond ((and (= 1 (length mails))  (string= (bbdb-dwim-mail record (car mails))
-                                                     (buffer-substring-no-properties beg end)))
+      (let* ((address  (bbdb-extract-address-components orig))
+             (record   (car (bbdb-message-search (car address) (cadr address)))))
+        (when (and record  (setq dwim-completions  (mapcar (lambda (m) (bbdb-dwim-mail record m))
+                                                           (bbdb-record-mail record))))
+          (cond ((and (= 1 (length dwim-completions))  (string= orig (car dwim-completions)))
                  (setq done  'UNCHANGED))
-                (cycle-completion-buffer ; Use completion buffer.
-                 (setq dwim-completions  (mapcar (lambda (n) (bbdb-dwim-mail record n)) mails)
-                       done              'CHOOSE))
-                (t                      ; Use next mail
-                 (let ((mail  (or (nth 1 (or (icicle-member-ignore-case (nth 1 address) mails)
-                                             (icicle-member-ignore-case orig mails)))
-                                  (nth 0 mails))))
+                (cycle-completion-buffer (setq done  'CYCLE-CHOOSE)) ; Use completion buffer
+                ;; Reformatting / Clean up:
+                ;; If the canonical mail address (nth 1 address)
+                ;; matches the Nth canonical mail address of RECORD,
+                ;; but ORIG is not `equal' to (bbdb-dwim-mail record n),
+                ;; then we replace ORIG by (bbdb-dwim-mail record n).
+                ;; For example, the address "JOHN SMITH <FOO@BAR.COM>"
+                ;; gets reformatted as "John Smith <foo@bar.com>".
+                ;; We attempt this reformatting before the yet more
+                ;; aggressive proper cycling.
+                ((let* ((cmails  (bbdb-record-mail-canon record))
+                        (len     (length cmails))
+                        mail dwim-mail)
+                   (while (and (not done)  (setq mail  (pop cmails)))
+                     (when (and (bbdb-string= mail (nth 1 address)) ; ignore case
+                                (not (string= orig (setq dwim-mail  (nth (- len 1 (length cmails))
+                                                                         dwim-completions)))))
+                       (delete-region beg end)
+                       (insert dwim-mail)
+                       (bbdb-complete-mail-cleanup dwim-mail beg)
+                       (setq done  'REFORMAT)))
+                   done))
+                (t
+                 ;; ORIG is `equal' to an element of DWIM-COMPLETIONS
+                 ;; Use the next element of DWIM-COMPLETIONS.
+                 (let ((dwim-mail  (or (nth 1 (member orig dwim-completions))  (nth 0 dwim-completions))))
                    (delete-region beg end) ; Replace with new mail address
-                   (insert (bbdb-dwim-mail record mail))
+                   (insert dwim-mail)
+                   (bbdb-complete-mail-cleanup dwim-mail beg)
                    (setq done  'CYCLE)))))))
-    (when (eq done 'CHOOSE)
+    (when (member done '(CHOOSE CYCLE-CHOOSE))
       ;; Icicles completion.  `completion-in-region' does not work here, as `dwim-completions' is not a
       ;; collection for completion in the usual sense.  It is really a list of replacements.
       (unless (eq (selected-window) (minibuffer-window)) (message "Making completion list..."))
@@ -1657,13 +1748,209 @@ See your version of BBDB for more information."
                  (completion-ignore-case                      t)
                  (choice
                   (save-excursion (completing-read "Complete: " (mapcar #'list dwim-completions)
-                                                   nil t pattern nil pattern))))
+                                                   nil t orig nil orig))))
             (when choice
               (delete-region beg end)
               (insert choice)))
         (error nil))
       (unless (eq (selected-window) (minibuffer-window)) (message "Making completion list...done")))
-    done))
+    ;; If DONE is `NOTHING' return nil so that possibly some other code can take over.
+    (and (not (eq done 'NOTHING))  done)))
+
+
+;;; If you have BBDB version 3.0.2, not 3.1, then uncomment this code.
+
+;;; ;; REPLACE ORIGINAL `bbdb-complete-mail' defined in `bbdb-com.el', version 3.02
+;;; ;; saving it for restoration when you toggle `icicle-mode'.
+;;; ;;
+;;; ;; BBDB Version 3.02, the Insidious Big Brother Database, is available here: http://melpa.milkbox.net/.
+;;; ;;
+;;; ;; Uses Icicles completion when there are multiple candidates.
+;;; ;;
+;;; ;; Free vars here: `bbdb-*' are bound in `bbdb-com.el'.
+;;; (defun icicle-bbdb-complete-mail (&optional start-pos cycle-completion-buffer)
+;;;   "In a mail buffer, complete the user name or mail address before point.
+;;; Completes up to the preceding newline, colon or comma, or the value of
+;;; START-POS.
+;;; Return non-nil if there is a valid completion, else return nil.
+;;; You can control completion behaviour using `bbdb-completion-list'
+;;; \(`bbdb-completion-type' in older BBDB versions).
+
+;;; If what has been typed is unique, insert an entry \"User Name
+;;; <mail-address>\" - but see `bbdb-mail-allow-redundancy'
+;;; \(`bbdb-dwim-net-address-allow-redundancy' in older BBDB versions).
+;;; If it is a valid completion but not unique, you can choose from the
+;;; list of completions using Icicles completion.
+
+;;; If your input is completed and `bbdb-complete-mail-allow-cycling' is
+;;; true (`bbdb-complete-name-allow-cycling' for older BBDB versions),
+;;; you can repeat to cycle through the nets for the matching record.
+
+;;; When called with a prefix arg, display a list of all mail messages
+;;; available for cycling.
+
+;;; See your version of BBDB for more information."
+;;;   (interactive (list nil current-prefix-arg))
+;;;   (unless (and (require 'bbdb nil t)  (require 'bbdb-com nil t)
+;;;                (fboundp 'bbdb-complete-mail))
+;;;     (icicle-user-error "`icicle-bbdb-complete-mail' requires a BBDB version such as 3.02"))
+;;;   (bbdb-buffer)                         ; Make sure database is initialized.
+;;;   (lexical-let* ((end                     (point))
+;;;                  (beg                     (or start-pos  (save-excursion
+;;;                                                            (re-search-backward "\\(\\`\\|[\n:,]\\)[ \t]*")
+;;;                                                            (goto-char (match-end 0)) (point))))
+;;;                  (orig                    (buffer-substring beg end))
+;;;                  (typed                   (downcase orig))
+;;;                  (pattern                 (bbdb-string-trim typed))
+;;;                  (completion-ignore-case  t)
+;;;                  (completion              (try-completion pattern bbdb-hashtable
+;;;                                                           #'bbdb-completion-predicate))
+;;;                  (all-the-completions     ())
+;;;                  dwim-completions  one-record  done)
+;;;     ;; [:,] match would be interpreted as START-POS (e.g., a comma in LF-NAME).  Compensate.
+;;;     (when (and (stringp completion)  (string-match "[:,]" completion))
+;;;       (setq completion  (substring completion 0 (match-beginning 0))))
+;;;     ;; Cannot use `all-completions' to set `all-the-completions' because it converts symbols to strings.
+;;;     (all-completions pattern bbdb-hashtable (lambda (sym)
+;;;                                               (when (bbdb-completion-predicate sym)
+;;;                                                 (push sym all-the-completions))))
+;;;     ;; Resolve records matching pattern.  Multiple completions could match the same record.
+;;;     (let ((records  (icicle-delete-dups (apply #'append (mapcar #'symbol-value all-the-completions)))))
+;;;       (setq one-record  (and (not (cdr records))  (car records)))) ; Only one matching record.
+;;;     (icicle-remove-Completions-window)
+;;;     (cond (one-record
+;;;            ;; Only one matching record.
+;;;            ;; Determine mail address of ONE-RECORD to use for ADDRESS.
+;;;            ;; Do we have a preferential order for the following tests?
+;;;            (let ((completion-list  (if (eq t bbdb-completion-list)
+;;;                                        '(fl-name lf-name mail aka organization)
+;;;                                      bbdb-completion-list))
+;;;                  (mails            (bbdb-record-mail one-record))
+;;;                  mail elt)
+;;;              (unless mails (error "Matching record has no `mail' field"))
+;;;              ;; (1) If PATTERN matches name, AKA, or organization of ONE-RECORD,
+;;;              ;;     then ADDRESS is the first mail address of ONE-RECORD.
+;;;              (when (try-completion pattern (append (and (memq 'fl-name completion-list)
+;;;                                                         (list (or (bbdb-record-name one-record)  "")))
+;;;                                                    (and (memq 'lf-name completion-list)
+;;;                                                         (list (or (bbdb-record-name-lf one-record)  "")))
+;;;                                                    (and (memq 'aka completion-list)
+;;;                                                         (bbdb-record-field one-record 'aka-all))
+;;;                                                    (and (memq 'organization completion-list)
+;;;                                                         (bbdb-record-organization one-record))))
+;;;                (setq mail  (car mails)))
+;;;              ;; (2) If PATTERN matches one or multiple mail addresses of ONE-RECORD,
+;;;              ;;     then we take the first one matching PATTERN.
+;;;              (unless mail (while (setq elt  (pop mails))
+;;;                             (if (try-completion pattern (list elt))
+;;;                                 (setq mail   elt
+;;;                                       mails  ()))))
+;;;              (unless mail
+;;;                (error "`icicle-bbdb-complete-mail': No match for `%s'" pattern)) ; Indicates a bug!
+;;;              (let ((address  (bbdb-dwim-mail one-record mail)))
+;;;                (if (string= address (buffer-substring-no-properties beg end))
+;;;                    (unless (and bbdb-complete-mail-allow-cycling
+;;;                                 (< 1 (length (bbdb-record-mail one-record))))
+;;;                      (setq done  'UNCHANGED))
+;;;                  (delete-region beg end) ; Replace text with expansion.
+;;;                  (insert address)
+;;;                  (bbdb-complete-mail-cleanup address)
+;;;                  (setq done  'UNIQUE)))))
+;;;           ;; Completed partially.
+;;;           ;; Cannot use trimmed version of pattern here, else recurse infinitely on,
+;;;           ;; e.g., common first names.
+;;;           ((and (stringp completion)  (not (string= typed completion)))
+;;;            (delete-region beg end)
+;;;            (insert completion)
+;;;            (setq done  'PARTIAL))
+;;;           ;; Partial match not allowing further partial completion.
+;;;           (completion
+;;;            (let ((completion-list  (if (eq t bbdb-completion-list)
+;;;                                        '(fl-name lf-name mail aka organization)
+;;;                                      bbdb-completion-list))
+;;;                  sname  records)
+;;;              ;; Collect dwim-addresses for each completion, but only once for each record!
+;;;              ;; Add if mail is part of the completions.
+;;;              (dolist (sym  all-the-completions)
+;;;                (setq sname  (symbol-name sym))
+;;;                (dolist (record  (symbol-value sym))
+;;;                  (unless (memq record records)
+;;;                    (push record records)
+;;;                    (let ((mails  (bbdb-record-mail record))
+;;;                          accept)
+;;;                      (when mails
+;;;                        (dolist (field  completion-list)
+;;;                          (if (case field
+;;;                                (fl-name (bbdb-string= sname (bbdb-record-name record)))
+;;;                                (lf-name (bbdb-string= sname (bbdb-cache-lf-name
+;;;                                                              (bbdb-record-cache record))))
+;;;                                (aka (member-ignore-case sname (bbdb-record-field record 'aka-all)))
+;;;                                (organization (member-ignore-case sname (bbdb-record-organization record)))
+;;;                                (primary (bbdb-string= sname (car mails)))
+;;;                                (otherwise nil))
+;;;                              (push (car mails) accept)
+;;;                            (when (eq field 'mail)
+;;;                              (dolist (mail  mails)
+;;;                                (when (bbdb-string= sname mail) (push mail accept))))))
+;;;                        (when accept
+;;;                          ;; If DWIM-COMPLETIONS contains only one element, set DONE to `UNIQUE' (see below)
+;;;                          ;;  and we want to know ONE-RECORD.
+;;;                          (setq one-record  record)
+;;;                          (dolist (mail  (delete-dups accept))
+;;;                            (push (bbdb-dwim-mail record mail) dwim-completions))))))))
+;;;              (cond ((not dwim-completions) (error "No mail address for \"%s\"" orig))
+;;;                    ;; DWIM-COMPLETIONS might contain only one element, if multiple completions match the
+;;;                    ;; same record.  In that case proceed with DONE set to `UNIQUE'.
+;;;                    ((eq 1 (length dwim-completions))
+;;;                     (delete-region beg end)
+;;;                     (insert (car dwim-completions))
+;;;                     (bbdb-complete-mail-cleanup (car dwim-completions))
+;;;                     (setq done  'UNIQUE))
+;;;                    (t
+;;;                     (setq done  'CHOOSE))))))
+;;;     ;; If no completion so far, consider cycling.
+;;;     ;; Completion is controlled by option `bbdb-completion-list'.  Cycling assumes that ORIG already holds
+;;;     ;; a valid RFC 822 mail address.  So cycling can consider different records than completion.
+;;;     (when (and (not done)  bbdb-complete-mail-allow-cycling)
+;;;       ;; Find the record we are working on.
+;;;       (let* ((address  (mail-extract-address-components orig))
+;;;              (record   (and (listp address)  (car (bbdb-message-search (nth 0 address) (nth 1 address)))))
+;;;              (mails    (and record  (bbdb-record-mail record))))
+;;;         (when mails
+;;;           ;; Cycle, even if MAILS has only one address. `bbdb-dwim-mail' can give something different.
+;;;           ;; E.g., header "JOHN SMITH <FOO@BAR.COM>" can be replaced by "John Smith <foo@bar.com>".
+;;;           (cond ((and (= 1 (length mails))  (string= (bbdb-dwim-mail record (car mails))
+;;;                                                      (buffer-substring-no-properties beg end)))
+;;;                  (setq done  'UNCHANGED))
+;;;                 (cycle-completion-buffer ; Use completion buffer.
+;;;                  (setq dwim-completions  (mapcar (lambda (n) (bbdb-dwim-mail record n)) mails)
+;;;                        done              'CHOOSE))
+;;;                 (t                      ; Use next mail
+;;;                  (let ((mail  (or (nth 1 (or (icicle-member-ignore-case (nth 1 address) mails)
+;;;                                              (icicle-member-ignore-case orig mails)))
+;;;                                   (nth 0 mails))))
+;;;                    (delete-region beg end) ; Replace with new mail address
+;;;                    (insert (bbdb-dwim-mail record mail))
+;;;                    (setq done  'CYCLE)))))))
+;;;     (when (eq done 'CHOOSE)
+;;;       ;; Icicles completion.  `completion-in-region' does not work here, as `dwim-completions' is not a
+;;;       ;; collection for completion in the usual sense.  It is really a list of replacements.
+;;;       (unless (eq (selected-window) (minibuffer-window)) (message "Making completion list..."))
+;;;       (icicle-condition-case-no-debug nil
+;;;           (let* ((icicle-show-Completions-initially-flag      t)
+;;;                  (icicle-incremental-completion-p             'display)
+;;;                  (icicle-top-level-when-sole-completion-flag  t)
+;;;                  (completion-ignore-case                      t)
+;;;                  (choice
+;;;                   (save-excursion (completing-read "Complete: " (mapcar #'list dwim-completions)
+;;;                                                    nil t pattern nil pattern))))
+;;;             (when choice
+;;;               (delete-region beg end)
+;;;               (insert choice)))
+;;;         (error nil))
+;;;       (unless (eq (selected-window) (minibuffer-window)) (message "Making completion list...done")))
+;;;     done))
+
 
 
 ;; REPLACE ORIGINAL `bbdb-complete-name' defined in `bbdb-com.el' version 2.35,
@@ -2019,17 +2306,29 @@ considered."
     (insert new)))
 
 
-;; REPLACE ORIGINAL `lisp-completion-at-point' (>= Emacs 23.2),
+;; REPLACE ORIGINAL `lisp-completion-at-point' (>= Emacs 23.2 and <= Emacs 24.3),
 ;; defined in `lisp.el', saving it for restoration when you toggle `icicle-mode'.
 ;;
 ;; Select `*Completions*' window even if on another frame.
 ;;
-(when (fboundp 'completion-at-point)    ; Emacs 23.2+.
+(when (and (fboundp 'completion-at-point)  (not (fboundp 'elisp-completion-at-point))) ; Emacs 23.2 through 24.4.
   (unless (fboundp 'icicle-ORIG-lisp-completion-at-point)
     (defalias 'icicle-ORIG-lisp-completion-at-point (symbol-function 'lisp-completion-at-point))
     ;; Return a function that does all of the completion.
     (defun icicle-lisp-completion-at-point () #'icicle-lisp-complete-symbol)))
 
+
+;; REPLACE ORIGINAL `elisp-completion-at-point' (>= Emacs 25),
+;; defined in `elisp-mode.el', saving it for restoration when you toggle `icicle-mode'.
+;;
+;; Select `*Completions*' window even if on another frame.
+;;
+(when (fboundp 'elisp-completion-at-point) ; Emacs 25+.
+  (unless (fboundp 'icicle-ORIG-lisp-completion-at-point)
+    (defalias 'icicle-ORIG-elisp-completion-at-point (symbol-function 'elisp-completion-at-point))
+    ;; Return a function that does all of the completion.
+    (defun icicle-elisp-completion-at-point () #'icicle-lisp-complete-symbol)))
+
 (defun icicle-customize-icicles-group ()
   "Customize Icicles options and faces.  View their documentation."
   (interactive)
@@ -2061,6 +2360,7 @@ Same as `icicle-customize-face' except it uses a different window."
   (interactive
    (list (let* ((icicle-multi-completing-p             t)
                 (icicle-list-use-nth-parts             '(1))
+                (icicle-face-completing-p              t)
                 (icicle-candidate-action-fn
                  (lambda (fc)
                    (let ((proxy  (car (member fc icicle-proxy-candidates))))
@@ -2146,6 +2446,7 @@ This is an Icicles command - see command `icicle-mode'."
   (interactive
    (list (let* ((icicle-multi-completing-p             t)
                 (icicle-list-use-nth-parts             '(1))
+                (icicle-face-completing-p              t)
                 (icicle-candidate-action-fn
                  (lambda (fc)
                    (let ((proxy  (car (member fc icicle-proxy-candidates))))
@@ -2224,7 +2525,16 @@ This handling of \"words\" is for compatibility with vanilla Emacs,
 and is only approximative.  It can include \"matches\" that you do not
 expect.  For better matching use Icicles progressive completion, i.e.,
 separate the words (any strings, in fact, including regexps) using
-`S-SPC', not just `SPC'."
+`S-SPC', not just `SPC'.
+
+See also the commands for individual TYPEs:
+ `icicle-customize-apropos-options'
+ `icicle-customize-apropos-faces'
+ `icicle-customize-apropos-groups'
+
+Note that unlike `icicle-customize-apropos', command
+`icicle-customize-apropos-faces' shows you WYSIWYG face candidates, if
+option `icicle-WYSIWYG-Completions-flag' is non-nil."
   (interactive
    (let* ((pref-arg                                current-prefix-arg)
           (pred                                    `(lambda (s)
@@ -2247,11 +2557,11 @@ separate the words (any strings, in fact, including regexps) using
                (string= (regexp-quote pattern) pattern)
                (not (string= "" pattern)))
       (setq pattern  (split-string pattern "[ \t]+" 'OMIT-NULLS)))
-    (when (fboundp 'apropos-parse-pattern) (apropos-parse-pattern pattern)) ; Emacs 22+
+    (when (fboundp 'apropos-parse-pattern) (apropos-parse-pattern pattern)) ; Emacs 22+.  Updates `apropos-*'.
     (when msgp (message "Gathering apropos data for customize `%s'..." pattern))
     (mapatoms `(lambda (symbol)         ; FREE here: APROPOS-REGEXP.
-                (when (string-match ,(and (> emacs-major-version 21)  apropos-regexp pattern)
-                                    (symbol-name symbol))
+                (when (icicle-string-match-p ,(if (> emacs-major-version 21)  apropos-regexp  pattern)
+                                             (symbol-name symbol))
                   (when (and (not (memq ,type '(faces options))) ; groups or t
                              (get symbol 'custom-group))
                     (push (list symbol 'custom-group) found))
@@ -2283,21 +2593,28 @@ separate the words (any strings, in fact, including regexps) using
          (or (get variable 'standard-value)  (get variable 'custom-autoload)))))
 
 ;; Icicles replacement for `customize-apropos-faces', defined in `cus-edit.el'.
-;; 1. Uses `completing-read' to read the regexp.
+;;
+;; 1. Uses `completing-read' to read the regexp, and uses `icicle-make-face-candidate', to provide WYSIWYG.
 ;; 2. Fixes Emacs bug #11124.
 ;;
 (defun icicle-customize-apropos-faces (pattern &optional msgp)
   "Customize all loaded faces matching PATTERN.
 See `icicle-customize-apropos'."
   (interactive
-   (let* ((pred                                    (lambda (s)
-                                                     (unless (symbolp s) (setq s  (intern s)))
-                                                     (custom-facep s)))
-          (icompletep                              (and (featurep 'icomplete)  icomplete-mode))
-          (icicle-must-pass-after-match-predicate  (and (not icompletep)  pred)))
-     (list (completing-read "Customize faces (pattern): " obarray (and icompletep  pred)
-                            nil nil 'regexp-history)
-           t)))
+   (let* ((prompt                                  "Customize faces (pattern): ")
+          (face-list                               (face-list))
+          (icicle-multi-completing-p               t)
+          (icicle-list-nth-parts-join-string       ": ")
+          (icicle-list-join-string                 ": ")
+          (icicle-list-use-nth-parts               '(1))
+          (icicle-face-completing-p                t))
+     (put-text-property 0 1 'icicle-fancy-candidates t prompt)
+     (let ((input  (icicle-transform-multi-completion
+                    (completing-read prompt (mapcar #'icicle-make-face-candidate face-list)
+                                     nil nil nil 'regexp-history))))
+       (when (and (fboundp 'apropos-read-pattern)  (string= (regexp-quote input) input))
+         (setq input  (or (split-string input "[ \t]+" t)  (user-error "No word list given"))))
+       (list input  t))))
   (when msgp (message "Gathering apropos data for customizing faces..."))
   (customize-apropos pattern 'faces))
 
@@ -2465,6 +2782,7 @@ See `icicle-apropos' for a description of PATTERN."
                                                                        (get s 'variable-documentation))))
                      (icompletep                                (and (featurep 'icomplete)  icomplete-mode))
                      (icicle-must-pass-after-match-predicate    (and (not icompletep)  pred))
+                     (icicle-variable-completing-p              t)
                      (icicle-candidate-alt-action-fn            (or icicle-candidate-alt-action-fn
                                                                     (icicle-alt-act-fn-for-type "variable")))
                      (icicle-all-candidates-list-alt-action-fn ; `M-|'
@@ -2494,8 +2812,8 @@ See `icicle-apropos' for a description of PATTERN."
              (icompletep                              (and (featurep 'icomplete)  icomplete-mode))
              (icicle-must-pass-after-match-predicate  (and (not icompletep)  pred)))
         (list (completing-read
-               (concat "Apropos user option (regexp" (and (>= emacs-major-version 22)  " or words")
-                       "): ") obarray (and icompletep  pred) nil nil 'regexp-history)
+               (concat "Apropos user option (regexp" (and (>= emacs-major-version 22)  " or words") "): ")
+               obarray (and icompletep  pred) nil nil 'regexp-history)
               t)))
      (let ((apropos-do-all  nil)
            (icicle-candidate-alt-action-fn
@@ -2542,6 +2860,7 @@ using face `icicle-special-candidate'."
                                                                   (user-variable-p s))))
                      (icompletep                              (and (featurep 'icomplete)  icomplete-mode))
                      (icicle-must-pass-after-match-predicate  (and (not icompletep)  pred))
+                     (icicle-variable-completing-p            t)
                      (icicle-candidate-alt-action-fn          (or icicle-candidate-alt-action-fn
                                                                   (icicle-alt-act-fn-for-type
                                                                    (if icicle-fancy-candidates-p
@@ -2593,8 +2912,8 @@ See `icicle-apropos' for a description of PATTERN."
                       (or icicle-all-candidates-list-alt-action-fn
                           (icicle-alt-act-fn-for-type "function"))))
                 (completing-read
-                 (concat "Apropos function (regexp" (and (>= emacs-major-version 22)  " or words")
-                         "): ") obarray (and icompletep  pred) nil nil 'regexp-history)))
+                 (concat "Apropos function (regexp" (and (>= emacs-major-version 22)  " or words") "): ")
+                 obarray (and icompletep  pred) nil nil 'regexp-history)))
          (mapatoms (lambda (symb) (put symb 'icicle-special-candidate nil))))
        t))
      (when (and (> emacs-major-version 21)  (require 'apropos nil t)
@@ -2620,8 +2939,8 @@ See `icicle-apropos' for a description of PATTERN."
              (icicle-all-candidates-list-alt-action-fn  (or icicle-all-candidates-list-alt-action-fn ; `M-|'
                                                             (icicle-alt-act-fn-for-type "command"))))
         (list (completing-read
-               (concat "Apropos command (regexp" (and (>= emacs-major-version 22)  " or words")
-                       "): ") obarray (and icompletep  pred) nil nil 'regexp-history)
+               (concat "Apropos command (regexp" (and (>= emacs-major-version 22)  " or words") "): ")
+               obarray (and icompletep  pred) nil nil 'regexp-history)
               t)))
      (when (and (> emacs-major-version 21)  (require 'apropos nil t)
                 (string= (regexp-quote pattern) pattern)
@@ -2744,7 +3063,7 @@ Return the list of matches."
                                                nil nil nil 'regexp-history)))))
   (let ((matches  (apropos-zippy icicle-current-input)))
     (when (interactive-p)
-      (with-output-to-temp-buffer "*Zippy Apropos*"
+      (icicle-with-help-window "*Zippy Apropos*"
         (while matches
           (princ (car matches))
           (setq matches  (cdr matches))
@@ -3929,7 +4248,14 @@ To use `icicle-explore' to define a multi-command, you must also bind
 Though `icicle-explore' is typically used to define navigation
 commands, it need not be.  It can be useful anytime you need to use
 `completing-read' and also provide specific behavior for quitting
-\(`C-g'), completion errors, and final actions."
+\(`C-g'), completion errors, and final actions.
+
+Note: `icicle-explore' binds user option
+`icicle-incremental-completion' to `always', because I think you
+typically want to start it out with incremental completion turned on.
+Functions that call `icicle-explore' thus also turn on incremental
+completion.  Remember that you can use `C-#' (once or twice) to turn
+incremental completion off."
   (let ((icicle-incremental-completion          'always)
         (icicle-whole-candidate-as-text-prop-p  t)
         (icicle-transform-function              (and (not (interactive-p))  icicle-transform-function))
@@ -4561,10 +4887,6 @@ candidates, as follows:
    (icicle-all-candidates-list-alt-action-fn ; `M-|'
     (or icicle-all-candidates-list-alt-action-fn  alt-fn  (icicle-alt-act-fn-for-type "option")))))
 
-(defun icicle-binary-option-p (symbol)
-  "Non-nil if SYMBOL is a user option that has custom-type `boolean'."
-  (eq (icicle-get-safe symbol 'custom-type) 'boolean))
-
 (icicle-define-command icicle-increment-option ; Command name
   "Increment option's value using the arrow keys (`up', `down').
 Completion candidates are limited to options that have `integer',
@@ -4767,7 +5089,7 @@ Note: You can use command `icicle-bookmark-set' with a numeric
 prefix arg if you want to complete against all bookmark names,
 instead of those for the current buffer."
   (interactive (list nil current-prefix-arg t))
-  (if (not (featurep 'bookmark+))
+  (if (not (require 'bookmark+ nil t))
       (bookmark-set name parg)
     (unwind-protect
          (let ((enable-recursive-minibuffers           t) ; In case read input, e.g. File changed...
@@ -4827,11 +5149,9 @@ instead of those for the current buffer."
                                 icicle-alpha-p)))
                         '(("by previous use alphabetically" . icicle-historical-alphabetic-p)
                           ("case insensitive" . icicle-case-insensitive-string-less-p)))))
-           (require 'bookmark)
-           (when (featurep 'bookmark+)
-             ;; Bind keys to narrow bookmark candidates by type.  Lax is for multi-completion case.
-             (dolist (map  '(minibuffer-local-must-match-map minibuffer-local-completion-map))
-               (icicle-bookmark-bind-narrow-commands map)))
+           ;; Bind keys to narrow bookmark candidates by type.  Lax is for multi-completion case.
+           (dolist (map  '(minibuffer-local-must-match-map minibuffer-local-completion-map))
+             (icicle-bookmark-bind-narrow-commands map))
            (setq bookmark-current-point   (point)
                  bookmark-current-buffer  (current-buffer))
            (save-excursion (skip-chars-forward " ") (setq bookmark-yank-point  (point)))
@@ -4855,11 +5175,17 @@ instead of those for the current buffer."
                                                                          'bookmark-history
                                                                        'icicle-bookmark-history))))))
              (when (string-equal bname "") (setq bname  defname))
-             (when (and interactivep  (boundp 'bmkp-bookmark-set-confirms-overwrite-p)
-                        bmkp-bookmark-set-confirms-overwrite-p  (atom parg)
-                        (bmkp-get-bookmark-in-alist bname 'NOERROR)
-                        (not (y-or-n-p (format "Overwirte bookmark `%s'? " bname))))
-               (error "OK, canceled"))
+             (let ((old-bmk  (bmkp-get-bookmark-in-alist bname 'NOERROR))
+                   old-prop)
+               (when (and interactivep  (boundp 'bmkp-bookmark-set-confirms-overwrite-p)
+                          bmkp-bookmark-set-confirms-overwrite-p  (atom parg)  old-bmk
+                          (not (y-or-n-p (format "Overwrite bookmark `%s'? " bname))))
+                 (error "OK, canceled"))
+               (when old-bmk            ; Restore props of existing bookmark per `bmkp-properties-to-keep'.
+                 (if (boundp 'bmkp-properties-to-keep)
+                     (dolist (prop  bmkp-properties-to-keep)
+                       (bookmark-prop-set record prop (bookmark-prop-get old-bmk prop)))
+                   (message "You should UPDATE to the latest version of Bookmark+") (sit-for 2)))) ; $$$$$$
              (bookmark-store bname (cdr record) (consp parg))
              (when (and interactivep  bmkp-prompt-for-tags-flag)
                (bmkp-add-tags bname (bmkp-read-tags-completing))) ; Don't bother to refresh tags. (?)
@@ -5081,36 +5407,53 @@ If you also use library `Bookmark+', then:
    (Each `C-M-j' inserts `^G\n', which is `icicle-list-join-string'.)
 
  * You can narrow the current completion candidates to bookmarks of a
-   given type.  The keys for this are the same as the bookmark-jumping
-   keys at the top level.
-
-   `C-x j a'   - autofile bookmarks
-   `C-x j b'   - non-file (buffer) bookmarks
-   `C-x j B'   - bookmark-list bookmarks
-   `C-x j d'   - Dired bookmarks
-   `C-x j f'   - file bookmarks
-   `C-x j . f' - bookmarks to files in the current directory
-   `C-x j g'   - Gnus bookmarks
-   `C-x j i'   - Info bookmarks
-   `C-x j M-i' - image bookmarks
-   `C-x j K'   - desktop bookmarks
-   `C-x j l'   - local-file bookmarks
-   `C-x j m'   - `man' pages
-   `C-x j n'   - remote-file bookmarks
-   `C-x j r'   - bookmarks with regions
-   `C-x j u'   - URL bookmarks
-   `C-x j w'   - W3M (URL) bookmarks
-   `C-x j x'   - temporary bookmarks
-   `C-x j y'   - bookmark-file bookmarks
-   `C-x j #'   - autonamed bookmarks
-   `C-x j , #' - autonamed bookmarks for the current buffer
-   `C-x j , ,' - bookmarks for the current buffer
-   `C-x j = b' - bookmarks for specific buffers
-   `C-x j = f' - bookmarks for specific files
+   given type.  The keys for this are generally the same as the
+   bookmark-jumping keys at the top level.
+
+   `C-x j a'    - autofile bookmarks
+   `C-x j b'    - non-file (buffer) bookmarks
+   `C-x j B'    - bookmark-list bookmarks
+   `C-x j C-c ` - bookmarks that record Icicles search hits
+   `C-x j d'    - Dired bookmarks
+   `C-x j . d'  - Dired bookmarks for `default-directory'
+   `C-x j * d'  - bookmarks for Dired buffers with wildcards
+   `C-x j D'    - bookmarks flagged for deletion in `*Bookmark List*'
+   `C-x j f'    - file bookmarks
+   `C-x j . f'  - bookmarks to files in the current directory
+   `C-x j F'    - function bookmarks
+   `C-x j g'    - Gnus bookmarks
+   `C-x j h'    - bookmarks that are currently highlighted
+   `C-x j i'    - Info bookmarks
+   `C-x j M-i'  - image bookmarks
+   `C-x j K'    - desktop bookmarks
+   `C-x j l'    - local-file bookmarks
+   `C-x j m'    - `man' pages
+   `C-x j M'    - modified (unsaved) bookmarks
+   `C-x j n'    - remote-file bookmarks
+   `C-x j N'    - bookmarks currently in the navigation list
+   `C-x j o f'  - orphaned file bookmarks
+   `C-x j o l'  - orphaned local-file bookmarks
+   `C-x j r'    - bookmarks with regions
+   `C-x j C-t'  - tagged bookmarks
+   `C-x j v'    - variable-list bookmarks
+   `C-x j u'    - URL bookmarks
+   `C-x j w'    - W3M (URL) bookmarks
+   `C-x j M-w'  - snippet bookmarks
+   `C-x j x'    - temporary bookmarks
+   `C-x j y'    - bookmark-file bookmarks
+   `C-x j #'    - autonamed bookmarks
+   `C-x j , #'  - autonamed bookmarks for the current buffer
+   `C-x j , ,'  - bookmarks for the current buffer
+   `C-x j = b'  - bookmarks for specific buffers
+   `C-x j = f'  - bookmarks for specific files
+   `C-x j >'    - bookmarks marked in `*Bookmark List*'
 
    See also the individual multi-commands for different bookmark
    types: `icicle-bookmark-info-other-window' etc.
 
+ * You can also use `M-&' and choose a bookmark-narrowing predicate.
+   These are more or less the same narrowings provided by the keys.
+
  * `C-S-RET', the alternative candidate action, prompts you for a
    property of the candidate bookmark and a function, then applies the
    function to the property.  Completion is available for the
@@ -5127,6 +5470,7 @@ position is highlighted."               ; Doc string
    (completion-ignore-case                 bookmark-completion-ignore-case)
    (prompt                                 "Bookmark: ")
    (icicle-multi-completing-p              icicle-show-multi-completion-flag)
+   (icicle-bookmark-completing-p           t)
    (icicle-list-use-nth-parts              '(1))
    (icicle-candidate-properties-alist      (if (not icicle-multi-completing-p)
                                                ()
@@ -5198,6 +5542,7 @@ Same as `icicle-bookmark', but uses another window." ; Doc string
    (completion-ignore-case                 bookmark-completion-ignore-case)
    (prompt                                 "Bookmark: ")
    (icicle-multi-completing-p              icicle-show-multi-completion-flag)
+   (icicle-bookmark-completing-p           t)
    (icicle-list-use-nth-parts              '(1))
    (icicle-candidate-properties-alist      (if (not icicle-multi-completing-p)
                                                ()
@@ -5262,42 +5607,80 @@ Same as `icicle-bookmark', but uses another window." ; Doc string
   (when (featurep 'bookmark+)
     ;; Lax completion is for multi-completion case.
     (dolist (map  '(minibuffer-local-must-match-map  minibuffer-local-completion-map))
+      (define-key (symbol-value map) (icicle-kbd "C-x j >") ; `C-x j >'
+        'icicle-bookmark-marked-narrow)
       (define-key (symbol-value map) (icicle-kbd "C-x j #") ; `C-x j #'
         'icicle-bookmark-autonamed-narrow)
       (define-key (symbol-value map) (icicle-kbd "C-x j , #") ; `C-x j , #'
         'icicle-bookmark-autonamed-this-buffer-narrow)
+      (define-key (symbol-value map) (icicle-kbd "C-x j A") ; `C-x j A'
+        'icicle-bookmark-annotated-narrow)
       (define-key (symbol-value map) (icicle-kbd "C-x j a") ; `C-x j a'
         'icicle-bookmark-autofile-narrow)
       (define-key (symbol-value map) (icicle-kbd "C-x j b") ; `C-x j b'
         'icicle-bookmark-non-file-narrow)
       (define-key (symbol-value map) (icicle-kbd "C-x j B") ; `C-x j B'
         'icicle-bookmark-bookmark-list-narrow)
+      (define-key (symbol-value map) (icicle-kbd "C-x j C-c `") ; `C-x j C-c `'
+        'icicle-bookmark-icicle-search-hits-narrow)
       (define-key (symbol-value map) (icicle-kbd "C-x j d") ; `C-x j d'
         'icicle-bookmark-dired-narrow)
+      (define-key (symbol-value map) (icicle-kbd "C-x j . d") ; `C-x j . d'
+        'icicle-bookmark-dired-this-dir-narrow)
+      (define-key (symbol-value map) (icicle-kbd "C-x j * d") ; `C-x j * d'
+        'icicle-bookmark-dired-wildcards-narrow)
+      (define-key (symbol-value map) (icicle-kbd "C-x j D") ; `C-x j D'
+        'icicle-bookmark-flagged-narrow)
       (define-key (symbol-value map) (icicle-kbd "C-x j f") ; `C-x j f'
         'icicle-bookmark-file-narrow)
       (define-key (symbol-value map) (icicle-kbd "C-x j . f") ; `C-x j . f'
         'icicle-bookmark-file-this-dir-narrow)
+      (define-key (symbol-value map) (icicle-kbd "C-x j F") ; `C-x j F'
+        'icicle-bookmark-function-narrow)
       (define-key (symbol-value map) (icicle-kbd "C-x j g") ; `C-x j g'
         'icicle-bookmark-gnus-narrow)
+      (define-key (symbol-value map) (icicle-kbd "C-x j h") ; `C-x j h'
+        'icicle-bookmark-lighted-narrow)
       (define-key (symbol-value map) (icicle-kbd "C-x j i") ; `C-x j i'
         'icicle-bookmark-info-narrow)
       (define-key (symbol-value map) (icicle-kbd "C-x j M-i") ; `C-x j M-i'
         'icicle-bookmark-image-narrow)
+;;;       (define-key (symbol-value map) (icicle-kbd "C-x j = b")
+;;;         'icicle-bookmark-last-specific-buffer-narrow)
+;;;       (define-key (symbol-value map) (icicle-kbd "C-x j = f")
+;;;         'icicle-bookmark-last-specific-file-narrow)
       (define-key (symbol-value map) (icicle-kbd "C-x j K") ; `C-x j K'
         'icicle-bookmark-desktop-narrow)
       (define-key (symbol-value map) (icicle-kbd "C-x j l") ; `C-x j l'
         'icicle-bookmark-local-file-narrow)
       (define-key (symbol-value map) (icicle-kbd "C-x j m") ; `C-x j m'
         'icicle-bookmark-man-narrow)
+      (define-key (symbol-value map) (icicle-kbd "C-x j M") ; `C-x j M'
+        'icicle-bookmark-modified-narrow)
       (define-key (symbol-value map) (icicle-kbd "C-x j n") ; `C-x j n'
         'icicle-bookmark-remote-file-narrow)
+      (define-key (symbol-value map) (icicle-kbd "C-x j N") ; `C-x j N'
+        'icicle-bookmark-navlist-narrow)
+      (define-key (symbol-value map) (icicle-kbd "C-x j o f") ; `C-x j o f'
+        'icicle-bookmark-orphaned-file-narrow)
+      (define-key (symbol-value map) (icicle-kbd "C-x j o l") ; `C-x j o l'
+        'icicle-bookmark-orphaned-local-file-narrow)
+      (define-key (symbol-value map) (icicle-kbd "C-x j o n") ; `C-x j o n'
+        'icicle-bookmark-orphaned-remote-file-narrow)
       (define-key (symbol-value map) (icicle-kbd "C-x j r") ; `C-x j r'
         'icicle-bookmark-region-narrow)
+      (define-key (symbol-value map) (icicle-kbd "C-x j s") ; `C-x j s'
+        'icicle-bookmark-sequence-narrow)
       (define-key (symbol-value map) (icicle-kbd "C-x j u") ; `C-x j u'
         'icicle-bookmark-url-narrow)
+      (define-key (symbol-value map) (icicle-kbd "C-x j C-t") ; `C-x j C-t' (`C-x j t' is prefix key for jumps)
+        'icicle-bookmark-tagged-narrow)
+      (define-key (symbol-value map) (icicle-kbd "C-x j v") ; `C-x j v'
+        'icicle-bookmark-variable-list-narrow)
       (define-key (symbol-value map) (icicle-kbd "C-x j w") ; `C-x j w'
         'icicle-bookmark-w3m-narrow)
+      (define-key (symbol-value map) (icicle-kbd "C-x j M-w") ; `C-x j M-w'
+        'icicle-bookmark-snippet-narrow)
       (define-key (symbol-value map) (icicle-kbd "C-x j x") ; `C-x j x'
         'icicle-bookmark-temporary-narrow)
       (define-key (symbol-value map) (icicle-kbd "C-x j y") ; `C-x j y'
@@ -5384,10 +5767,12 @@ You probably do not want to use this.  Use
 
 (defun icicle-bookmark-jump-1 (bookmark &optional other-window-p)
   "Helper function for `icicle-bookmark-jump(-other-window)'."
-  (unless bookmark (error "No bookmark specified"))
-  (bookmark-maybe-historicize-string bookmark)
-  ;; In case the jump renames it (as for an autonamed bookmark).
-  (setq bookmark  (bookmark-get-bookmark bookmark 'NOERROR))
+  (let ((input-bmk  bookmark))
+    (unless input-bmk (error "No bookmark specified"))
+    (bookmark-maybe-historicize-string bookmark)
+    ;; In case the jump renames it (as for an autonamed bookmark).
+    (setq bookmark  (bookmark-get-bookmark bookmark 'NOERROR))
+    (unless bookmark (error "No such bookmark: `%s'" input-bmk)))
   (if (fboundp 'bookmark--jump-via)
       (bookmark--jump-via bookmark (if other-window-p 'pop-to-buffer 'switch-to-buffer))
     (let ((cell  (bookmark-jump-noselect bookmark))) ; Emacs < 23 and without `Bookmark+'.
@@ -5444,128 +5829,233 @@ Remove crosshairs highlighting and unbind filtering keys."
 
 ;;; These are minibuffer commands, but we define them here instead of in `icicles-mcmd.el'.
 
+(defun icicle-bookmark-annotated-narrow () ; Bound to `C-x j A' in minibuffer for completion.
+  "Narrow the bookmark candidates to bookmarks that have annotations."
+  (interactive)
+  (when (featurep 'bookmark+)
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-annotated-p)))
+
 (defun icicle-bookmark-autofile-narrow () ; Bound to `C-x j a' in minibuffer for completion.
   "Narrow the bookmark candidates to autofile bookmarks."
   (interactive)
   (when (featurep 'bookmark+)
-    (icicle-narrow-candidates-with-predicate
-     (lambda (x) (bmkp-autofile-bookmark-p (icicle-transform-multi-completion (car x)))))))
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-autofile-p)))
 
 (defun icicle-bookmark-autonamed-narrow () ; Bound to `C-x j #' in minibuffer for completion.
   "Narrow the bookmark candidates to autonamed bookmarks."
   (interactive)
   (when (featurep 'bookmark+)
-    (icicle-narrow-candidates-with-predicate
-     (lambda (x)
-       (bmkp-autonamed-bookmark-p (icicle-transform-multi-completion (car x)))))))
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-autonamed-p)))
 
 (defun icicle-bookmark-autonamed-this-buffer-narrow ()
                                         ; Bound to `C-x j , #' in minibuffer for completion.
   "Narrow bookmark candidates to autonamed bookmarks in current buffer."
   (interactive)
   (when (featurep 'bookmark+)
-    (icicle-narrow-candidates-with-predicate
-     (lambda (x)                          ; FREE here: ICICLE-ORIG-BUFF.
-       (with-current-buffer icicle-orig-buff
-         (bmkp-autonamed-this-buffer-bookmark-p (icicle-transform-multi-completion (car x))))))))
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-autonamed-this-buffer-p)))
 
 (defun icicle-bookmark-bookmark-file-narrow () ; Bound to `C-x j y' in minibuffer for completion.
   "Narrow the bookmark candidates to bookmark-file bookmarks."
   (interactive)
   (when (featurep 'bookmark+)
-    (icicle-narrow-candidates-with-predicate
-     (lambda (x) (bmkp-bookmark-file-bookmark-p (icicle-transform-multi-completion (car x)))))))
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-bookmark-file-p)))
 
 (defun icicle-bookmark-bookmark-list-narrow () ; Bound to `C-x j B' in minibuffer for completion.
   "Narrow the bookmark candidates to bookmark-list bookmarks."
   (interactive)
   (when (featurep 'bookmark+)
-    (icicle-narrow-candidates-with-predicate
-     (lambda (x) (bmkp-bookmark-list-bookmark-p (icicle-transform-multi-completion (car x)))))))
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-bookmark-list-p)))
 
 (defun icicle-bookmark-desktop-narrow ()   ; Bound to `C-x j K' in minibuffer for bookmark completion.
   "Narrow the bookmark candidates to desktop bookmarks."
   (interactive)
   (when (featurep 'bookmark+)
-    (icicle-narrow-candidates-with-predicate
-     (lambda (x) (bmkp-desktop-bookmark-p (icicle-transform-multi-completion (car x)))))))
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-desktop-p)))
 
 (defun icicle-bookmark-dired-narrow ()   ; Bound to `C-x j d' in minibuffer for bookmark completion.
   "Narrow the bookmark candidates to Dired bookmarks."
   (interactive)
   (when (featurep 'bookmark+)
-    (icicle-narrow-candidates-with-predicate
-     (lambda (x) (bmkp-dired-bookmark-p (icicle-transform-multi-completion (car x)))))))
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-dired-p)))
+
+(defun icicle-bookmark-dired-this-dir-narrow ()   ; Bound to `C-x j . d' in minibuffer for bmk completion.
+  "Narrow the bookmark candidates to Dired bookmarks for `default-directory'."
+  (interactive)
+  (when (featurep 'bookmark+)
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-dired-this-dir-p)))
+
+(defun icicle-bookmark-dired-wildcards-narrow ()   ; Bound to `C-x j * d' in minibuffer for bmk completion.
+  "Narrow the bookmark candidates to bookmarks for Dired with wildcards."
+  (interactive)
+  (when (featurep 'bookmark+)
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-dired-wildcards-p)))
 
 (defun icicle-bookmark-file-narrow ()   ; Bound to `C-x j f' in minibuffer for bookmark completion.
   "Narrow the bookmark candidates to file bookmarks."
   (interactive)
   (when (featurep 'bookmark+)
-    (icicle-narrow-candidates-with-predicate
-     (lambda (x) (bmkp-file-bookmark-p (icicle-transform-multi-completion (car x)))))))
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-file-p)))
 
 (defun icicle-bookmark-file-this-dir-narrow () ; Bound to `C-x j . f' in minibuffer for completion.
   "Narrow the bookmark candidates to bookmarked files in `default-directory'."
   (interactive)
   (when (featurep 'bookmark+)
-    (icicle-narrow-candidates-with-predicate
-     (lambda (x) (bmkp-file-this-dir-bookmark-p (icicle-transform-multi-completion (car x)))))))
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-file-this-dir-p)))
+
+(defun icicle-bookmark-flagged-narrow ()   ; Bound to `C-x j D' in minibuffer for bookmark completion.
+  "Narrow the candidates to bookmarks flagged for deletion in `*Bookmark List*'."
+  (interactive)
+  (when (featurep 'bookmark+)
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-flagged-p)))
+
+(defun icicle-bookmark-function-narrow ()   ; Bound to `C-x j F' in minibuffer for bookmark completion.
+  "Narrow the bookmark candidates to function bookmarks."
+  (interactive)
+  (when (featurep 'bookmark+)
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-function-p)))
 
 (defun icicle-bookmark-gnus-narrow ()   ; Bound to `C-x j g' in minibuffer for bookmark completion.
   "Narrow the bookmark candidates to Gnus bookmarks."
   (interactive)
   (when (featurep 'bookmark+)
-    (icicle-narrow-candidates-with-predicate
-     (lambda (x) (bmkp-gnus-bookmark-p (icicle-transform-multi-completion (car x)))))))
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-gnus-p)))
+
+(defun icicle-bookmark-icicle-search-hits-narrow ()   ; Bound to `C-x j C-c `' in minibuf for bmk completion.
+  "Narrow the candidates to bookmarks that record Icicles search hits."
+  (interactive)
+  (when (featurep 'bookmark+)
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-icicle-search-hits-p)))
 
 (defun icicle-bookmark-image-narrow ()   ; Bound to `C-x j M-i' in minibuffer for bookmark completion.
   "Narrow the bookmark candidates to image bookmarks."
   (interactive)
   (when (featurep 'bookmark+)
-    (icicle-narrow-candidates-with-predicate
-     (lambda (x) (bmkp-image-bookmark-p (icicle-transform-multi-completion (car x)))))))
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-image-p)))
 
 (defun icicle-bookmark-info-narrow ()   ; Bound to `C-x j i' in minibuffer for bookmark completion.
   "Narrow the bookmark candidates to Info bookmarks."
   (interactive)
   (when (featurep 'bookmark+)
-    (icicle-narrow-candidates-with-predicate
-     (lambda (x) (bmkp-info-bookmark-p (icicle-transform-multi-completion (car x)))))))
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-info-p)))
+
+;;; (defun icicle-bookmark-last-specific-buffer-narrow ()
+;;;   "Narrow the candidates to bookmarks for buffer `bmkp-last-specific-buffer'.
+;;; That is the buffer last used by command `bmkp-this-buffer-bmenu-list'
+;;; to list bookmarks for a specific buffer in `*Bookmark List*'."
+;;;   (interactive)
+;;;   (when (featurep 'bookmark+)
+;;;     (icicle-narrow-candidates-with-predicate #'icicle-bookmark-last-specific-buffer-p)))
+
+;;; (defun icicle-bookmark-last-specific-file-narrow ()
+;;;   "Narrow the candidates to bookmarks for file `bmkp-last-specific-file'.
+;;; That is the file last used by command `bmkp-this-file-bmenu-list' to
+;;; list bookmarks for a specific file in `*Bookmark List*'."
+;;;   (interactive)
+;;;   (when (featurep 'bookmark+)
+;;;     (icicle-narrow-candidates-with-predicate #'icicle-bookmark-last-specific-file-p)))
+
+(defun icicle-bookmark-lighted-narrow () ; Bound to `C-x j h' for bookmark completion.
+  "Narrow the bookmark candidates to highlighted bookmarks."
+  (interactive)
+  (when (featurep 'bookmark+-lit)
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-lighted-p)))
+
+;;; (defun icicle-bookmark-local-directory-narrow ()
+;;;   "Narrow the bookmark candidates to local-directory bookmarks."
+;;;   (interactive)
+;;;   (when (featurep 'bookmark+)
+;;;     (icicle-narrow-candidates-with-predicate #'icicle-bookmark-local-directory-p)))
 
 (defun icicle-bookmark-local-file-narrow () ; Bound to `C-x j l' for bookmark completion.
   "Narrow the bookmark candidates to local-file bookmarks."
   (interactive)
   (when (featurep 'bookmark+)
-    (icicle-narrow-candidates-with-predicate
-     (lambda (x) (bmkp-local-file-bookmark-p (icicle-transform-multi-completion (car x)))))))
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-local-file-p)))
 
 (defun icicle-bookmark-man-narrow () ; Bound to `C-x j m' in minibuffer for bookmark completion.
   "Narrow the bookmark candidates to `man'-page bookmarks."
   (interactive)
   (when (featurep 'bookmark+)
-    (icicle-narrow-candidates-with-predicate
-     (lambda (x) (bmkp-man-bookmark-p (icicle-transform-multi-completion (car x)))))))
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-man-p)))
+
+(defun icicle-bookmark-marked-narrow ()   ; Bound to `C-x j >' in minibuffer for bookmark completion.
+  "Narrow the candidates to bookmarks marked in `*Bookmark List*'."
+  (interactive)
+  (when (featurep 'bookmark+)
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-marked-p)))
+
+(defun icicle-bookmark-modified-narrow ()   ; Bound to `C-x j M' in minibuffer for bookmark completion.
+  "Narrow the candidates to modified (unsaved) bookmarks."
+  (interactive)
+  (when (featurep 'bookmark+)
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-modified-p)))
+
+(defun icicle-bookmark-navlist-narrow ()   ; Bound to `C-x j N' in minibuffer for bookmark completion.
+  "Narrow the candidates to bookmarks in the current navigation list."
+  (interactive)
+  (when (featurep 'bookmark+)
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-navlist-p)))
+
+;;; Not used yet.
+;;; (defun icicle-bookmark-non-dir-file-narrow ()   ; Not bound.
+;;;   "Narrow the bookmark candidates to non-directory file bookmarks."
+;;;   (interactive)
+;;;   (when (featurep 'bookmark+)
+;;;     (icicle-narrow-candidates-with-predicate #'icicle-bookmark-non-dir-file-p)))
 
 (defun icicle-bookmark-non-file-narrow () ; Bound to `C-x j b' in minibuffer for bookmark completion.
   "Narrow the bookmark candidates to non-file (buffer-only) bookmarks."
   (interactive)
   (when (featurep 'bookmark+)
-    (icicle-narrow-candidates-with-predicate
-     (lambda (x) (bmkp-non-file-bookmark-p (icicle-transform-multi-completion (car x)))))))
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-non-file-p)))
+
+;;; (defun icicle-bookmark-omitted-narrow ()
+;;;   "Narrow the candidates to bookmarks that are omitted in `*Bookmark List*'."
+;;;   (interactive)
+;;;   (when (featurep 'bookmark+)
+;;;     (icicle-narrow-candidates-with-predicate #'icicle-bookmark-omitted-p)))
+
+(defun icicle-bookmark-orphaned-file-narrow () ; Bound to `C-x j o f' in minibuffer for bookmark completion.
+  "Narrow the bookmark candidates to orphaned-file bookmarks."
+  (interactive)
+  (when (featurep 'bookmark+)
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-orphaned-file-p)))
+
+(defun icicle-bookmark-orphaned-local-file-narrow () ; Bound to `C-x j o l' in minibuffer for bmk completion.
+  "Narrow the bookmark candidates to orphaned-local-file bookmarks."
+  (interactive)
+  (when (featurep 'bookmark+)
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-orphaned-local-file-p)))
+
+(defun icicle-bookmark-orphaned-remote-file-narrow () ; Bound to `C-x j o n' in minibuffer for bmk completion.
+  "Narrow the bookmark candidates to orphaned-remote-file bookmarks."
+  (interactive)
+  (when (featurep 'bookmark+)
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-orphaned-remote-file-p)))
 
 (defun icicle-bookmark-region-narrow () ; Bound to `C-x j r' in minibuffer for bookmark completion.
   "Narrow the bookmark candidates to bookmarks with regions."
   (interactive)
   (when (featurep 'bookmark+)
-    (icicle-narrow-candidates-with-predicate
-     (lambda (x) (bmkp-region-bookmark-p (icicle-transform-multi-completion (car x)))))))
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-region-p)))
 
 (defun icicle-bookmark-remote-file-narrow () ; Bound to `C-x j n' in minibuf for bookmark completion.
   "Narrow the bookmark candidates to remote-file bookmarks."
   (interactive)
   (when (featurep 'bookmark+)
-    (icicle-narrow-candidates-with-predicate
-     (lambda (x) (bmkp-remote-file-bookmark-p (icicle-transform-multi-completion (car x)))))))
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-remote-file-p)))
+
+(defun icicle-bookmark-sequence-narrow () ; Bound to `C-x j s' in minibuffer for bookmark completion.
+  "Narrow the bookmark candidates to sequence (composite) bookmarks."
+  (interactive)
+  (when (featurep 'bookmark+)
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-sequence-p)))
+
+(defun icicle-bookmark-snippet-narrow () ; Bound to `C-x j M-w' in minibuffer for bookmark completion.
+  "Narrow the bookmark candidates to snippet bookmarks."
+  (interactive)
+  (when (featurep 'bookmark+)
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-snippet-p)))
 
 (defun icicle-bookmark-specific-buffers-narrow (buffers) ; `C-x j = b' for bookmark completion.
   "Narrow the bookmark candidates to bookmarks for specific BUFFERS.
@@ -5586,35 +6076,48 @@ You are prompted for the FILES."
      `(lambda (x)
        (member (bookmark-get-filename (icicle-transform-multi-completion (car x))) ',files)))))
 
+(defun icicle-bookmark-tagged-narrow () ; Bound to `C-x j C-t' in minibuffer for bookmark completion.
+  "Narrow the bookmark candidates to tagged bookmarks."
+  (interactive)
+  (when (featurep 'bookmark+)
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-tagged-p)))
+
 (defun icicle-bookmark-temporary-narrow () ; Bound to `C-x j x' in minibuffer for completion.
   "Narrow the bookmark candidates to temporary bookmarks."
   (interactive)
   (when (featurep 'bookmark+)
-    (icicle-narrow-candidates-with-predicate
-     (lambda (x) (bmkp-temporary-bookmark-p (icicle-transform-multi-completion (car x)))))))
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-temporary-p)))
 
 (defun icicle-bookmark-this-buffer-narrow () ; `C-x j , ,' in minibuffer for bookmark completion.
   "Narrow the bookmark candidates to bookmarks for the current buffer."
   (interactive)
   (when (featurep 'bookmark+)
-    (icicle-narrow-candidates-with-predicate
-     (lambda (x)                          ; FREE here: ICICLE-ORIG-BUFF.
-       (with-current-buffer icicle-orig-buff
-         (bmkp-this-buffer-p (icicle-transform-multi-completion (car x))))))))
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-this-buffer-p)))
+
+;;; (defun icicle-bookmark-this-file-narrow ()
+;;;   "Narrow the bookmark candidates to bookmarks for the current file."
+;;;   (interactive)
+;;;   (when (featurep 'bookmark+)
+;;;     (icicle-narrow-candidates-with-predicate #'icicle-bookmark-this-file-p)))
 
 (defun icicle-bookmark-url-narrow ()    ; Bound to `C-x j u' in minibuffer for bookmark completion.
   "Narrow the bookmark candidates to URL bookmarks."
   (interactive)
   (when (featurep 'bookmark+)
     (icicle-narrow-candidates-with-predicate
-     (lambda (x) (bmkp-url-bookmark-p (icicle-transform-multi-completion (car x)))))))
+     (lambda (bmk) (or (icicle-bookmark-url-browse-p bmk)  (icicle-bookmark-url-p bmk))))))
+
+(defun icicle-bookmark-variable-list-narrow ()    ; Bound to `C-x j v' in minibuffer for bookmark completion.
+  "Narrow the bookmark candidates to variable-list bookmarks."
+  (interactive)
+  (when (featurep 'bookmark+)
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-variable-list-p)))
 
 (defun icicle-bookmark-w3m-narrow ()    ; Bound to `C-x j w' in minibuffer for bookmark completion.
   "Narrow the bookmark candidates to W3M (URL) bookmarks."
   (interactive)
   (when (featurep 'bookmark+)
-    (icicle-narrow-candidates-with-predicate
-     (lambda (x) (bmkp-w3m-bookmark-p (icicle-transform-multi-completion (car x)))))))
+    (icicle-narrow-candidates-with-predicate #'icicle-bookmark-w3m-p)))
 
 
 ;; The following sexps macro-expand to define these commands:
@@ -5647,10 +6150,13 @@ You are prompted for the FILES."
 ;;  `icicle-bookmark-image',                     `icicle-bookmark-image-other-window',
 ;;  `icicle-bookmark-info',                      `icicle-bookmark-info-other-window',
 ;;  `icicle-bookmark-local-file',                `icicle-bookmark-local-file-other-window',
+;;  `icicle-bookmark-local-non-dir-file',        `icicle-bookmark-local-non-dir-file-other-window',
 ;;  `icicle-bookmark-man',                       `icicle-bookmark-man-other-window',
+;;  `icicle-bookmark-non-dir-file',              `icicle-bookmark-non-dir-file-other-window',
 ;;  `icicle-bookmark-non-file',                  `icicle-bookmark-non-file-other-window',
 ;;  `icicle-bookmark-region',                    `icicle-bookmark-region-other-window',
 ;;  `icicle-bookmark-remote-file',               `icicle-bookmark-remote-file-other-window',
+;;  `icicle-bookmark-remote-non-dir-file',       `icicle-bookmark-remote-non-dir-file-other-window',
 ;;  `icicle-bookmark-specific-buffers',          `icicle-bookmark-specific-buffers-other-window'
 ;;  `icicle-bookmark-specific-files',            `icicle-bookmark-specific-files-other-window'
 ;;  `icicle-bookmark-all-tags',                  `icicle-bookmark-all-tags-other-window'
@@ -5716,10 +6222,16 @@ You are prompted for the FILES."
 (icicle-define-bookmark-command              "desktop")                                   ; `C-x j K'
 (icicle-define-bookmark-command              "local-file")                                ; `C-x j l'
 (icicle-define-bookmark-other-window-command "local-file")                                ; `C-x 4 j l'
-(icicle-define-bookmark-command              "man") ; `C-x j m'
+(icicle-define-bookmark-command              "local-non-dir-file")                        ; Not bound
+(icicle-define-bookmark-other-window-command "local-non-dir-file")                        ; Not bound
+(icicle-define-bookmark-command              "man")                                       ; `C-x j m'
 (icicle-define-bookmark-other-window-command "man")                                       ; `C-x 4 j m'
+(icicle-define-bookmark-command              "non-dir-file")                              ; Not bound
+(icicle-define-bookmark-other-window-command "non-dir-file")                              ; Not bound
 (icicle-define-bookmark-command              "remote-file")                               ; `C-x j n'
 (icicle-define-bookmark-other-window-command "remote-file")                               ; `C-x 4 j n'
+(icicle-define-bookmark-command              "remote-non-dir-file")                       ; Not bound
+(icicle-define-bookmark-other-window-command "remote-non-dir-file")                       ; Not bound
 (icicle-define-bookmark-command              "region" "Select region: ")                  ; `C-x j r'
 (icicle-define-bookmark-other-window-command "region" "Select region: ")                  ; `C-x 4 j r'
 (icicle-define-bookmark-command              "all-tags" nil                               ; `C-x j t *'
@@ -5782,21 +6294,25 @@ You are prompted for the FILES."
 
 (defalias 'icicle-select-bookmarked-region 'icicle-bookmark-region-other-window)
 
-(defun icicle-bookmarked-buffer-list ()
+(defun icicle-bookmarked-buffer-list (&optional msgp)
   "`icicle-buffer-list', but only for bookmarked buffers."
-  (interactive)
-  (let ((icicle-buffer-predicate  (lambda (buf) (member buf (bmkp-buffer-names))))
-        (icicle-prompt            "Choose bookmarked buffer (`RET' when done): "))
-    (icicle-buffer-list)))
+  (interactive "p")
+  (let* ((icicle-buffer-predicate  (lambda (buf) (member buf (bmkp-buffer-names))))
+         (icicle-prompt            "Choose bookmarked buffer (`RET' when done): ")
+         (buf-names                (icicle-buffer-list)))
+    (prog1 buf-names
+      (when msgp (message "Bookmarked buffers: %S" buf-names)))))
 
-(defun icicle-bookmarked-file-list ()
+(defun icicle-bookmarked-file-list (&optional msgp)
   "`icicle-file-list', but only for bookmarked files."
-  (interactive)
+  (interactive "p")
   (bookmark-maybe-load-default-file)
-  (let ((use-file-dialog        nil)
-        (icicle-file-predicate  (lambda (file) (member (expand-file-name file) (bmkp-file-names))))
-        (icicle-prompt          "Choose bookmarked file (`RET' when done): "))
-    (icicle-file-list)))
+  (let* ((use-file-dialog        nil)
+         (icicle-file-predicate  (lambda (file) (member (expand-file-name file) (bmkp-file-names))))
+         (icicle-prompt          "Choose bookmarked file (`RET' when done): ")
+         (file-names             (icicle-file-list)))
+    (prog1 file-names
+      (when msgp (message "Bookmarked files: %S" file-names)))))
 
 (icicle-define-command icicle-find-first-tag ; Command name
   "Find first tag in current tags table whose name matches your input.
@@ -6070,8 +6586,9 @@ Either LINE or POSITION can be nil.  POSITION is used if present."
 (defun icicle-other-window-or-frame (arg) ; Bound to `C-x o' in Icicle mode.
   "Select a window or frame, by name or by order.
 This command combines Emacs commands `other-window' and `other-frame',
-together with Icicles multi-commands `icicle-select-window', and
-`icicle-select-frame'.  Use the prefix argument to choose, as follows:
+together with Icicles commands `icicle-select-window',
+`icicle-select-frame', and `icicle-choose-window-for-buffer-display'.
+Use the prefix argument to choose the behavior, as follows:
 
  With no prefix arg or a non-zero numeric prefix arg:
   If the selected frame has multiple windows, then this is
@@ -6087,6 +6604,15 @@ together with Icicles multi-commands `icicle-select-window', and
   `icicle-select-window' with windows from all visible frames as
   candidates.  Otherwise, this is `icicle-select-frame'.
 
+ With plain `C-u C-u':
+  Same as `icicle-select-window' with a negative prefix arg: Select a
+  window from any frame, including iconified and invisible frames.
+  
+ With plain `C-u C-u C-u' (Emacs 24+):
+  This is `icicle-choose-window-for-buffer-display', with windows from
+  all frames (i.e., iconified and invisible) frames as candidates. 
+  (For Emacs prior to Emacs 24, this has the same effect as `C-u'.)
+
 If you use library `oneonone.el' with a standalone minibuffer frame,
 and if option `1on1-remap-other-frame-command-flag' is non-nil, then
 frame selection can include the standalone minibuffer frame.
@@ -6097,13 +6623,19 @@ not want this remapping, then customize option
 `icicle-top-level-key-bindings'."
   (interactive "P")
   (let ((numarg  (prefix-numeric-value arg)))
-    (cond ((consp arg)
+    (cond ((and (consp arg)  (or (< numarg 16)  (< emacs-major-version 24))) ; `C-u'
            (if (one-window-p) (icicle-select-frame) (icicle-select-window)))
-          ((zerop numarg)
+          ((and (consp arg)  (< numarg 64)) ; `C-u C-u'
+           (let ((current-prefix-arg  '-)) (icicle-select-window)))
+          ((consp arg)                  ; `C-u C-u C-u'
+           (let* ((win-alist  (icicle-make-window-alist (if (< numarg 64) 'visible t)))
+                  (args       (icicle-read-choose-window-args "Window for next buffer display: " win-alist)))
+             (icicle-choose-window-for-buffer-display (car args) win-alist)))
+          ((zerop numarg)               ; `C-o'
            (if (one-window-p)
                (icicle-select-frame)
              (let ((current-prefix-arg  nil)) (icicle-select-window))))
-          (t
+          (t                            ; No prefix arg
            (if (one-window-p)
                (if (and (fboundp '1on1-other-frame)
                         1on1-minibuffer-frame
@@ -6176,7 +6708,10 @@ names that differ only by their [NUMBER] is arbitrary."
   ;; Free vars here: `icicle-window-alist' is bound in Bindings form.
   "Select window by its name.
 With no prefix arg, candidate windows are those of the selected frame.
-With a prefix arg, windows of all visible frames are candidates.
+With a prefix arg:
+* Non-negative means windows of all visible frames are candidates.
+* Negative means windows of all frames are candidates (i.e., including
+  iconified and invisible frames).
 
 A window name is the name of its displayed buffer, but suffixed as
 needed by [NUMBER], to make the name unique.  For example, if you have
@@ -6185,34 +6720,148 @@ two windows showing buffer *Help*, one of the windows will be called
   icicle-select-window-by-name          ; Action function
   "Select window: " icicle-window-alist nil t nil nil ; `completing-read' args
   (buffer-name (window-buffer (other-window 1))) nil
-  ((icicle-window-alist  (icicle-make-window-alist current-prefix-arg)))) ; Bindings
-
-;; Free vars here: `icicle-window-alist' is bound in `icicle-select-window'.
-;;
-(defun icicle-select-window-by-name (name &optional window-alist)
-  "Select the window named NAME.
-Optional argument WINDOW-ALIST is an alist of windows to choose from.
+  ((icicle-window-alist  (icicle-make-window-alist (and current-prefix-arg ; Bindings
+                                                        (if (< (prefix-numeric-value current-prefix-arg) 0)
+                                                            t
+                                                          'visible))))))
+
+(defun icicle-choose-window-by-name (win-name &optional window-alist noselect)
+  "Choose the window named WIN-NAME.
+Optional arg WINDOW-ALIST is an alist of windows to choose from.  Each
+alist element has the form (WNAME . WINDOW), where WNAME names WINDOW.
+See `icicle-make-window-alist' for more about WNAME.  If WINDOW-ALIST
+is nil then use `icicle-make-window-alist' to create an alist of the
+windows in the selected frame.
+
+Non-nil optional arg NOSELECT means do not select the window, just set
+`icicle-next-window-for-display-buffer' to it (Emacs 24+).
 
 Interactively:
- A prefix arg means windows from all visible frames are candidates.
- No prefix arg means windows from the selected frame are candidates.
-
-Each alist element has the form (WNAME . WINDOW), where WNAME names
-WINDOW.  See `icicle-make-window-alist' for more about WNAME.
-
-If `crosshairs.el' is loaded, then the target position is highlighted."
-  (interactive (let* ((alist    (icicle-make-window-alist current-prefix-arg))
-                      (default  (car (rassoc (selected-window) alist)))
-                      (input    (completing-read "Select window: " alist nil t nil nil default)))
-                 (list (if (= (length input) 0) default input) alist)))
+* No prefix arg means windows from the selected frame are candidates.
+* A non-negative prefix arg means include windows from visible frames.
+* A negative prefix arg means include windows from all frames
+  (including iconified and invisible).
+* (Emacs 24+) A prefix arg of 99 or -99 means do not select the
+  window, just make the next buffer-display operation use it.
+
+For Emacs versions prior to Emacs 24, this is the same as
+`icicle-select-window-by-name'."
+  (interactive
+   (let* ((parg   (prefix-numeric-value current-prefix-arg))
+          (nosel  (and (= 99 (abs parg))  (> emacs-major-version 23)))
+          (args   (icicle-read-choose-window-args (and nosel  "Window for next buffer display: ")
+                                                  (icicle-make-window-alist
+                                                   (and current-prefix-arg  (if (natnump parg) 'visible t))))))
+     (list (car args) (cadr args) nosel)))
   (unless window-alist
     (setq window-alist  (or (and (boundp 'icicle-window-alist)  icicle-window-alist)
                             (icicle-make-window-alist))))
-  (let ((window  (cdr (assoc name window-alist))))
-    (unless window (icicle-user-error "No such window: `%s'" name))
-    (select-window window)
-    (when (fboundp 'crosshairs-highlight) (crosshairs-highlight))
-    (select-frame-set-input-focus (selected-frame))))
+  (let ((window  (cdr (assoc win-name window-alist))))
+    (unless window (icicle-user-error "No such window: `%s'" win-name))
+    (cond ((and noselect  (> emacs-major-version 23))
+           (setq icicle-next-window-for-display-buffer  window))
+          (t
+           (select-window window)
+           (when (fboundp 'crosshairs-highlight) (crosshairs-highlight))
+           (select-frame-set-input-focus (selected-frame))))))
+
+(defun icicle-choose-window-for-buffer-display (win-name &optional window-alist)
+  "Read the name of the window to use for the next `display-buffer' call.
+Uses command `icicle-choose-window-by-name' with non-nil NOSELECT.
+Sets `icicle-next-window-for-display-buffer' to the chosen window.
+
+For Emacs versions prior to Emacs 24, this does only what
+`icicle-select-window-by-name' does."
+  (interactive (icicle-read-choose-window-args (and (> emacs-major-version 23)
+                                                    "Window for next buffer display: ")
+                                               (icicle-make-window-alist 'ALL)))
+  (icicle-choose-window-by-name win-name window-alist 'NOSELECT))
+
+(when (> emacs-major-version 23)
+  (defadvice display-buffer (around icicle-choose-window activate)
+    "Just display in `icicle-next-window-for-display-buffer', if non-nil.
+A no-op if not in Icicle mode."
+    (if (not (and (boundp 'icicle-mode)  icicle-mode  (boundp 'display-buffer-base-action))) ; Emacs 24+
+        ad-do-it
+      (unwind-protect
+           (let ((win  icicle-next-window-for-display-buffer))
+             (if (not win)
+                 ad-do-it
+               (let ((display-buffer-base-action
+                      '((lambda (buf alist)
+                          (unless (or (cdr (assq 'inhibit-same-window alist))
+                                      (window-minibuffer-p win)
+                                      (window-dedicated-p win))
+                            (window--display-buffer buffer win 'reuse alist)))
+                        .
+                        nil)))
+                 ad-do-it)))
+        (setq icicle-next-window-for-display-buffer  nil))))
+
+  (defadvice switch-to-buffer (around icicle-choose-window activate)
+    "Use `icicle-next-window-for-display-buffer', if non-nil.
+A no-op if not in Icicle mode."
+    (if (not (and (boundp 'icicle-mode)  icicle-mode  (boundp 'display-buffer-base-action))) ; Emacs 24+
+        ad-do-it
+      (unwind-protect
+           (let ((win  icicle-next-window-for-display-buffer))
+             (if (not win)
+                 ad-do-it
+               (let ((display-buffer-base-action
+                      '((lambda (buf alist)
+                          (unless (or (cdr (assq 'inhibit-same-window alist))
+                                      (window-minibuffer-p win)
+                                      (window-dedicated-p win))
+                            (window--display-buffer buffer win 'reuse alist)))
+                        .
+                        nil)))
+                 (pop-to-buffer (ad-get-arg 0) (ad-get-arg 1)))))
+        (setq icicle-next-window-for-display-buffer  nil))))
+
+  (defadvice switch-to-buffer-other-window (around icicle-choose-window activate)
+    "Use `icicle-next-window-for-display-buffer', if non-nil.
+A no-op if not in Icicle mode."
+    (if (not (and (boundp 'icicle-mode)  icicle-mode  (boundp 'display-buffer-base-action))) ; Emacs 24+
+        ad-do-it
+      (unwind-protect
+           (let ((win  icicle-next-window-for-display-buffer))
+             (if (not win)
+                 ad-do-it
+               (let ((display-buffer-base-action
+                      '((lambda (buf alist)
+                          (unless (or (cdr (assq 'inhibit-same-window alist))
+                                      (window-minibuffer-p win)
+                                      (window-dedicated-p win))
+                            (window--display-buffer buffer win 'reuse alist)))
+                        .
+                        nil)))
+                 (pop-to-buffer (ad-get-arg 0) (ad-get-arg 1)))))
+        (setq icicle-next-window-for-display-buffer  nil)))))
+
+;; Free vars here: `icicle-window-alist' is bound in `icicle-select-window'.
+;;
+(defun icicle-select-window-by-name (win-name &optional window-alist)
+  "Use `icicle-choose-window-by-name' to select a window by name.
+If library `crosshairs.el' is loaded, highlight the target position."
+  (interactive (icicle-read-choose-window-args))
+  (icicle-choose-window-by-name win-name window-alist))
+
+(defun icicle-read-choose-window-args (&optional prompt alist)
+  "Read a window name.
+Prompt with PROMPT, if non-nil, else with \"Window: \".
+Read using completion against ALIST, if non-nil, or using
+`icicle-make-window-alist' if nil.
+Empty user input chooses the selected window.
+Return a list of the chosen name and the alist used for completing.
+
+The list of windows returned by `icicle-make-window-alist' is governed
+by the prefix argument to the current command."
+  (unless prompt (setq prompt  "Window: "))
+  (let* ((alist    (or alist  (icicle-make-window-alist current-prefix-arg)))
+         (default  (car (rassoc (selected-window) alist)))
+         (input    (completing-read prompt alist nil t nil nil default)))
+    (list (if (= (length input) 0) default input)
+          alist)))
 
 (defun icicle-make-window-alist (&optional all-p)
   "Return an alist of entries (WNAME . WINDOW), where WNAME names WINDOW.
@@ -6222,8 +6871,13 @@ WNAME includes a suffix [NUMBER], to make it a unique name.  The
 NUMBER order among window names that differ only by their [NUMBER] is
 arbitrary.
 
-Non-nil argument ALL-P means use windows from all visible frames.
-Otherwise, use only windows from the selected frame."
+Argument ALL-P determines which frames to use when gathering windows,
+as follows:
+
+* `visible'         - include windows from all visible frames.
+* otherwise non-nil - include windows from all frames (including
+                      those that are iconified and invisible).
+* nil               - include only windows from the selected frame."
   (lexical-let ((win-alist  ())
                 (count      2)
                 wname new-name)
@@ -6238,7 +6892,10 @@ Otherwise, use only windows from the selected frame."
                       (push (cons new-name w) win-alist))
                     (setq count  2))
                   'no-mini
-                  (if all-p 'visible 'this-frame))
+                  (case all-p
+                    (visible 'visible)
+                    ((nil)   'this-frame)
+                    (otherwise  t)))
     win-alist))
 
 (icicle-define-command icicle-delete-windows ; Command name
@@ -6438,13 +7095,13 @@ Those are default key bindings, but you can change them using option
 
 These options, when non-nil, control candidate matching and filtering:
 
- `icicle-buffer-extras'             - Extra buffers to display
+ `icicle-buffer-extras'             - Extra buffer names to display
  `icicle-buffer-ignore-space-prefix-flag' - Ignore space-prefix names
  `icicle-buffer-include-cached-files-nflag' - Include cached files
  `icicle-buffer-include-recent-files-nflag' - Include recent files
- `icicle-buffer-match-regexp'       - Regexp that buffers must match
- `icicle-buffer-no-match-regexp'    - Regexp buffers must not match
- `icicle-buffer-predicate'          - Predicate buffer names satisfy
+ `icicle-buffer-match-regexp'       - Regexp buffer names must match
+ `icicle-buffer-no-match-regexp'    - Regexp names must not match
+ `icicle-buffer-predicate'          - Predicate names must satisfy
  `icicle-buffer-sort'               - Sort function for candidates
  `icicle-buffer-skip-functions'     - Exclude from content searching
  `icicle-file-skip-functions'       - Same, but cached/recent files
@@ -6452,7 +7109,7 @@ These options, when non-nil, control candidate matching and filtering:
 For example, to change the default behavior to show only buffers that
 are associated with files, set `icicle-buffer-predicate' to this:
 
- (lambda (buf) (buffer-file-name buf))
+ (lambda (bufname) (buffer-file-name (get-buffer bufname)))
 
 Option `icicle-buffer-require-match-flag' can be used to override
 option `icicle-require-match-flag'.
@@ -6581,7 +7238,13 @@ Used as the value of `icicle-buffer-complete-fn' and hence as
   (setq strg  icicle-current-input)
   (lexical-let* ((name-pat     (let ((icicle-list-use-nth-parts  '(1)))
                                  (icicle-transform-multi-completion strg)))
-                 (name-pat     (if (memq icicle-current-completion-mode '(nil apropos))
+                 ;; FIXME.  We want to prepend "^" here for any Icicles prefix completion method that needs it.
+                 ;;         For now, do not do it for a `vanilla' value of `icicle-current-TAB-method',
+                 ;;         regardless of the particular value of `completion-styles' or
+                 ;;         `completion-category-overrides'.  But really there are some such values for which it
+                 ;;         should be appropriate - `basic', `emacs-21', and `emacs-22', for instance.
+                 (name-pat     (if (or (memq icicle-current-completion-mode '(nil apropos))
+                                       (icicle-not-basic-prefix-completion-p))
                                    name-pat
                                  (concat "^" (regexp-quote name-pat))))
                  (content-pat  (let ((icicle-list-use-nth-parts  '(2)))
@@ -6590,13 +7253,16 @@ Used as the value of `icicle-buffer-complete-fn' and hence as
                  (bufs         (if icicle-buffer-ignore-space-prefix-flag
                                    (icicle-remove-if (lambda (buf) (icicle-string-match-p "^ " buf)) bufs)
                                  bufs))
+                 (bufpred      pred)    ; Prevent var capture in lambda: `icicle-remove-if' also uses PRED.
                  (bufs         (icicle-remove-if (lambda (buf)
                                                    (or (not (icicle-string-match-p name-pat buf))
+                                                       (and bufpred  (not (funcall bufpred buf)))
                                                        (run-hook-with-args-until-success
                                                         'icicle-buffer-skip-functions buf)))
                                                  bufs))
                  (bufs         (cond ((equal "" content-pat)
                                       (dolist (buf  bufs)
+                                        ;; Free vars here: EXISTING-BUFFERS, NEW-BUFS-TO-KILL.
                                         ;; Bound in `icicle-visit-marked-file-of-content-1'.
                                         (unless (memq (setq buf  (get-buffer buf)) icicle-existing-bufs)
                                           (add-to-list 'icicle-new-bufs-to-kill buf)))
@@ -6604,13 +7270,19 @@ Used as the value of `icicle-buffer-complete-fn' and hence as
                                      (t
                                       (icicle-remove-if-not
                                        (lambda (buf)
-                                         (let ((found  (with-current-buffer buf
-                                                         (save-excursion
-                                                           (goto-char (point-min))
-                                                           (re-search-forward content-pat nil t)))))
-                                           ;; Bound in `icicle-visit-marked-file-of-content-1'.
-                                           (unless (memq (setq buf  (get-buffer buf)) icicle-existing-bufs)
-                                             (add-to-list 'icicle-new-bufs-to-kill buf))
+                                         (let* (;; Do this as soon as possible, in case of immediate `C-g'.
+                                                ;; Free vars here: EXISTING-BUFFERS, NEW-BUFS-TO-KILL.
+                                                ;; Bound in `icicle-visit-marked-file-of-content-1'.
+                                                (IGNORE  (unless (memq (setq buf  (get-buffer buf))
+                                                                       icicle-existing-bufs)
+                                                          (add-to-list 'icicle-new-bufs-to-kill buf)))
+                                                (found   (with-current-buffer buf
+                                                           (save-excursion
+                                                             (goto-char (point-min))
+                                                             (re-search-forward content-pat nil t)))))
+;;; $$$$$$$$ I was doing this here, but advanced it to before searching, for possible `C-g'.
+;;;                                            (unless (memq (setq buf  (get-buffer buf)) icicle-existing-bufs)
+;;;                                              (add-to-list 'icicle-new-bufs-to-kill buf))
                                            (when (and found ; Don't do it just because incrementally complete.
                                                       (or (icicle-get-safe this-command
                                                                            'icicle-apropos-completing-command)
@@ -6640,16 +7312,21 @@ Used as the value of `icicle-buffer-complete-fn' and hence as
                                     ;; Avoid the error raised by calling `find-file-noselect' on a directory
                                     ;; when `find-file-run-dired' is nil.
                                     (and (or find-file-run-dired  (not (file-directory-p filname)))
-                                         (let* ((buf    (find-file-noselect filname))
-                                                (found  (with-current-buffer buf
-                                                          (message "Matching buffer contents...")
-                                                          (save-excursion
-                                                            (goto-char (point-min))
-                                                            (re-search-forward content-pat nil t)))))
-                                           ;; Free vars here: EXISTING-BUFFERS, NEW-BUFS--TO-KILL.
-                                           ;; Bound in `icicle-visit-marked-file-of-content-1'.
-                                           (unless (memq buf icicle-existing-bufs)
-                                             (add-to-list 'icicle-new-bufs-to-kill buf))
+                                         (let* ((buf     (find-file-noselect filname))
+                                                ;; Do this as soon as possible, in case of immediate `C-g'.
+                                                ;; Free vars here: EXISTING-BUFFERS, NEW-BUFS-TO-KILL.
+                                                ;; Bound in `icicle-visit-marked-file-of-content-1'.
+                                                (IGNORE  (unless (memq (setq buf  (get-buffer buf))
+                                                                       icicle-existing-bufs)
+                                                           (add-to-list 'icicle-new-bufs-to-kill buf)))
+                                                (found   (with-current-buffer buf
+                                                           (message "Matching buffer contents...")
+                                                           (save-excursion
+                                                             (goto-char (point-min))
+                                                             (re-search-forward content-pat nil t)))))
+;;; $$$$$$$$ I was doing this here, but advanced it to before searching, for possible `C-g'.
+;;;                                            (unless (memq buf icicle-existing-bufs)
+;;;                                              (add-to-list 'icicle-new-bufs-to-kill buf))
                                            (when (and found ; Don't do it just because incrementally complete.
                                                       (or (icicle-get-safe this-command
                                                                            'icicle-apropos-completing-command)
@@ -7356,7 +8033,7 @@ default separator."
   (defun icicle-describe-process (pid)
     "Describe the system process that has process id PID."
     (interactive "nPID: ")
-    (with-output-to-temp-buffer "*Help*"
+    (icicle-with-help-window "*Help*"
       (let* ((attributes  (process-attributes pid))
              (comm        (cdr-safe (assoc 'comm attributes)))
              (args        (cdr-safe (assoc 'args attributes)))
@@ -7375,6 +8052,7 @@ default separator."
 During completion (`*' means this requires library `Bookmark+')\\<minibuffer-local-completion-map>, you
 can use the following keys:
    C-c +        - create a new directory
+   C-backspace  - go up one directory level
    \\[icicle-all-candidates-list-alt-action]          - open Dired on the currently matching file names
  * C-x C-t *    - narrow to files with all of the tags you specify
  * C-x C-t +    - narrow to files with some of the tags you specify
@@ -7406,6 +8084,7 @@ can use the following keys:
 During completion (`*' means this requires library `Bookmark+')\\<minibuffer-local-completion-map>, you
 can use the following keys:
    C-c +        - create a new directory
+   C-backspace  - go up one directory level
    \\[icicle-all-candidates-list-alt-action]          - open Dired on the currently matching file names
    \\[icicle-delete-candidate-object]     - delete candidate file or (empty) dir
  * C-x C-t *    - narrow to files with all of the tags you specify
@@ -7473,7 +8152,9 @@ or `mouse-2') - a prefix arg has no effect for that.
 
 During completion (`*' means this requires library `Bookmark+')\\<minibuffer-local-completion-map>, you
 can use the following keys:
+   C-c C-d      - change the `default-directory' (with a prefix arg)
    C-c +        - create a new directory
+   C-backspace  - go up one directory level
    \\[icicle-all-candidates-list-alt-action]          - open Dired on the currently matching file names
    \\[icicle-delete-candidate-object]     - delete candidate file or (empty) dir
  * C-x C-t *    - narrow to files with all of the tags you specify
@@ -7563,6 +8244,7 @@ During completion (`*' means this requires library `Bookmark+')\\<minibuffer-loc
 can use the following keys:
    C-c C-d      - change the `default-directory' (a la `cd')
    C-c +        - create a new directory
+   C-backspace  - go up one directory level
    \\[icicle-all-candidates-list-alt-action]          - open Dired on the currently matching file names
    \\[icicle-delete-candidate-object]     - delete candidate file or (empty) dir
  * C-x C-t *    - narrow to files with all of the tags you specify
@@ -7736,6 +8418,7 @@ read-only mode.
 During completion (`*' means this requires library `Bookmark+')\\<minibuffer-local-completion-map>, you
 can use the following keys:
    C-c +        - create a new directory
+   C-backspace  - go up one directory level
    \\[icicle-all-candidates-list-alt-action]          - open Dired on the currently matching file names
    \\[icicle-delete-candidate-object]     - delete candidate file or (empty) dir
  * C-x C-t *    - narrow to files with all of the tags you specify
@@ -7997,6 +8680,7 @@ flips the behavior specified by that option.
 During completion (`*' means this requires library `Bookmark+')\\<minibuffer-local-completion-map>, you
 can use the following keys:
    C-c +        - create a new directory
+   C-backspace  - go up one directory level
    \\[icicle-all-candidates-list-alt-action]          - open Dired on the currently matching file names
    \\[icicle-delete-candidate-object]     - delete candidate file or (empty) dir
  * C-x C-t *    - narrow to files with all of the tags you specify
@@ -8100,6 +8784,7 @@ requires library `Bookmark+')\\<minibuffer-local-completion-map>:
 
    C-c C-d      - change the `default-directory' (a la `cd')
    C-c +        - create a new directory
+   C-backspace  - go up one directory level
    \\[icicle-all-candidates-list-alt-action]          - open Dired on the currently matching file names
    \\[icicle-delete-candidate-object]     - delete candidate file or (empty) dir
  * C-x C-t *    - narrow to files with all of the tags you specify
@@ -8212,8 +8897,8 @@ toggle this hiding using `\\[icicle-dispatch-C-x.]'."
     'NOT-INTERACTIVE-P)                 ; Not a real command - just a helper function.
 
 
-    (put 'icicle-recent-file-of-content 'icicle-hide-common-match t)
-    (put 'icicle-recent-file-of-content 'icicle-Completions-window-max-height 200)
+  (put 'icicle-recent-file-of-content 'icicle-hide-common-match t)
+  (put 'icicle-recent-file-of-content 'icicle-Completions-window-max-height 200)
   (defun icicle-recent-file-of-content ()
     "Open a recently used file.
 Completion candidates here are absolute, not relative, file names.
@@ -8247,11 +8932,12 @@ use this input pattern:
 
 quine.*^G^J.*^G^J.*curry
 
-A prefix argument has a different meaning when used when you act on an
+A prefix argument has a different meaning when you act on an
 individual completion candidate.  It means that you visit that file or
 directory in read-only mode.  This includes when you act on all
-candidates using \\<minibuffer-local-completion-map>`\\[icicle-all-candidates-action]': \
-precede the `\\[icicle-all-candidates-action]' with a prefix arg.
+candidates using
+\\<minibuffer-local-completion-map>`\\[icicle-all-candidates-action]':
+\ precede the `\\[icicle-all-candidates-action]' with a prefix arg.
 
 This does not apply to the final candidate chosen (using `RET' or
 `mouse-2') - a prefix arg has no effect for that.
@@ -8260,6 +8946,7 @@ During completion, you can use the following keys (`*' means this
 requires library `Bookmark+')\\<minibuffer-local-completion-map>:
 
    C-c +        - create a new directory
+   C-backspace  - go up one directory level
    \\[icicle-all-candidates-list-alt-action]          - open Dired on the currently matching file names
    \\[icicle-delete-candidate-object]     - delete candidate file or (empty) dir
  * C-x C-t *    - narrow to files with all of the tags you specify
@@ -8436,6 +9123,7 @@ During completion (`*' means this requires library `Bookmark+')\\<minibuffer-loc
 can use the following keys:
    C-c C-d      - change the `default-directory' (a la `cd')
    C-c +        - create a new directory
+   C-backspace  - go up one directory level
    \\[icicle-all-candidates-list-alt-action]          - open Dired on the currently matching file names
    \\[icicle-delete-candidate-object]     - delete candidate file or (empty) dir
  * C-x C-t *    - narrow to files with all of the tags you specify
@@ -8546,6 +9234,7 @@ remote file-name syntax.
 During completion (`*' means this requires library `Bookmark+')\\<minibuffer-local-completion-map>, you
 can use the following keys:
    C-c +        - create a new directory
+   C-backspace  - go up one directory level
    \\[icicle-all-candidates-list-alt-action]          - open Dired on the currently matching file names
    \\[icicle-delete-candidate-object]     - delete candidate file or (empty) dir
  * C-x C-t *    - narrow to files with all of the tags you specify
@@ -8848,7 +9537,7 @@ that command for more information."
 ;;;                                                             (save-excursion
 ;;;                                                               (goto-char (point-min))
 ;;;                                                               (re-search-forward content-pat nil t)))))
-;;;                                              ;; Free vars here: EXISTING-BUFFERS, NEW-BUFS--TO-KILL
+;;;                                              ;; Free vars here: EXISTING-BUFFERS, NEW-BUFS-TO-KILL
 ;;;                                              (unless (memq buf icicle-existing-bufs)
 ;;;                                                (add-to-list 'icicle-new-bufs-to-kill buf))
 ;;;                                              found))))))
@@ -8890,6 +9579,10 @@ Return non-nil if the current multi-completion INPUT matches FILE-NAME."
                                       ;; e.g., when using progressive completion: foo.el, foo.el<2>,...
                                       (or (setq exists  (find-buffer-visiting file))
                                           (create-file-buffer file))))
+                           ;; Do this as soon as BUF is created, in case of immediate `C-g' to exit etc.
+                           ;; Free vars here: EXISTING-BUFFERS, NEW-BUFS-TO-KILL
+                           (IGNORE  (unless (memq buf icicle-existing-bufs)
+                                      (add-to-list 'icicle-new-bufs-to-kill buf)))
                            (found   (with-current-buffer buf
                                       (message "Matching file contents...")
                                       (unless (or dir-p  exists) ; EXISTS prevents inserting it more than once.
@@ -8898,8 +9591,9 @@ Return non-nil if the current multi-completion INPUT matches FILE-NAME."
                                         (insert-file-contents file 'VISIT))
                                       (save-excursion (goto-char (point-min))
                                                       (re-search-forward content-pat nil t)))))
-                      (unless (memq buf icicle-existing-bufs)
-                        (add-to-list 'icicle-new-bufs-to-kill buf))
+;;; $$$$$$$$ I was doing this here, but advanced it to before searching, for possible `C-g'.
+;;;                       (unless (memq buf icicle-existing-bufs)
+;;;                         (add-to-list 'icicle-new-bufs-to-kill buf))
                       (when (and found  ; Don't do it just because incrementally complete.
                                  (or (icicle-get-safe this-command 'icicle-apropos-completing-command)
                                      (icicle-get-safe this-command 'icicle-cycling-command)
@@ -8926,6 +9620,7 @@ remote file-name syntax.
 During completion (`*' means this requires library `Bookmark+')\\<minibuffer-local-completion-map>, you
 can use the following keys:
    C-c +        - create a new directory
+   C-backspace  - go up one directory level
    \\[icicle-all-candidates-list-alt-action]          - open Dired on the currently matching file names
    \\[icicle-delete-candidate-object]     - delete candidate file or (empty) dir
  * C-x C-t *    - narrow to files with all of the tags you specify
@@ -9101,6 +9796,7 @@ During completion (`*' means this requires library `Bookmark+')\\<minibuffer-loc
 can use the following keys:
    C-c C-d      - change the `default-directory' (a la `cd')
    C-c +        - create a new directory
+   C-backspace  - go up one directory level
    \\[icicle-all-candidates-list-alt-action]          - open Dired on the currently matching file names
    \\[icicle-delete-candidate-object]     - delete candidate file or (empty) dir
  * C-x C-t *    - narrow to files with all of the tags you specify
@@ -9212,6 +9908,7 @@ remote file-name syntax.
 During completion (`*' means this requires library `Bookmark+')\\<minibuffer-local-completion-map>, you
 can use the following keys:
    C-c +        - create a new directory
+   C-backspace  - go up one directory level
    \\[icicle-all-candidates-list-alt-action]          - open Dired on the currently matching file names
    \\[icicle-delete-candidate-object]     - delete candidate file or (empty) dir
  * C-x C-t *    - narrow to files with all of the tags you specify
@@ -9390,7 +10087,8 @@ Optional arg NO-SYMLINKS-P non-nil means do not follow symbolic links."
   (interactive
    (save-selected-window
      ;; Should not need to bind `minibuffer-completion-predicate'.  Emacs 23.2 bug, per Stefan.
-     (let ((minibuffer-completion-predicate  minibuffer-completion-predicate))
+     (let ((enable-recursive-minibuffers     t)
+           (minibuffer-completion-predicate  minibuffer-completion-predicate))
        (list (funcall (if (fboundp 'read-directory-name)
                           #'read-directory-name
                         #'read-file-name)
@@ -9739,6 +10437,7 @@ and a final-choice key (e.g. `RET', `mouse-2') to choose the last one." ; Doc st
    (icicle-list-join-string               ": ")
    (icicle-multi-completing-p             t)
    (icicle-list-use-nth-parts             '(1))
+   (icicle-face-completing-p              t)
    (icicle-use-candidates-only-once-flag  t)
    (icicle-candidate-alt-action-fn
     (or icicle-candidate-alt-action-fn  (icicle-alt-act-fn-for-type "face")))
@@ -9767,10 +10466,10 @@ The list of names (strings) is returned.
 These options, when non-nil, control candidate matching and filtering:
 
  `icicle-buffer-ignore-space-prefix-flag' - Ignore space-prefix names
- `icicle-buffer-extras'             - Extra buffers to display
- `icicle-buffer-match-regexp'       - Regexp that buffers must match
- `icicle-buffer-no-match-regexp'    - Regexp buffers must not match
- `icicle-buffer-predicate'          - Predicate buffer names satisfy
+ `icicle-buffer-extras'             - Extra buffer names to display
+ `icicle-buffer-match-regexp'       - Regexp that names must match
+ `icicle-buffer-no-match-regexp'    - Regexp names must not match
+ `icicle-buffer-predicate'          - Predicate names must satisfy
  `icicle-buffer-sort'               - Sort function for candidates
 
 Note: The prefix arg is tested, even when this is called
@@ -9881,6 +10580,7 @@ Non-interactively:
    (enable-recursive-minibuffers                t) ; In case we read input, e.g. File changed on disk...
    (completion-ignore-case                      bookmark-completion-ignore-case)
    (icicle-multi-completing-p                   icicle-show-multi-completion-flag)
+   (icicle-bookmark-completing-p                t)
    (icicle-list-use-nth-parts                   '(1))
    (icicle-candidate-properties-alist           (if (not icicle-multi-completing-p)
                                                     ()
@@ -9998,6 +10698,7 @@ list.
 During completion (`*' means this requires library `Bookmark+')\\<minibuffer-local-completion-map>, you
 can use the following keys:
    C-c +        - create a new directory
+   C-backspace  - go up one directory level
    \\[icicle-all-candidates-list-alt-action]          - open Dired on the currently matching file names
    \\[icicle-delete-candidate-object]     - delete candidate file or (empty) dir
  * C-x C-t *    - narrow to files with all of the tags you specify
@@ -10075,6 +10776,7 @@ directory from the minibuffer when you want to match proxy candidates.
 During completion (`*' means this requires library `Bookmark+')\\<minibuffer-local-completion-map>, you
 can use the following keys:
    C-c +        - create a new directory
+   C-backspace  - go up one directory level
    \\[icicle-all-candidates-list-alt-action]          - open Dired on the currently matching file names
    \\[icicle-delete-candidate-object]     - delete candidate file or (empty) dir
  * C-x C-t *    - narrow to files with all of the tags you specify
index fbe8152..2f77e55 100644 (file)
@@ -4,28 +4,32 @@
 ;; Description: Top-level commands 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: Thu May 21 13:31:43 2009 (-0700)
-;; Last-Updated: Sun May 11 12:43:23 2014 (-0700)
+;; Last-Updated: Mon Jan 26 09:24:48 2015 (-0800)
 ;;           By: dradams
-;;     Update #: 6839
+;;     Update #: 7111
 ;; URL: http://www.emacswiki.org/icicles-cmd2.el
 ;; Doc URL: http://www.emacswiki.org/Icicles
 ;; Keywords: 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:
 ;;
-;;   `apropos', `apropos-fn+var', `avoid', `cl', `cus-edit',
-;;   `cus-face', `cus-load', `cus-start', `cus-theme', `doremi',
-;;   `easymenu', `el-swank-fuzzy', `ffap', `ffap-', `frame-cmds',
-;;   `frame-fns', `fuzzy', `fuzzy-match', `hexrgb', `icicles-cmd1',
-;;   `icicles-fn', `icicles-mcmd', `icicles-opt', `icicles-var',
-;;   `image-dired', `kmacro', `levenshtein', `misc-fns', `mouse3',
-;;   `mwheel', `naked', `regexp-opt', `ring', `second-sel',
-;;   `strings', `thingatpt', `thingatpt+', `wid-edit', `wid-edit+',
-;;   `widget'.
+;;   `apropos', `apropos+', `apropos-fn+var', `avoid', `bookmark',
+;;   `bookmark+', `bookmark+-1', `bookmark+-bmu', `bookmark+-key',
+;;   `bookmark+-lit', `cl', `cmds-menu', `cus-edit', `cus-face',
+;;   `cus-load', `cus-start', `cus-theme', `doremi', `easymenu',
+;;   `el-swank-fuzzy', `ffap', `ffap-', `fit-frame', `frame-cmds',
+;;   `frame-fns', `fuzzy', `fuzzy-match', `help+20', `hexrgb',
+;;   `icicles-cmd1', `icicles-fn', `icicles-mcmd', `icicles-opt',
+;;   `icicles-var', `image-dired', `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', `thingatpt',
+;;   `thingatpt+', `unaccent', `w32browser-dlgopen', `wid-edit',
+;;   `wid-edit+', `widget'.
 ;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;
 ;;    (+)`icicle-choose-faces', (+)`icicle-choose-invisible-faces',
 ;;    (+)`icicle-choose-visible-faces', (+)`icicle-comint-command',
 ;;    (+)`icicle-comint-search', (+)`icicle-compilation-search',
-;;    (+)`icicle-complete-keys', (+)`icicle-complete-menu-bar',
-;;    `icicle-complete-thesaurus-entry', (+)`icicle-doc',
-;;    (+)`icicle-exchange-point-and-mark',
+;;    `icicle-complete', (+)`icicle-complete-keys',
+;;    (+)`icicle-complete-menu-bar',
+;;    `icicle-complete-thesaurus-entry', `icicle-describe-package',
+;;    (+)`icicle-doc', (+)`icicle-exchange-point-and-mark',
 ;;    (+)`icicle-find-file-all-tags',
 ;;    (+)`icicle-find-file-all-tags-other-window',
 ;;    (+)`icicle-find-file-all-tags-regexp',
 ;;    (+)`icicle-find-file-tagged-other-window', (+)`icicle-font',
 ;;    (+)`icicle-font-lock-keyword', (+)`icicle-frame-bg',
 ;;    (+)`icicle-frame-fg', (+)`icicle-fundoc',
-;;    (+)`icicle-goto-global-marker',
+;;    (+)`icicle-goto-any-marker', (+)`icicle-goto-global-marker',
 ;;    (+)`icicle-goto-global-marker-or-pop-global-mark',
 ;;    (+)`icicle-goto-marker',
 ;;    (+)`icicle-goto-marker-or-set-mark-command',
 ;;    (+)`icicle-hide-faces', (+)`icicle-hide-only-faces',
 ;;    `icicle-hide/show-comments', (+)`icicle-imenu',
 ;;    (+)`icicle-imenu-command', (+)`icicle-imenu-command-full',
-;;    (+)`icicle-imenu-face-full', (+)`icicle-imenu-face-full',
+;;    (+)`icicle-imenu-face', (+)`icicle-imenu-face-full',
 ;;    (+)`icicle-imenu-full', (+)`icicle-imenu-key-explicit-map',
 ;;    (+)`icicle-imenu-key-explicit-map-full',
 ;;    (+)`icicle-imenu-key-implicit-map',
 ;;    (+)`icicle-occur-dired-marked-recursive',
 ;;    (+)`icicle-pick-color-by-name', (+)`icicle-plist',
 ;;    `icicle-previous-visible-thing', `icicle-read-color',
-;;    `icicle-read-color-wysiwyg', `icicle-save-string-to-variable',
+;;    `icicle-read-color-WYSIWYG', `icicle-save-string-to-variable',
 ;;    (+)`icicle-search', (+)`icicle-search-all-tags-bookmark',
 ;;    (+)`icicle-search-all-tags-regexp-bookmark',
 ;;    (+)`icicle-search-autofile-bookmark',
 ;;    (+)`icicle-show-only-faces', (+)`icicle-synonyms',
 ;;    (+)`icicle-tag-a-file', (+)`icicle-tags-search',
 ;;    (+)`icicle-untag-a-file', (+)`icicle-vardoc',
-;;    (+)`icicle-where-is', (+)`synonyms', (+)`what-which-how'.
+;;    (+)`icicle-where-is', (+)`icicle-wide-n', (+)`synonyms',
+;;    (+)`what-which-how'.
 ;;
 ;;  Non-interactive functions defined here:
 ;;
 ;;    `icicle-char-properties-in-buffers',
 ;;    `icicle-choose-anything-candidate',
 ;;    `icicle-choose-candidate-of-type',
+;;    `icicle-color-from-multi-completion-input',
 ;;    `icicle-cmd2-after-load-bookmark+',
 ;;    `icicle-cmd2-after-load-hexrgb',
 ;;    `icicle-cmd2-after-load-highlight',
 ;;    `icicle-comint-search-send-input', `icicle-compilation-hook-fn',
 ;;    `icicle-compilation-search-in-context-fn',
 ;;    `icicle-complete-keys-1', `icicle-complete-keys-action',
-;;    `icicle-defined-thing-p', `icicle-doc-action',
-;;    `icicle-fn-doc-minus-sig',
+;;    `icicle-doc-action', `icicle-fn-doc-minus-sig',
 ;;    `icicle-get-anything-actions-for-type',
 ;;    `icicle-get-anything-cached-candidates',
 ;;    `icicle-get-anything-candidates',
 ;;    `icicle-next-visible-thing-1', `icicle-next-visible-thing-2',
 ;;    `icicle-next-visible-thing-and-bounds',
 ;;    `icicle-ORIG-read-color', `icicle-ORIG-widget-color-complete',
+;;    `icicle-pick-color-by-name-1',
 ;;    `icicle-pick-color-by-name-action',
 ;;    `icicle-previous-single-char-property-change',
 ;;    `icicle-read-args-for-set-completion-methods',
 ;;    `icicle-search-thing-scan', `icicle-search-where-arg',
 ;;    `icicle-set-completion-methods-for-command',
 ;;    `icicle-things-alist', `icicle-this-command-keys-prefix',
-;;    `icicle-update-f-l-keywords', `icicle-widget-color-complete',
-;;    `icicle-WYSIWYG-font'.
+;;    `icicle-update-f-l-keywords', `icicle-wide-n-action',
+;;    `icicle-widget-color-complete', `icicle-WYSIWYG-font'.
 ;;
 ;;  Internal variables defined here:
 ;;
 (eval-when-compile (require 'comint))
   ;; comint-check-proc, comint-copy-old-input, comint-get-old-input, comint-input-ring,
   ;; comint-prompt-regexp, comint-send-input
+(eval-when-compile (require 'completion)) ;; completion-string
 (eval-when-compile (require 'imenu)) ;; imenu-syntax-alist
 (eval-when-compile (require 'compile)) ;; compilation-find-buffer
 (eval-when-compile (require 'info)) ;; Info-goto-node
   ;; icicle-search-overlays, icicle-search-refined-overlays, icicle-search-replacement,
   ;; icicle-transform-before-sort-p, icicle-vardoc-last-initial-cand-set, icicle-whole-candidate-as-text-prop-p
 (require 'icicles-fn)                   ; (This is required anyway by `icicles-mcmd.el'.)
-  ;; icicle-candidate-short-help, icicle-completing-read-history, icicle-highlight-lighter,
-  ;; icicle-insert-cand-in-minibuffer, icicle-some, icicle-read-regexp, icicle-string-match-p, icicle-unlist
+  ;; icicle-alist-key-match, icicle-candidate-short-help, icicle-completing-read-history,
+  ;; icicle-defined-thing-p, icicle-highlight-lighter, icicle-insert-cand-in-minibuffer, icicle-some,
+  ;; icicle-read-regexp, icicle-string-match-p, icicle-unlist
 (require 'icicles-cmd1)
   ;; icicle-bookmark-cleanup, icicle-bookmark-cleanup-on-quit, icicle-bookmark-cmd, icicle-bookmark-help-string,
   ;; icicle-bookmark-propertize-candidate, icicle-buffer-list, icicle-explore, icicle-face-list,
 (defvar anything-idle-delay)            ; In `anything.el'
 (defvar bmkp-non-file-filename)         ; In `bookmark+-1.el'
 (defvar bmkp-sorted-alist)              ; In `bookmark+-1.el'
+(defvar cmpl-cdabbrev-reset-p)          ; In `completion.el'
+(defvar cmpl-current-index)             ; In `completion.el'
+(defvar cmpl-initialized-p)             ; In `completion.el'
+(defvar cmpl-last-insert-location)      ; In `completion.el'
+(defvar cmpl-leave-point-at-start)      ; In `completion.el'
+(defvar cmpl-obarray)                   ; In `completion.el'
+(defvar cmpl-original-string)           ; In `completion.el'
+(defvar cmpl-cdabbrev-reset-p)          ; In `completion.el'
+(defvar cmpl-symbol-end)                ; In `completion.el'
+(defvar cmpl-symbol-start)              ; In `completion.el'
+(defvar cmpl-test-regexp)               ; In `completion.el'
+(defvar cmpl-test-string)               ; In `completion.el'
+(defvar cmpl-tried-list)                ; In `completion.el'
+(defvar completion-cdabbrev-prompt-flag) ; In `completion.el'
+(defvar completion-prefix-min-length)   ; In `completion.el'
+(defvar completion-prompt-speed-threshold) ; In `completion.el'
+(defvar completion-to-accept)           ; In `completion.el'
 (defvar er/try-expand-list)             ; In `expand-region.el'
 (defvar eyedrop-picked-background)      ; In `eyedrop.el' or `palette.el'
 (defvar eyedrop-picked-foreground)      ; In `eyedrop.el' or `palette.el'
 (defvar hlt-act-on-any-face-flag)       ; In `highlight.el'
 (defvar icicle-complete-keys-ignored-prefix-keys) ; In `icicles-var.el' (Emacs 22+)
 (defvar icicle-complete-keys-self-insert-ranges) ; In `icicles-var.el' (Emacs 22+)
+(defvar icicle-face-completing-p)       ; Here
+(defvar icicle-package-completing-p)    ; Here
 (defvar icicle-search-ecm)              ; In `icicle-search'
 (defvar icicle-track-pt)                ; In `icicle-insert-thesaurus-entry'
-(defvar replace-count)                  ; In `replace.el'.
+(defvar imenu-after-jump-hook)          ; In `imenu.el' (Emacs 22+)
+(defvar replace-count)                  ; In `replace.el'
+(defvar wide-n-lighter-narrow-part)     ; In `wide-n.el'
+(defvar wide-n-restrictions)            ; In `wide-n.el'
 
 ;; (< emacs-major-version 21)
 (defvar tooltip-mode)                   ; In `tooltip.el'
@@ -513,10 +544,10 @@ In other words, this command is essentially just a convenience." ; Doc string
     ((enable-recursive-minibuffers           t) ; In case we read input, e.g. File changed on disk...
      (completion-ignore-case                 bookmark-completion-ignore-case)
      (prompt                                 "Bookmark `C-M-j' TAGS: ")
-     (icicle-list-use-nth-parts              '(1))
      (icicle-dot-string                      (icicle-anychar-regexp))
      (icicle-candidate-properties-alist      '((2 (face bookmark-menu-heading))))
      (icicle-multi-completing-p              t)
+     (icicle-bookmark-completing-p           t)
      (icicle-list-use-nth-parts              '(1))
      (icicle-transform-function              (and (not (interactive-p))  icicle-transform-function))
      (icicle-whole-candidate-as-text-prop-p  t)
@@ -594,7 +625,7 @@ In other words, this command is essentially just a convenience." ; Doc string
      (icicle-dot-string                      (icicle-anychar-regexp))
      (icicle-candidate-properties-alist      '((2 (face icicle-msg-emphasis))))
      (icicle-multi-completing-p              t)
-     (icicle-list-use-nth-parts              '(1))
+     (icicle-bookmark-completing-p           t)
      (icicle-transform-function              (and (not (interactive-p))  icicle-transform-function))
      (icicle-whole-candidate-as-text-prop-p  t)
      (icicle-transform-before-sort-p         t)
@@ -669,6 +700,7 @@ During completion (`*' means this requires library `Bookmark+')\\<minibuffer-loc
 can use the following keys:
    C-c C-d      - change the `default-directory' (a la `cd')
    C-c +        - create a new directory
+   C-backspace  - go up one directory level
    \\[icicle-all-candidates-list-alt-action]          - open Dired on the currently matching file names
    \\[icicle-delete-candidate-object]     - delete candidate file or (empty) dir
  * C-x C-t *    - narrow to files with all of the tags you specify
@@ -785,6 +817,7 @@ During completion (`*' means this requires library `Bookmark+')\\<minibuffer-loc
 can use the following keys:
    C-c C-d      - change the `default-directory' (a la `cd')
    C-c +        - create a new directory
+   C-backspace  - go up one directory level
    \\[icicle-all-candidates-list-alt-action]          - open Dired on the currently matching file names
    \\[icicle-delete-candidate-object]     - delete candidate file or (empty) dir
  * C-x C-t *    - narrow to files with all of the tags you specify
@@ -1117,9 +1150,50 @@ at point, or if none then the visited file."
   (when (and (fboundp 'read-color)  (not (fboundp 'icicle-ORIG-read-color))) ; Exists with Emacs 23+.
     (fset 'icicle-ORIG-read-color (symbol-function 'read-color))) ; Not used, but save it anyway.
 
+  (defun icicle-color-from-multi-completion-input (raw-input msgp)
+    "Get color from user RAW-INPUT for color multi-completion candidates.
+The arguments are the same as for `icicle-read-color-WYSIWYG'."
+    (let ((mouse-pseudo-color-p  nil)
+          color)
+      (when (string= "" raw-input) (icicle-user-error "No such color: %S" raw-input))
+      (cond ((string-match "\\`'.+': " raw-input)
+             (let ((icicle-list-nth-parts-join-string  ": ")
+                   (icicle-list-join-string            ": ")
+                   (icicle-list-use-nth-parts          '(2)))
+               (setq color  (icicle-transform-multi-completion raw-input))))
+            ((fboundp 'eyedrop-foreground-at-point)
+             (cond ((string-match "^\*mouse-2 foreground\*" raw-input)
+                    (setq color  (prog1 (eyedrop-foreground-at-mouse
+                                         (read-event
+                                          "Click `mouse-2' anywhere to choose foreground color"))
+                                   (read-event)) ; Discard mouse up event.
+                          mouse-pseudo-color-p  t))
+                   ((string-match "^\*mouse-2 background\*" raw-input)
+                    (setq color  (prog1 (eyedrop-background-at-mouse
+                                         (read-event
+                                          "Click `mouse-2' anywhere to choose background color"))
+                                   (read-event)) ; Discard mouse up event.
+                          mouse-pseudo-color-p  t)))
+             (setq color  (icicle-transform-multi-completion
+                           (if mouse-pseudo-color-p
+                               (concat color ": " (hexrgb-color-name-to-hex color))
+                             raw-input)))))
+
+      ;; If the user did not complete but just entered a color name, then transformation can return "".
+      ;; In that case, get the color just read from the input history, and transform that.
+      (when (string= "" color)          ; This "" resulted from `icicle-transform-multi-completion', above.
+        (let ((col  (car-safe (symbol-value minibuffer-history-variable))))
+          (setq color  (cond ((equal '(1) icicle-list-use-nth-parts)  col) ; Cannot do more.
+                             ((equal '(2) icicle-list-use-nth-parts)  (hexrgb-color-name-to-hex col))
+                             (t  (let ((icicle-list-nth-parts-join-string  ": ")
+                                       (icicle-list-join-string            ": "))
+                                   (icicle-transform-multi-completion color)))))))
+      (when msgp (message "Color: `%s'" (icicle-propertize color 'face 'icicle-msg-emphasis)))
+      color))
+
   ;; See also `hexrgb-read-color' in `hexrgb.el'.
   (defun icicle-read-color (&optional prompt convert-to-RGB-p allow-empty-name-p msgp)
-    "Read a color name or hex RGB hexadecimal color value #RRRRGGGGBBBB.
+    "Read a color name or RGB hexadecimal triplet.
 Return the name or the RGB hex string for the chosen color.
 
 By default (see option `icicle-functions-to-redefine'), this is used
@@ -1132,17 +1206,17 @@ multi-command that provides WYSIWYG completion, color-variable proxy
 candidates, alternate candidate actions, candidate help, and multiple
 color-related candidate sort orders.
 
-In this it is like command `icicle-read-color-wysiwyg' (which see),
-but it is less flexible and powerful than that command.
-`icicle-read-color' always returns the RGB hex string, and your input
-cannot be an arbitrary string - it must match a color candidate (or be
-empty if ALLOW-EMPTY-NAME-P is non-nil).
+In this it is like command `icicle-read-color-WYSIWYG', but it is less
+powerful and generally less flexible than `icicle-read-color-WYSIWYG'.
+Another difference is that `icicle-read-color-WYSIWYG' always raises
+an error for empty input, unless you wrap it in `ignore-errors'.
+
 
 In Lisp code that you write, and for interactive use,
-`icicle-read-color-wysiwyg' is generally a better choice than
+`icicle-read-color-WYSIWYG' is generally a better choice than
 `icicle-read-color'.
 
-Optional argument PROMPT is the prompt to use (default \"Color: \").
+Optional argument PROMPT is a non-default prompt to use.
 
 Interactively, or if CONVERT-TO-RGB-P is non-nil, return the RGB hex
 string for the chosen color.  If nil, return the color name.
@@ -1156,26 +1230,16 @@ action in case of empty input.
 
 Interactively, or with non-nil MSGP, show chosen color in echo area."
     (interactive "i\np\ni\np")          ; Always convert to RGB interactively.
-    (let* ((icicle-require-match-p  (not allow-empty-name-p))
-           (color                   (icicle-read-color-wysiwyg (if convert-to-RGB-p 2 1) prompt)))
-      ;; `icicle-read-color-wysiwyg' transforms input to get the 2nd multi-completion component.
-      ;; But if the user did not complete but just entered a color name, then this transformation returns "".
-      ;; In that case, get the color name that was input from the input history, and convert that to RGB.
-      (when (and (not allow-empty-name-p)  (string= "" color))
-        (let ((col  (car-safe (symbol-value minibuffer-history-variable))))
-          (when (or (equal "" col)  (not (stringp col))) (icicle-user-error "No such color: %S" color))
-          (setq color  (hexrgb-color-name-to-hex col))))
-      (let ((icicle-multi-completing-p  t)
-            (icicle-list-use-nth-parts  (if convert-to-RGB-p '(2) '(1)))
-            (colr                       (icicle-transform-multi-completion color)))
-        (when msgp (message "Color: `%s'" (icicle-propertize colr 'face 'icicle-msg-emphasis)))
-        colr)))
-
-  (defun icicle-read-color-wysiwyg (&optional arg prompt initial-input msgp)
+    (let ((color  (condition-case nil (icicle-read-color-WYSIWYG (if convert-to-RGB-p 2 1) prompt) (error ""))))
+      (when (and (not allow-empty-name-p)  (string= "" color)) (icicle-user-error "No such color: %S" color))
+      (when msgp (message "Color: `%s'" (icicle-propertize color 'face 'icicle-msg-emphasis)))
+      color))
+
+  (defun icicle-read-color-WYSIWYG (&optional arg prompt initial-input msgp)
     "Read a color name or hex RGB color value #RRRRGGGGBBBB.
 Return a string value.
 Interactively, optional argument ARG is the prefix arg - see below.
-Optional argument PROMPT is the prompt to use (default \"Color: \").
+Optional argument PROMPT is a non-default prompt to use.
 Optional argument INITIAL-INPUT is a initial input to insert in the
 minibuffer for completion.  It is passed to `completing-read'.
 Interactively, or with non-nil MSGP, show chosen color in echo area.
@@ -1212,12 +1276,16 @@ color name or input any valid RGB hex value (without completion).
 With no prefix arg, return a string with both the color name and the
 RGB value, separated by `icicle-list-nth-parts-join-string'.
 
-With a numeric prefix arg of 0 or 1, return the color name.  With any
-other numeric prefix arg, return the RGB value.
+With a numeric prefix arg of 0 or 1, return the color name.
+With any other numeric prefix arg, return the RGB hex triplet.
 
 In the plain `C-u' case, your input is checked to ensure that it
 represents a valid color.
 
+An error is raised if you enter empty input.  (In Lisp code, if you
+want to allow a return value of \"\" then wrap the call in
+`ignore-errors'.)
+
 In all other cases:
 
 - You can complete your input against the color name, the RGB value,
@@ -1249,9 +1317,10 @@ This command is intended only for use in Icicle mode (but it can be
 used with `C-u', with Icicle mode turned off)."
     (interactive "P\ni\ni\np")
     (unless (featurep 'hexrgb) (icicle-user-error "You need library `hexrgb.el' for this command"))
-    (let (color)
+    (let ((icicle-color-completing-p  t)
+          raw-input)
       (if (consp arg)                   ; Plain `C-u': complete against color name only, and be able to
-          (setq color  (hexrgb-read-color nil 'CONVERT-TO-RGB)) ; input any valid RGB string.
+          (hexrgb-read-color nil 'CONVERT-TO-RGB) ; input any valid RGB string.
 
         ;; Complete against name+RGB pairs, but user can enter invalid value without completing.
         (when arg (setq arg  (prefix-numeric-value arg))) ; Convert `-' to -1.
@@ -1260,8 +1329,6 @@ used with `C-u', with Icicle mode turned off)."
                (or (and arg  (if (< arg 2) '(1) '(2))) ; 1 or 2, either by program or via `C-1' or `C-2'.
                    icicle-list-use-nth-parts ; Bound externally by program.
                    '(1 2)))             ; Both parts, by default.
-              (mouse-pseudo-color-p  nil)
-
               icicle-candidate-help-fn           completion-ignore-case
               icicle-transform-function          icicle-sort-orders-alist
               icicle-list-nth-parts-join-string  icicle-list-join-string
@@ -1270,61 +1337,21 @@ used with `C-u', with Icicle mode turned off)."
           ;; Copy the prompt string because `icicle-color-completion-setup' puts a text prop on it.
           ;; Use `icicle-prompt' from now on, since that's what `icicle-color-completion-setup'
           ;; sets up.
-          (setq icicle-prompt  (copy-sequence (or prompt  "Color: ")))
+          (setq icicle-prompt  (copy-sequence (or prompt  "Color (name or #RGB triplet): ")))
           (icicle-color-completion-setup)
           (setq icicle-proxy-candidates
                 (append icicle-proxy-candidates
                         (mapcar         ; Convert multi-completions to strings.
                          (lambda (entry) (mapconcat #'identity (car entry) icicle-list-join-string))
                          '((("*mouse-2 foreground*")) (("*mouse-2 background*")))))
-                color  (let ((icicle-orig-window  (selected-window))
-                             (icicle-candidate-alt-action-fn
-                              (or icicle-candidate-alt-action-fn  (icicle-alt-act-fn-for-type "color")))
-                             (icicle-all-candidates-list-alt-action-fn
-                              (or icicle-all-candidates-list-alt-action-fn
-                                  (icicle-alt-act-fn-for-type "color"))))
-                         (completing-read icicle-prompt icicle-named-colors nil nil initial-input)))
-          (cond ((string-match "\\`'.+': " color)
-                 (let ((icicle-list-nth-parts-join-string  ": ")
-                       (icicle-list-join-string            ": ")
-                       (icicle-list-use-nth-parts          '(2)))
-                   (setq color  (icicle-transform-multi-completion color))))
-                ((fboundp 'eyedrop-foreground-at-point)
-                 (cond ((string-match "^\*mouse-2 foreground\*" color)
-                        (setq color  (prog1 (eyedrop-foreground-at-mouse
-                                             (read-event
-                                              "Click `mouse-2' anywhere to choose foreground color"))
-                                       (read-event)) ; Discard mouse up event.
-                              mouse-pseudo-color-p  t))
-                       ((string-match "^\*mouse-2 background\*" color)
-                        (setq color  (prog1 (eyedrop-background-at-mouse
-                                             (read-event
-                                              "Click `mouse-2' anywhere to choose background color"))
-                                       (read-event)) ; Discard mouse up event.
-                              mouse-pseudo-color-p  t)))
-                 (if mouse-pseudo-color-p
-                     (let ((icicle-list-nth-parts-join-string  ": ")
-                           (icicle-list-join-string            ": ")
-                           (icicle-list-use-nth-parts
-                            (or (and arg  (if (< arg 2) '(1) '(2))) ; 1 or 2, via program or `C-1' or `C-2'.
-                                icicle-list-use-nth-parts ; Bound externally by program.
-                                '(1 2)))) ; Both parts, by default.
-                       (setq color  (icicle-transform-multi-completion
-                                     (concat color ": " (hexrgb-color-name-to-hex color)))))
-                   (setq color  (icicle-transform-multi-completion color)))))
-                   (when (string= "" color)
-                     (let ((col  (car-safe (symbol-value minibuffer-history-variable))))
-                       (when (or (equal "" col)  (not (stringp col)))
-                           (icicle-user-error "No such color: %S" color))
-                       ;; Cannot use `case', since that uses `eql', not `equal'.
-                       (setq color  (cond ((equal '(1) icicle-list-use-nth-parts)  col)
-                                          ((equal '(2) icicle-list-use-nth-parts)
-                                           (hexrgb-color-name-to-hex col))
-                                          (t  (let ((icicle-list-nth-parts-join-string  ": ")
-                                                    (icicle-list-join-string            ": "))
-                                                (icicle-transform-multi-completion color)))))))))
-      (when msgp (message "Color: `%s'" (icicle-propertize color 'face 'icicle-msg-emphasis)))
-      color))
+                raw-input  (let ((icicle-orig-window  (selected-window))
+                                 (icicle-candidate-alt-action-fn
+                                  (or icicle-candidate-alt-action-fn  (icicle-alt-act-fn-for-type "color")))
+                                 (icicle-all-candidates-list-alt-action-fn
+                                  (or icicle-all-candidates-list-alt-action-fn
+                                      (icicle-alt-act-fn-for-type "color"))))
+                             (completing-read icicle-prompt icicle-named-colors nil nil initial-input)))
+          (icicle-color-from-multi-completion-input raw-input msgp)))))
 
   (icicle-define-command icicle-frame-bg ; Command name
     "Change background of current frame.
@@ -1516,7 +1543,7 @@ COLOR is a color name, an RGB string, or a multi-completion of both.
 If only a color name, then just say \"No help\"."
     (if (not (member icicle-list-use-nth-parts '((1 2) (2))))
         (icicle-msg-maybe-in-minibuffer "No help")
-      (with-output-to-temp-buffer "*Help*"
+      (icicle-with-help-window "*Help*"
         (princ (format "Color: %s" color)) (terpri) (terpri)
         (let* ((icicle-list-use-nth-parts  '(2))
                (colr                       (icicle-transform-multi-completion color))
@@ -1601,7 +1628,7 @@ name to use."
                                      (cons 'rgb-dist
                                            (let ((enable-recursive-minibuffers  t)
                                                  (icicle-sort-comparer          nil))
-                                             (icicle-read-color-wysiwyg ; Use the color name only.
+                                             (icicle-read-color-WYSIWYG ; Use the color name only.
                                               0 "With RGB close to color: ")))))))
            (base-rgb    (hexrgb-hex-to-rgb (hexrgb-color-name-to-hex base-color)))
            (base-red    (nth 0 base-rgb))
@@ -1687,7 +1714,7 @@ name to use."
                                      (cons 'hsv-dist
                                            (let ((enable-recursive-minibuffers  t)
                                                  (icicle-sort-comparer          nil))
-                                             (icicle-read-color-wysiwyg ; Use the color name only.
+                                             (icicle-read-color-WYSIWYG ; Use the color name only.
                                               0 "With HSV close to color: ")))))))
            (base-hsv    (hexrgb-hex-to-hsv (hexrgb-color-name-to-hex base-color)))
            (base-hue    (nth 0 base-hsv))
@@ -1729,6 +1756,7 @@ returned."
        (icicle-list-join-string            ": ")
        (icicle-multi-completing-p          t)
        (icicle-list-use-nth-parts          '(1))
+       (icicle-face-completing-p           t)
        (prompt                             (copy-sequence "Choose face (`RET' when done): "))
        (face-names                         ()))
       (put-text-property 0 1 'icicle-fancy-candidates t prompt) ; First code.
@@ -1754,6 +1782,7 @@ returned."
        (icicle-list-join-string            ": ")
        (icicle-multi-completing-p          t)
        (icicle-list-use-nth-parts          '(1))
+       (icicle-face-completing-p           t)
        (prompt                             (copy-sequence "Choose face (`RET' when done): "))
        (face-names                         ()))
       (put-text-property 0 1 'icicle-fancy-candidates t prompt) ; First code.
@@ -1779,6 +1808,7 @@ returned."
        (icicle-list-join-string            ": ")
        (icicle-multi-completing-p          t)
        (icicle-list-use-nth-parts          '(1))
+       (icicle-face-completing-p           t)
        (prompt                             (copy-sequence "Choose face (`RET' when done): "))
        (face-names                         ()))
       (put-text-property 0 1 'icicle-fancy-candidates t prompt) ; First code.
@@ -1947,21 +1977,21 @@ is returned.
 As always in Icicles, you can toggle the use of proxy candidates using
 `\\<minibuffer-local-completion-map>\\[icicle-toggle-proxy-candidates]' in the minibuffer.
 
-See `icicle-read-color-wysiwyg' for more information."
-    (let* ((prefix      (buffer-substring-no-properties
-                         (widget-field-start widget) (point)))
+See `icicle-read-color-WYSIWYG' for more information."
+    (let* ((prefix          (buffer-substring-no-properties (widget-field-start widget) (point)))
            ;; Free variables here: `eyedrop-picked-foreground', `eyedrop-picked-background'.
            ;; They are defined in library `palette.el' or library `eyedropper.el'.
-           (colors      (if (fboundp 'hexrgb-defined-colors-alist) ; Defined in `hexrgb.el'.
-                            (if (fboundp 'eyedrop-foreground-at-point)
-                                (append (and eyedrop-picked-foreground  '(("*copied foreground*")))
-                                        (and eyedrop-picked-background  '(("*copied background*")))
-                                        '(("*mouse-2 foreground*") ("*mouse-2 background*")
-                                          ("*point foreground*") ("*point background*"))
-                                        (hexrgb-defined-colors-alist))
-                              (hexrgb-defined-colors-alist))
-                          (mapcar #'list (x-defined-colors))))
-           (completion  (try-completion prefix colors)))
+           (colors                   (if (fboundp 'hexrgb-defined-colors-alist) ; Defined in `hexrgb.el'.
+                                         (if (fboundp 'eyedrop-foreground-at-point)
+                                             (append (and eyedrop-picked-foreground  '(("*copied foreground*")))
+                                                     (and eyedrop-picked-background  '(("*copied background*")))
+                                                     '(("*mouse-2 foreground*") ("*mouse-2 background*")
+                                                       ("*point foreground*") ("*point background*"))
+                                                     (hexrgb-defined-colors-alist))
+                                           (hexrgb-defined-colors-alist))
+                                       (mapcar #'list (x-defined-colors))))
+           (icicle-color-completing  t)
+           (completion               (try-completion prefix colors)))
       (cond ((null completion)
              (widgetp-remove-Completions)
              (error "No completion for \"%s\"" prefix))
@@ -1991,8 +2021,8 @@ See `icicle-read-color-wysiwyg' for more information."
                                                                         (widget-field-end field))))
 
                     (color
-                     (if (and (fboundp 'icicle-read-color-wysiwyg)  icicle-WYSIWYG-Completions-flag)
-                         (icicle-read-color-wysiwyg (if current-prefix-arg 99 0)
+                     (if (and (fboundp 'icicle-read-color-WYSIWYG)  icicle-WYSIWYG-Completions-flag)
+                         (icicle-read-color-WYSIWYG (if current-prefix-arg 99 0)
                                                     "Color (name or #R+G+B+): " prefix 'MSGP)
                        (completing-read "Color: " colors nil nil prefix))))
                (delete-region beg end)
@@ -2004,41 +2034,44 @@ See `icicle-read-color-wysiwyg' for more information."
 (defun icicle-cmd2-after-load-palette ()
   "Things to do for `icicles-cmd2.el' after loading `palette.el'."
 
-  (icicle-define-command icicle-pick-color-by-name ; Bound to `c' in color palette.
-    "Set the current color to a color you name.
+  (defun icicle-pick-color-by-name (color &optional msgp) ; Bound to `c' and `M-c' in color palette.
+    "Set the current palette color to a color you name.
 Instead of a color name, you can use an RGB string #XXXXXXXXXXXX,
 where each X is a hex digit.  The number of Xs must be a multiple of
 3, with the same number of Xs for each of red, green, and blue.
 If you enter an empty color name, then a color is picked randomly.
-The new current color is returned."     ; Doc string
-    icicle-pick-color-by-name-action    ; Action function
-    "Color (name or #R+G+B+): "         ; `completing-read' arguments
-    (hexrgb-defined-colors-alist) nil nil nil nil nil nil
-    ((completion-ignore-case  t)))      ; Bindings
+The new current color is returned.
 
-  (defun icicle-pick-color-by-name-action (color)
+When called from Lisp, non-nil MSGP means echo the chosen color name."
+    (interactive (let ((completion-ignore-case      t)
+                       (icicle-color-completing-p   t)
+                       (icicle-candidate-action-fn  'icicle-pick-color-by-name-action)
+                       (icicle-list-use-nth-parts   '(1)))
+                   (list (icicle-read-color nil nil t) 'MSG)))
+    (icicle-pick-color-by-name-1 color msgp))
+
+  (defun icicle-pick-color-by-name-action (raw-input)
     "Action function for `icicle-pick-color-by-name'."
-    (if (string= "" color)
-        (let* ((colors  (hexrgb-defined-colors))
-               (rand    (random (length colors)))) ; Random color.
-          (setq color  (elt colors rand)))
-      (let ((hex-string  (hexrgb-rgb-hex-string-p color t)))
-        (when (and hex-string  (not (eq 0 hex-string))) (setq color  (concat "#" color))) ; Add #.
-        (unless (or hex-string  (if (fboundp 'test-completion) ; Not defined in Emacs 20.
-                                    (test-completion color (hexrgb-defined-colors-alist))
-                                  (try-completion color (hexrgb-defined-colors-alist))))
-          (icicle-user-error "No such color: %S" color))
-        (setq color  (hexrgb-color-name-to-hex color)))
-      (setq palette-last-color  palette-current-color)
-      (save-selected-window
-        (setq color  (hexrgb-color-name-to-hex color)) ; Needed if not interactive.
-        (palette-set-current-color color)
+    (let ((color  (icicle-color-from-multi-completion-input raw-input 'MSG)))
+      (icicle-pick-color-by-name-1 color)))
+
+  (defun icicle-pick-color-by-name-1 (color &optional msgp)
+    "Set the current palette color to COLOR.
+If the palette is displayed, redisplay it, moving the cursor to COLOR.
+Non-nil MSGP means echo the chosen color name."
+    (setq palette-last-color  palette-current-color
+          color               (hexrgb-color-name-to-hex color))
+    (save-selected-window
+      (palette-set-current-color color)
+      (when (get-buffer-window "Palette (Hue x Saturation)" 'visible)
         (palette-where-is-color color)
         (palette-brightness-scale)
-        (palette-swatch))
-      palette-current-color))
+        (palette-swatch)))
+    (prog1 palette-current-color
+      (when msgp (message "Palette color (RGB) is now `%s'" palette-current-color))))
 
-  (define-key palette-mode-map (icicle-kbd "c")  'icicle-pick-color-by-name)
+  (define-key palette-mode-map (icicle-kbd "c")     'icicle-pick-color-by-name)
+  (define-key palette-mode-map (icicle-kbd "\M-c")  'icicle-pick-color-by-name)
   (define-key palette-popup-map [pick-color-by-name] ; Use same name as in `palette.el'.
     `(menu-item "Choose Color By Name" icicle-pick-color-by-name
       :help "Set the current color to a color you name"))
@@ -2485,6 +2518,156 @@ buffer."
                  "`font-lock-keywords' set to all candidates"))))
   )
 
+;; The name of this command is quite unfortunate.  It must have this name, since we use
+;; `icicle-functions-to-redefine' to switch between vanilla `complete' and this.
+;;
+(defun icicle-complete (&optional arg)
+  "Complete the name before point.
+This has an effect only when `dynamic-completion-mode' is on.  That
+mode is defined in Emacs library `completion.el'.  To use this
+command, enter Icicle mode after turning on `dynamic-completion-mode'.
+
+If option `icicle-cmpl-max-candidates-to-cycle' is non-negative
+integer M, and if there are at least M completion candidates, then use
+Icicles minibuffer completion to choose one.  The text before point is
+treated as a prefix to match, but you can of course use progressive
+completion to then match also substrings or other regexps.
+
+Icicles minibuffer completion is also used regardless of the value of
+`icicle-cmpl-max-candidates-to-cycle', if you use two or more plain
+prefix args (`C-u C-u').
+
+Otherwise, consecutive calls cycle through the possible completions,
+in place.  This is the vanilla `complete' command behavior from
+library `completion.el'.
+
+Point is normally left at the end of the inserted completion.
+
+Prefix arg behavior:
+
+ Odd number of `C-u': Leave point at start, not end, of completion.
+
+ More than one `C-u': Use Icicles minibuffer completion.
+
+ An integer N       : Use Nth next completion (previous Nth if N < 0).
+ `-'                : Same as -1: previous completion.
+
+If option `icicle-cmpl-include-cdabbrev-flag' is non-nil then Icicles
+completion includes candidates found dynamically from the currently
+available windows.  These candidates are highlighted in buffer
+`*Completions*' using face `icicle-special-candidate' so you can
+easily distinguish them.
+
+This is the so-called `CDABBREV' completion method defined in
+`completion.el'.  It is similar to how `dabbrev' finds candidates but
+with these differences:
+* It is sometimes faster, since it does not use regexps.  It searches
+  backwards looking for names that start with the text before point.
+* Case-sensitivity is handled as for other `completion.el' completion.
+
+If Icicles completion is not used then this `CDABBREV' completion is
+used only when no matching completions are found in the completions
+database.  With Icicles completion you can immediately choose one of
+the `CDABBREV' candidates.
+
+During Icicles minibuffer completion you can use `S-delete' to remove
+the current completion candidate from the database of completions.
+Cycle among the candidates (e.g. `down'), and use `S-delete' to delete
+as many as you want.
+
+\(You can also delete any database entry using `\\[kill-completion]'.
+And you can add a database entry using `\\[add-completion]'.)
+
+See the comments at the top of `completion.el' for more info."
+  (interactive "*p")
+  (let ((buf-modified-p        (buffer-modified-p))
+        (icicle-sort-comparer  nil)
+        (icicle-sort-orders-alist
+         '(("by last dynamic completion") ; Renamed from "turned OFF'.
+           ("cdabbrev candidates first" . icicle-special-candidates-first-p)
+           ("alphabetical" . icicle-case-string-less-p)
+           ("by last use as input" . icicle-latest-input-first-p)
+           ("by previous input use alphabetically" . icicle-historical-alphabetic-p))))
+    (cond ((eq last-command this-command)
+           (delete-region cmpl-last-insert-location (point)) ; Undo last one
+           (setq cmpl-current-index  (+ cmpl-current-index (or arg  1)))) ; Get next completion
+          (t
+           (unless cmpl-initialized-p (completion-initialize)) ; Make sure everything is loaded
+           (if (and (consp current-prefix-arg)  (eq (logand (length current-prefix-arg) 1) 1)) ; `oddp'
+               (setq cmpl-leave-point-at-start  t
+                     arg                        0)
+             (setq cmpl-leave-point-at-start  nil))
+           (setq cmpl-original-string  (symbol-before-point-for-complete))
+           (unless cmpl-original-string
+             (setq this-command  'failed-complete)
+             (error "To complete, point must be after a symbol at least %d chars long"
+                    completion-prefix-min-length))
+           (setq cmpl-current-index  (if current-prefix-arg arg 0))
+           (completion-search-reset cmpl-original-string) ; Reset database
+           (delete-region cmpl-symbol-start cmpl-symbol-end))) ; Erase what we've got
+    (let* ((num-comps       0)
+           (db-comps        ())
+           (db-comps        (progn (mapatoms (lambda (sy)
+                                               (when (eq 0 (string-match cmpl-test-regexp (symbol-name sy)))
+                                                 (push (find-exact-completion (symbol-name sy)) db-comps)
+                                                 (setq num-comps  (1+ num-comps))))
+                                             cmpl-obarray)
+                                   db-comps))
+           (all-comps       db-comps)
+           (all-comps       (if (not icicle-cmpl-include-cdabbrev-flag)
+                                db-comps
+                              (unless cmpl-cdabbrev-reset-p
+                                (reset-cdabbrev cmpl-test-string cmpl-tried-list)
+                                (setq cmpl-cdabbrev-reset-p  t))
+                              (let ((next  nil))
+                                (while (and (setq next  (next-cdabbrev))
+                                            (not (assoc next db-comps))) ; Not in database
+                                  (put-text-property 0 (length next) 'face 'icicle-special-candidate next)
+                                  (push (list next) all-comps)
+                                  (setq num-comps  (1+ num-comps)))
+                                all-comps)))
+           (use-icicles-p   (or (and (consp current-prefix-arg) ; `C-u C-u...' (more than one)
+                                     (> (prefix-numeric-value current-prefix-arg) 4)
+                                     (> num-comps 1))
+                                (and icicle-cmpl-max-candidates-to-cycle
+                                     (> num-comps (max 1 icicle-cmpl-max-candidates-to-cycle)))))
+           (print-status-p  (and (>= baud-rate completion-prompt-speed-threshold)
+                                 (not (window-minibuffer-p))))
+           (insert-point    (point))
+           (entry           (if use-icicles-p
+                                (condition-case nil
+                                    (let ((completion-ignore-case                  t)
+                                          (icicle-show-Completions-initially-flag  t)
+                                          (icicle-delete-candidate-object          'delete-completion))
+                                      (completing-read "Completion: " all-comps nil t cmpl-original-string))
+                                  (quit nil)) ; Return nil, so deleted original prefix will be re-inserted.
+                              (completion-search-next cmpl-current-index))) ; Cycle to next.
+           string)
+      ;; If ENTRY is non-nil, it is a full completion entry or a string (if cdabbrev or if USE-ICICLES-P).
+      (cond (entry                      ; Found, so insert it.
+             (setq string  (if (stringp entry) entry (completion-string entry)) ; Use proper case
+                   string  (cmpl-merge-string-cases string cmpl-original-string))
+             (insert string)
+             (setq completion-to-accept  string)
+             (if (not cmpl-leave-point-at-start) ; Fix-up and cache point
+                 (setq cmpl-last-insert-location  insert-point) ; Point at end.
+               (setq cmpl-last-insert-location  (point))
+               (goto-char insert-point))
+             (unless use-icicles-p      ; Display the next completion
+               (cond ((and print-status-p
+                           (sit-for 0)  ; Update the display.  Print only if there is no typeahead.
+                           (setq entry  (completion-search-peek completion-cdabbrev-prompt-flag)))
+                      (setq string  (if (stringp entry) entry (completion-string entry))
+                            string  (cmpl-merge-string-cases string cmpl-original-string))
+                      (message "Next completion: `%s'" string)))))
+            (t                          ; No completion found, so re-insert original.
+             (insert cmpl-original-string)
+             (set-buffer-modified-p buf-modified-p)
+             (setq completion-to-accept  nil) ; Do not accept completions.
+             (when (and print-status-p  (sit-for 0))
+               (message "No %scompletions" (if (eq this-command last-command) "more " "")))
+             (setq this-command  'failed-complete)))))) ; Pretend that we were never here
+
 
 (defvar icicle-info-buff nil
   "Info buffer before command was invoked.")
@@ -2494,10 +2677,12 @@ buffer."
 
 (defun icicle-Info-index (&optional topic)
   "Like vanilla `Info-index', but you can use multi-command keys `C-RET', `C-up' etc.
-Also, for Emacs 22 and later, completion candidates (index topics) for
-nodes already visited are highlighted with face
-`icicle-historical-candidate-other' if there are fewer matching
-candidates than `icicle-Info-visited-max-candidates'"
+Also, for Emacs 22 and later:
+Completion candidates (index topics) for nodes you have already
+visited may be highlighted automatically with face
+`icicle-historical-candidate-other', depending on the value of option
+`icicle-Info-highlight-visited-nodes'.  You can always effect such
+highlighting on demand, using `C-M-l'."
   ;; We allow an arg only for non-interactive use.  E.g., `Info-virtual-index' calls (Info-index TOPIC).
   (interactive)
   (unless (and (featurep 'info)  (eq major-mode 'Info-mode))
@@ -3247,7 +3432,7 @@ See also: `icicle-apropos-value'."      ; Doc string
 
 ;;; $$$$$$ (defun icicle-funvardoc-action (entry)
 ;;;   "Action function for `icicle-vardoc', `icicle-fundoc', `icicle-plist'."
-;;;   (with-output-to-temp-buffer "*Help*" (princ entry)))
+;;;   (icicle-with-help-window "*Help*" (princ entry)))
 
 (icicle-define-command icicle-fundoc    ; Command name
   "Choose a function description.
@@ -3583,9 +3768,16 @@ Use `mouse-2', `RET', or `S-RET' to finally choose a candidate, or
 `C-g' to quit.  This is an Icicles command - see command
 `icicle-mode'.
 
-`icicle-apply' overrides `icicle-buffer-ignore-space-prefix-flag',
-binding it to nil so that candidates with initial spaces can be
-matched."
+Note:
+* `icicle-apply' overrides `icicle-buffer-ignore-space-prefix-flag',
+  binding it to nil so that candidates with initial spaces can be
+  matched.
+* `icicle-apply' binds user option `icicle-incremental-completion' to
+  `always', because I think you typically want to start it out with
+  incremental completion turned on.  Functions that call
+  `icicle-apply' thus also turn on incremental completion.
+  Remember that you can use `C-#' (once or twice) to turn incremental
+  completion off."
   (interactive
    (list (symbol-value
           (intern
@@ -3678,16 +3870,24 @@ matched."
     (select-frame-set-input-focus (selected-frame))))
 
 (defun icicle-goto-marker-or-set-mark-command (arg) ; Bound to `C-@', `C-SPC'.
-  "With prefix arg < 0, `icicle-goto-marker'; else `set-mark-command'.
+  "Set mark or goto a marker.
+With no prefix arg or a prefix arg > 0, this is `set-mark-command'.
+\(This includes the cases of `C-u' and `C-u C-u'.) 
+With a prefix arg = 0, this is `icicle-goto-any-marker'.
+With a prefix arg < 0, this is `icicle-goto-marker'.
+
+See each of those commands for more information.
+
 By default, Icicle mode remaps all key sequences that are normally
 bound to `set-mark-command' to
 `icicle-goto-marker-or-set-mark-command'.  If you do not want this
 remapping, then customize option `icicle-top-level-key-bindings'."
   (interactive "P")
-  (if (not (wholenump (prefix-numeric-value arg)))
-      (icicle-goto-marker)
-    (setq this-command 'set-mark-command) ; Let `C-SPC C-SPC' activate if not `transient-mark-mode'.
-    (set-mark-command arg)))
+  (cond ((< (prefix-numeric-value arg) 0) (icicle-goto-marker))
+        ((= (prefix-numeric-value arg) 0) (icicle-goto-any-marker))
+        (t
+         (setq this-command 'set-mark-command) ; Let `C-SPC C-SPC' activate if not `transient-mark-mode'.
+         (set-mark-command arg))))
 
 (defun icicle-goto-global-marker-or-pop-global-mark (arg) ; Bound to `C-x C-@', `C-x C-SPC'.
   "With prefix arg < 0, `icicle-goto-global-marker'; else `pop-global-mark'.
@@ -3728,17 +3928,52 @@ With prefix `C-M-' instead of `C-', the same keys (`C-M-mouse-2',
 
 Use `mouse-2', `RET', or `S-RET' to choose a candidate as the final
 destination, or `C-g' to quit.  This is an Icicles command - see
-command `icicle-mode'."
+command `icicle-mode'.
+
+See also commands `icicle-goto-any-marker' and
+`icicle-goto-global-marker'."
   (interactive)
   (let ((icicle-sort-orders-alist  (cons '("by position" .  icicle-cdr-lessp) icicle-sort-orders-alist))
         (icicle-sort-comparer      'icicle-cdr-lessp))
     (icicle-goto-marker-1 mark-ring)))
 
+(defun icicle-goto-any-marker ()        ; Bound to `C-0 C-@', `C-0 C-SPC'.
+  "Like `icicle-goto-marker', but lets you visit markers in all buffers.
+If user option `icicle-show-multi-completion-flag' is non-nil, then
+each completion candidate is has two parts, the first of which is the
+name of the marker's buffer, and the second of which is the text from
+the marker's line.
+
+By default, candidates are sorted in buffer order and then marker
+order, that is, buffer positions.  Use `C-M-,' or `C-,' to change the
+sort order.  Remember too that you can use `C-A' to toggle
+case-sensitivity (e.g., for buffer names).
+
+See also command `icicle-goto-global-marker'."
+  (interactive)
+  (let ((icicle-multi-completing-p          icicle-show-multi-completion-flag)
+        (icicle-list-nth-parts-join-string  "\t")
+        (icicle-list-join-string            "\t")
+        (icicle-sort-orders-alist           (cons '("by buffer, then by position" . icicle-part-1-cdr-lessp)
+                                                  icicle-sort-orders-alist))
+        (icicle-sort-comparer               'icicle-part-1-cdr-lessp)
+        (icicle-candidate-properties-alist  (and icicle-show-multi-completion-flag
+                                                 '((1 (face icicle-candidate-part))))))
+    (icicle-goto-marker-1 'all)))
+
 (defun icicle-goto-global-marker ()     ; Bound to `C-- C-x C-@', `C-- C-x C-SPC'.
   "Like `icicle-goto-marker', but visits global, not local, markers.
 If user option `icicle-show-multi-completion-flag' is non-nil, then
-each completion candidate is annotated (prefixed) with the name of the
-marker's buffer, to facilitate orientation."
+each completion candidate is has two parts, the first of which is the
+name of the marker's buffer, and the second of which is the text from
+the marker's line.
+
+By default, candidates are sorted in buffer order and then marker
+order, that is, buffer positions.  Use `C-M-,' or `C-,' to change the
+sort order.  Remember too that you can use `C-A' to toggle
+case-sensitivity (e.g., for buffer names).
+
+See also command `icicle-goto-any-marker'."
   (interactive)
   (let ((icicle-multi-completing-p          icicle-show-multi-completion-flag)
         (icicle-list-nth-parts-join-string  "\t")
@@ -3751,36 +3986,40 @@ marker's buffer, to facilitate orientation."
     (icicle-goto-marker-1 global-mark-ring)))
 
 (defun icicle-goto-marker-1 (ring)
-  "Helper function for `icicle-goto-marker', `icicle-goto-global-marker'.
-RING is the marker ring to use."
-  (unwind-protect
-       (let* ((global-ring-p
-               (memq this-command '(icicle-goto-global-marker
-                                    icicle-goto-global-marker-or-pop-global-mark)))
-              (markers
-               (if (and (not global-ring-p)  (marker-buffer (mark-marker)))
-                   (cons (mark-marker) (icicle-markers ring))
-                 (icicle-markers ring)))
-              (icicle-delete-candidate-object
-               (lambda (cand)
-                 (let ((mrkr+txt  (funcall icicle-get-alist-candidate-function cand)))
-                   (move-marker (cdr mrkr+txt) nil))))
-              (icicle-alternative-sort-comparer  nil)
-              (icicle-last-sort-comparer         nil)
-              (icicle-orig-buff                  (current-buffer)))
-         (unless (consp markers)
-           (icicle-user-error (if global-ring-p "No global markers" "No markers in this buffer")))
-         (cond ((cdr markers)
-                (icicle-apply (mapcar (lambda (mrkr) (icicle-marker+text mrkr global-ring-p))
-                                      markers)
-                              #'icicle-goto-marker-1-action
-                              'nomsg
-                              (lambda (cand)
-                                (marker-buffer (cdr cand)))))
-               ((= (point) (car markers)) (message "Already at marker: %d" (point)))
-               (t
-                (icicle-goto-marker-1-action (icicle-marker+text (car markers) global-ring-p)))))
-    (when (fboundp 'crosshairs-unhighlight) (crosshairs-unhighlight 'even-if-frame-switch))))
+  "Helper function for Icicles functions for navigating amoung markers.
+RING is the marker ring to use, or the symbol `all', which means use
+the markers in each buffer."
+  (let ((icicle-transform-function  'icicle-remove-duplicates))
+    (unwind-protect
+         (let* ((allp     (eq ring 'all))
+                (globalp  (and (not allp)
+                               (memq this-command '(icicle-goto-global-marker
+                                                    icicle-goto-global-marker-or-pop-global-mark))))
+                (bufs     (if globalp
+                              'global
+                            (if allp
+                                (icicle-remove-if #'minibufferp (buffer-list))
+                              (and (not (minibufferp (current-buffer)))  (list (current-buffer))))))
+                (markers  (icicle-markers bufs))
+                (icicle-delete-candidate-object
+                 (lambda (cand)
+                   (let ((mrkr+txt  (funcall icicle-get-alist-candidate-function cand)))
+                     (move-marker (cdr mrkr+txt) nil))))
+                (icicle-alternative-sort-comparer  nil)
+                (icicle-last-sort-comparer         nil)
+                (icicle-orig-buff                  (current-buffer)))
+           (unless (consp markers) (icicle-user-error (cond (globalp "No global markers")
+                                                            (allp "No markers")
+                                                            (t "No markers in this buffer"))))
+           (cond ((cdr markers)
+                  (icicle-apply (mapcar (lambda (mrkr) (icicle-marker+text mrkr (or allp  globalp))) markers)
+                                #'icicle-goto-marker-1-action
+                                'nomsg
+                                (lambda (cand) (marker-buffer (cdr cand)))))
+                 ((= (point) (car markers)) (message "Already at marker: %d" (point)))
+                 (t
+                  (icicle-goto-marker-1-action (icicle-marker+text (car markers) (or allp  globalp))))))
+      (when (fboundp 'crosshairs-unhighlight) (crosshairs-unhighlight 'even-if-frame-switch)))))
 
 (defun icicle-goto-marker-1-action (cand)
   "Action function for `icicle-goto-marker-1'."
@@ -3790,37 +4029,50 @@ RING is the marker ring to use."
   (unless (pos-visible-in-window-p) (recenter icicle-recenter))
   (when (fboundp 'crosshairs-highlight) (crosshairs-highlight)))
 
-(defun icicle-marker+text (marker &optional globalp)
+(defun icicle-marker+text (marker &optional show-bufname-p)
   "Cons of text line that includes MARKER with MARKER itself.
 If the marker is on an empty line, then text \"<EMPTY LINE>\" is used.
-If both optional argument GLOBALP and option
+If both optional argument SHOW-BUFNAME-P and option
 `icicle-show-multi-completion-flag' are non-nil, then the text is
-prefixed by MARKER's buffer name."
-  (with-current-buffer (marker-buffer marker)
-    (save-excursion
-      (goto-char marker)
-      (let ((line  (let ((inhibit-field-text-motion  t)) ; Just to be sure, for `line-end-position'.
-                     (buffer-substring-no-properties (line-beginning-position) (line-end-position))))
-            (buff  (and globalp  icicle-show-multi-completion-flag  (buffer-name)))
-            (help  (and (or (> icicle-help-in-mode-line-delay 0) ; Get it only if user will see it.
-                            (and (boundp 'tooltip-mode)  tooltip-mode))
-                        (format "Line: %d, Char: %d" (line-number-at-pos) (point)))))
-        (when (string= "" line) (setq line  "<EMPTY LINE>"))
-        (when help
-          (icicle-candidate-short-help help line)
-          (when (and globalp  icicle-show-multi-completion-flag)
-            (icicle-candidate-short-help help buff)))
-        (if (and globalp  icicle-show-multi-completion-flag)
-            (cons (list buff line) marker)
-          (cons line marker))))))
-
-(defun icicle-markers (ring)
-  "Marks in mark RING that are in live buffers other than a minibuffer."
+prefixed by MARKER's buffer name and the line number."
+  (when (buffer-live-p (marker-buffer marker))
+    (with-current-buffer (marker-buffer marker)
+      (save-excursion
+        (goto-char marker)
+        (let* ((line    (let ((inhibit-field-text-motion  t)) ; Just to be sure, for `line-end-position'.
+                          (buffer-substring-no-properties (line-beginning-position) (line-end-position))))
+               (lineno  (line-number-at-pos))
+               (buff    (and show-bufname-p  icicle-show-multi-completion-flag
+                             (format "%s:%5d" (buffer-name) lineno)))
+               (help    (and (or (> icicle-help-in-mode-line-delay 0) ; Get it only if user will see it.
+                                 (and (boundp 'tooltip-mode)  tooltip-mode))
+                             (format "Line: %d, Char: %d" lineno (point)))))
+          (when (string= "" line) (setq line  "<EMPTY LINE>"))
+          (when help
+            (icicle-candidate-short-help help line)
+            (when (and show-bufname-p  icicle-show-multi-completion-flag)
+              (icicle-candidate-short-help help buff)))
+          (if (and show-bufname-p  icicle-show-multi-completion-flag)
+              (cons (list buff line) marker)
+            (cons line marker)))))))
+
+(defun icicle-markers (buffers)
+  "Return the list of markers in the mark rings of BUFFERS.
+If BUFFERS is the symbol `global' then return the list of markers in
+the `global-mark-ring' that are in live buffers other than
+minibuffers."
   (let ((markers  ()))
-    (dolist (mkr  ring)
-      (when (and (buffer-live-p (marker-buffer mkr))
-                 (not (string-match "\\` \\*Minibuf-[0-9]+\\*\\'" (buffer-name (marker-buffer mkr)))))
-        (push mkr markers)))
+    (if (eq buffers 'global)
+        (dolist (mkr  global-mark-ring)
+          (when (and (buffer-live-p (marker-buffer mkr))
+                     (not (string-match "\\` \\*Minibuf-[0-9]+\\*\\'" (buffer-name (marker-buffer mkr)))))
+            (push mkr markers)))
+      (dolist (buf  buffers)
+        (when (buffer-live-p buf)
+          (with-current-buffer buf
+            (setq markers  (nconc markers (if (and (mark-marker)  (marker-buffer (mark-marker)))
+                                              (cons (mark-marker) (copy-sequence mark-ring))
+                                            (copy-sequence mark-ring))))))))
     markers))
 
 (defun icicle-exchange-point-and-mark (&optional arg) ; Bound to `C-x C-x'.
@@ -3888,9 +4140,12 @@ specifying a regexp (followed by `RET').
 After specifying the regexp that defines the search contexts, type
 input (e.g. regexp or other pattern) to match within the contexts.
 The contexts that match your input are available as completion
-candidates.  You can use `\\<minibuffer-local-completion-map>\
-\\[icicle-apropos-complete-and-narrow]' to further narrow the candidates,
-typing additional patterns to match.
+candidates.  Use `S-TAB' to show them.  (Use `TAB' if you want prefix
+completion, which is not commonly the case for `icicle-search'.)
+
+You can use `\\<minibuffer-local-completion-map>\
+\\[icicle-apropos-complete-and-narrow]' to further narrow the candidates, typing
+additional patterns to match.
 
 By default, candidates are in order of buffer occurrence, but you can
 sort them in various ways using `\\[icicle-change-sort-order]'.
@@ -4232,6 +4487,13 @@ zones.  You can limit hits to regexp matches that also satisfy a
 predicate, by using `(PREDICATE)' as ARGS: PREDICATE is then passed to
 `icicle-search-regexp-scan' as its PREDICATE argument.
 
+Note: `icicle-search' effectively binds user option
+`icicle-incremental-completion' to `always', because I think you
+typically want to start it out with incremental completion turned on.
+Other Icicles search commands are defined using `icicle-search', so
+they also effectively turn on incremental completion.  Remember that
+you can use `C-#' (once or twice) to turn it off.
+
 This command is intended for use only in Icicle mode."
   (interactive `(,@(icicle-region-or-buffer-limits)
                  ,(if icicle-search-whole-word-flag
@@ -4579,6 +4841,19 @@ If ACTION is non-nil then it is a function that accepts no arguments.
                         (overlay-put ov 'priority 200) ; > ediff's 100+, < isearch-overlay's 1001.
                         (overlay-put ov 'face 'icicle-search-main-regexp-others)))))
                 (setq last-beg  beg))
+              (let* ((total  (length temp-list))
+                     (count  total)
+                     hit-str  help)
+                (dolist (hit  temp-list)
+                  (when (consp (car hit)) (setq hit  (car hit)))
+                  (setq hit-str  (car hit)
+                        help     (or (get-text-property 0 'icicle-mode-line-help hit-str)  "")
+                        help     (format "Context %d/%d%s%s" count total
+                                         (if add-bufname-p " in " ", ")
+                                         help)
+                        count    (1- count))
+                  (put-text-property 0 1 'icicle-mode-line-help help hit-str)
+                  (setcar hit hit-str)))
               (setq icicle-candidates-alist  (append icicle-candidates-alist (nreverse temp-list))))
           (quit (when icicle-search-cleanup-flag (icicle-search-highlight-cleanup)))
           (error (when icicle-search-cleanup-flag (icicle-search-highlight-cleanup))
@@ -4840,13 +5115,8 @@ current input matches candidate") (sit-for 2))
                    (while (and (or first-p  icicle-all-candidates-action)
                                (re-search-forward (or ecm  icicle-current-input) nil 'move-to-end))
                      (setq first-p  nil)
-                      ;; Search for original regexp, to set match data so replacements such as `\N' work.
-                     (when (and icicle-search-regexp  (> emacs-major-version 21))
-                       (goto-char (point-min))
-                       (re-search-forward icicle-search-regexp nil 'move-to-end))
-                     (icicle-search-replace-match replace-string
-                                                  (icicle-search-replace-fixed-case-p
-                                                   icicle-current-input)))))))
+                     (icicle-search-replace-match replace-string (icicle-search-replace-fixed-case-p
+                                                                  icicle-current-input)))))))
         (when replacement-p
           ;; Update the alist and `minibuffer-completion-table' with the new text.
 
@@ -4920,6 +5190,18 @@ FIXEDCASE is as for `replace-match'.  Non-nil means do not alter case."
                    (funcall (car compiled) (cdr compiled) (setq replace-count  (1+ replace-count)))
                  compiled)
                fixedcase icicle-search-replace-literally-flag nil (match-data)))
+          ;; @@@@@@ Hopefully this is only a temporary hack, until Emacs bug #18388 is fixed.
+          (wrong-number-of-arguments
+           (condition-case icicle-search-replace-match3
+               (replace-match-maybe-edit
+                (if (consp compiled)
+                    ;; `replace-count' is free here, bound in `icicle-search'.
+                    (funcall (car compiled) (cdr compiled) (setq replace-count  (1+ replace-count)))
+                  compiled)
+                fixedcase icicle-search-replace-literally-flag nil (match-data)
+                nil)                    ; BACKWARD parameter for Emacs 24.4+ - see bug #18388
+             (buffer-read-only (ding) (icicle-user-error "Buffer is read-only"))
+             (error (icicle-remove-Completions-window) (icicle-user-error "No match for `%s'" replace-string))))
           (buffer-read-only (ding) (icicle-user-error "Buffer is read-only"))
           (error (icicle-remove-Completions-window) (icicle-user-error "No match for `%s'" replace-string))))
     (condition-case icicle-search-replace-match2 ; Emacs < 22.  Try to interpret `\'.
@@ -4982,7 +5264,7 @@ No such highlighting is done if any of these conditions holds:
 (defun icicle-search-replace-fixed-case-p (from)
   "Return non-nil if FROM should be replaced without transferring case.
 FROM is a string or nil.  If FROM is nil, then return nil.
-Retuns non-nil if FROM is a string and one of the following holds:
+Returns non-nil if FROM is a string and one of the following holds:
  * FROM is not all lowercase
  * `case-replace' or `case-fold-search' is nil"
   (and from  (not (and case-fold-search  case-replace  (string= from (downcase from))))))
@@ -5135,10 +5417,13 @@ using `icicle-search'.  For more information, see the doc for command
   ((enable-recursive-minibuffers             t) ; In case we read input, e.g. File changed on disk...
    (completion-ignore-case                   bookmark-completion-ignore-case)
    (prompt                                   "Search bookmark: ")
-   (icicle-search-context-regexp             (icicle-search-read-context-regexp))
+   (icicle-search-context-regexp             (icicle-search-read-context-regexp
+                                              (format "Search bookmarks %swithin contexts (regexp): "
+                                                      (if icicle-search-complement-domain-p "*NOT* " ""))))
    (bookmark-automatically-show-annotations  nil) ; Do not show annotations
    (icicle-multi-completing-p                icicle-show-multi-completion-flag)
    (icicle-list-use-nth-parts                '(1))
+   (icicle-bookmark-completing-p             t)
    (icicle-candidate-properties-alist        (if (not icicle-show-multi-completion-flag)
                                                  ()
                                                '((2 (face icicle-annotation))
@@ -5396,19 +5681,6 @@ list includes the names of the symbols that satisfy
     (setq types  (sort types #'string-lessp))
     (mapcar #'list types)))
 
-;;; Same as `thgcmd-defined-thing-p' in `thing-cmds.el'.
-(defun icicle-defined-thing-p (thing)
-  "Return non-nil if THING (type) is defined as a thing-at-point type."
-  (let ((forward-op    (or (get thing 'forward-op)  (intern-soft (format "forward-%s" thing))))
-        (beginning-op  (get thing 'beginning-op))
-        (end-op        (get thing 'end-op))
-        (bounds-fn     (get thing 'bounds-of-thing-at-point))
-        (thing-fn      (get thing 'thing-at-point)))
-    (or (functionp forward-op)
-        (and (functionp beginning-op)  (functionp end-op))
-        (functionp bounds-fn)
-        (functionp thing-fn))))
-
 ;; Same as `hide/show-comments' in `hide-comnt.el'.
 ;;
 (defun icicle-hide/show-comments (&optional hide/show start end)
@@ -6254,7 +6526,9 @@ using `icicle-search'.  For more information, see the doc for command
 `icicle-search', but without BEG, END, and WHERE."
   (interactive `(,(if icicle-search-whole-word-flag
                       (icicle-search-read-word)
-                      (icicle-search-read-context-regexp))
+                      (icicle-search-read-context-regexp
+                       (format "Search bookmarks %swithin contexts (regexp): "
+                               (if icicle-search-complement-domain-p "*NOT* " ""))))
                  ,(not icicle-show-multi-completion-flag)))
   (let ((icicle-multi-completing-p  icicle-show-multi-completion-flag))
     (apply #'icicle-search nil nil scan-fn-or-regexp require-match
@@ -6553,8 +6827,8 @@ using `icicle-search'.  For more information, see the doc for command
   (let ((icicle-multi-completing-p  (and current-prefix-arg
                                          (not (zerop (prefix-numeric-value current-prefix-arg)))
                                          icicle-show-multi-completion-flag))
-        (fg (face-foreground        'icicle-search-main-regexp-others))
-        (bg (face-background        'icicle-search-main-regexp-others))
+        (fg                         (face-foreground 'icicle-search-main-regexp-others))
+        (bg                         (face-background 'icicle-search-main-regexp-others))
         (icicle-transform-function  (and (not (interactive-p))  icicle-transform-function)))
     (unwind-protect
          (progn (set-face-foreground 'icicle-search-main-regexp-others nil)
@@ -6728,8 +7002,7 @@ information about the arguments, see the doc for command
   ;; Is there a better test we can use, to make sure the current mode inherits from `comint-mode'?
   (unless (where-is-internal 'comint-send-input (keymap-parent (current-local-map)))
     (icicle-user-error "Current mode must be derived from comint mode"))
-  (let ((orig-search-hook           icicle-search-hook)
-        (icicle-transform-function  'icicle-remove-duplicates))
+  (let ((icicle-transform-function  'icicle-remove-duplicates))
     (add-hook 'icicle-search-hook 'icicle-comint-search-send-input)
     (unwind-protect
          (icicle-search beg end (concat comint-prompt-regexp "\\S-.*") nil) ; Match not required (edit).
@@ -6946,7 +7219,7 @@ procedure name."
     (icicle-imenu-1 nil beg end require-match where)))
 
 (defun icicle-imenu-help (cand)
-  "Use as `icicle-candidate-help-fn' for `icicle-search' commands."
+  "Use as `icicle-candidate-help-fn' for `icicle-imenu' commands."
   (let* ((icicle-whole-candidate-as-text-prop-p  t)
          (marker  (cdr (funcall icicle-get-alist-candidate-function cand)))
          (buffer  (marker-buffer marker)))
@@ -7001,7 +7274,7 @@ search multiple regions, buffers, or files, see the doc for command
     (icicle-user-error "This command is only for Emacs-Lisp mode"))
   (icicle-imenu-1 nil beg end require-match where 'icicle-imenu-command-p
                   (lambda (menus)
-                    (or (car (assoc "Functions" menus))
+                    (or (car (icicle-alist-key-match "Functions.*" menus))
                         (car (assoc "Other" menus))
                         (icicle-user-error "No command definitions in buffer")))))
 
@@ -7023,7 +7296,7 @@ anytime during completion using `C-u C-x .'"
     (icicle-user-error "This command is only for Emacs-Lisp mode"))
   (icicle-imenu-1 'FULL beg end require-match where 'icicle-imenu-command-p
                   (lambda (menus)
-                    (or (car (assoc "Functions" menus))
+                    (or (car (icicle-alist-key-match "Functions.*" menus))
                         (car (assoc "Other" menus))
                         (icicle-user-error "No command definitions in buffer")))))
 
@@ -7054,7 +7327,7 @@ search multiple regions, buffers, or files, see the doc for command
     (icicle-user-error "This command is only for Emacs-Lisp mode"))
   (icicle-imenu-1 nil beg end require-match where 'icicle-imenu-non-interactive-function-p
                   (lambda (menus)
-                    (or (car (assoc "Functions" menus))
+                    (or (car (icicle-alist-key-match "Functions.*" menus))
                         (car (assoc "Other" menus))
                         (icicle-user-error "No non-command function definitions in buffer")))))
 
@@ -7076,7 +7349,7 @@ anytime during completion using `C-u C-x .'"
     (icicle-user-error "This command is only for Emacs-Lisp mode"))
   (icicle-imenu-1 'FULL beg end require-match where 'icicle-imenu-non-interactive-function-p
                   (lambda (menus)
-                    (or (car (assoc "Functions" menus))
+                    (or (car (icicle-alist-key-match "Functions.*" menus))
                         (car (assoc "Other" menus))
                         (icicle-user-error "No non-command function definitions in buffer")))))
 
@@ -7353,40 +7626,52 @@ The other args are as for `icicle-search'."
     (unwind-protect
          (save-match-data
            (set-syntax-table table)
-           (let* ((others   0)
+           (let* ((regexp   nil)
+                  (others   0)
                   (menus    (mapcar (lambda (menu)
                                       (when (equal (car menu) "Other")
                                         (setq others  (1+ others))
-                                        (when (> others 1)
-                                          (setcar menu (format "Other<%d>" others))))
+                                        (when (> others 1) (setcar menu (format "Other<%d>" others))))
                                       menu)
                                     (icicle-remove-if-not
                                      #'icicle-imenu-in-buffer-p ; Use only menus that match buffer.
                                      (mapcar (lambda (menu) ; Name unlabeled menu(s) `Other[<N>]'.
-                                               (if (stringp (car menu))
-                                                   menu
-                                                 (cons "Other" (cdr menu))))
+                                               (if (stringp (car menu)) menu (cons "Other" (cdr menu))))
                                              imenu-generic-expression))))
                   (submenu  (if submenu-fn
                                 (funcall submenu-fn menus)
                               (if (cadr menus)
-                                  (let ((icicle-show-Completions-initially-flag  t)
-                                        (completion-ignore-case                  t))
-                                    (completing-read "Choose: " menus nil t))
+                                  ;; There could be multiple submenus with the same name.
+                                  ;; E.g., `Functions' could come from `defun' or `defalias'.
+                                  ;; So we cannot just use (cadr (assoc submenus menus)) to get the regexp.
+                                  (let* ((icicle-show-Completions-initially-flag  t)
+                                         (icicle-whole-candidate-as-text-prop-p   t)
+                                         (icicle-candidates-alist                 menus)
+                                         (icicle-remove-icicles-props-p           nil) ;`icicle-whole-candidate'
+                                         (completion-ignore-case                  t)
+                                         (submnu                                  (completing-read
+                                                                                   "Choose: " menus nil t)))
+                                    (setq regexp  (cadr (icicle-get-alist-candidate submnu 'NO-ERROR))))
                                 (caar menus)))) ; Only one submenu, so use it.
-                  (regexp   (cadr (assoc submenu menus)))
                   (icicle-transform-function
                    (and (not (interactive-p))  icicle-transform-function)))
-             (unless (stringp regexp) (icicle-user-error "No match"))
-             (icicle-search
-              beg end regexp require-match where predicate
-              ;; We rely on the match data having been preserved.
-              ;; $$$$$$ An alternative fn for Lisp only: (lambda () (up-list -1) (forward-sexp))))))
-              (and fullp  (lambda ()
-                            (goto-char (match-beginning 0))
-                            (condition-case icicle-imenu-1
-                                (forward-sexp)
-                              (error (goto-char (match-end 0))))))))) ; Punt: just use regexp match.
+             (unless (stringp regexp)
+               (if submenu (setq regexp  (cadr (assoc submenu menus))) (icicle-user-error "No match")))
+             (unwind-protect
+                  (progn (when (boundp 'imenu-after-jump-hook)
+                           (dolist (fn  imenu-after-jump-hook) (add-hook 'icicle-search-hook fn)))
+                         (icicle-search beg end regexp require-match where predicate
+                                        ;; We rely on the match data having been preserved.
+                                        ;; $$$$$$ An alternative fn for Lisp only:
+                                        ;;        (lambda () (up-list -1) (forward-sexp))))))
+                                        (and fullp  (lambda ()
+                                                      (goto-char (match-beginning 0))
+                                                      (condition-case icicle-imenu-1
+                                                          (forward-sexp)
+                                                        ;; Punt: just use regexp match.
+                                                        (error (goto-char (match-end 0))))))))
+               (when (boundp 'imenu-after-jump-hook)
+                 (dolist (fn  imenu-after-jump-hook) (remove-hook 'icicle-search-hook fn))))))
       (set-syntax-table old-table))))
 
 (defun icicle-imenu-in-buffer-p (menu)
@@ -7447,7 +7732,7 @@ future search commands, not the current one.)"
           (setcar tail (cadr tail))
           (setcdr tail (cddr tail))))
       (when unreadable-files
-        (with-output-to-temp-buffer "*Unreadable Files*"
+        (icicle-with-help-window "*Unreadable Files*"
           (princ "These missing or unreadable files were ignored:") (terpri) (terpri)
           (dolist (file  unreadable-files) (princ file) (terpri)))))
     (select-window (minibuffer-window))
@@ -7926,7 +8211,7 @@ filtering:
                            (and (fboundp 'confirm-nonexistent-file-or-buffer) ; Emacs 23.
                                 (confirm-nonexistent-file-or-buffer))
                            nil 'buffer-name-history nil nil))))
-      (color (icicle-read-color-wysiwyg 1)) ; Use the color name (only).
+      (color (icicle-read-color-WYSIWYG 1)) ; Use the color name (only).
       (command (let* ((pred                                    (lambda (s)
                                                                  (unless (symbolp s) (setq s  (intern s)))
                                                                  (commandp s)))
@@ -8044,6 +8329,112 @@ This command requires library `expand-region.el'."
   (unless (require 'expand-region nil t) ; First code
     (icicle-user-error "You need library `expand-region.el' for this command")))
 
+
+;; Based on the `describe-package' definition in `help-fns+.el'.  Try to keep the two synced.
+;;
+(when (fboundp 'describe-package)       ; Emacs 24+
+  (defun icicle-describe-package (package)
+    "Display the full documentation of PACKAGE (a symbol).
+During completion for a package name, you can use `M-&' to narrow the
+candidates to packages of different kinds."
+    (interactive
+     (let* ((guess  (function-called-at-point)))
+       (require 'finder-inf nil t)
+       ;; Load the package list if necessary (but don't activate them).
+       (unless package--initialized (package-initialize t))
+       (let ((packages                     (append (mapcar 'car package-alist)
+                                                   (mapcar 'car package-archive-contents)
+                                                   (mapcar 'car package--builtins)))
+             (icicle-package-completing-p  t))
+         (unless (memq guess packages) (setq guess  nil))
+         (setq packages  (mapcar 'symbol-name packages))
+         (let ((val  (completing-read (if guess
+                                          (format "Describe package (default %s): " guess)
+                                        "Describe package: ")
+                                      packages nil t nil nil guess)))
+           (list (if (equal val "") guess (intern val)))))))
+    (if (not (or (and (fboundp 'package-desc-p)  (package-desc-p package))
+                 (and package (symbolp package))))
+        (when (called-interactively-p 'interactive) (message "No package specified"))
+      (help-setup-xref (list #'describe-package package) (called-interactively-p 'interactive))
+      (with-help-window (help-buffer)
+        (with-current-buffer standard-output
+          (describe-package-1 package)
+          (when (fboundp 'package-desc-name)  (setq package  (package-desc-name package))) ; Emacs 24.4+
+          (when (fboundp 'Info-make-manuals-xref) ; In `help-fns+.el', for Emacs 23.2+.
+            (Info-make-manuals-xref (concat (symbol-name package) " package")
+                                    nil nil (not (called-interactively-p 'interactive)))))))))
+
+(defun icicle-wide-n ()
+  "Choose a restriction and apply it.  Or choose `No restriction' to widen.
+During completion you can use these keys\\<minibuffer-local-completion-map>:
+
+`C-RET'   - Goto marker named by current completion candidate
+`C-down'  - Goto marker named by next completion candidate
+`C-up'    - Goto marker named by previous completion candidate
+`C-next'  - Goto marker named by next apropos-completion candidate
+`C-prior' - Goto marker named by previous apropos-completion candidate
+`C-end'   - Goto marker named by next prefix-completion candidate
+`C-home'  - Goto marker named by previous prefix-completion candidate
+`\\[icicle-delete-candidate-object]' - Delete restriction named by current completion candidate
+
+When candidate action and cycling are combined (e.g. `C-next'), option
+`icicle-act-before-cycle-flag' determines which occurs first.
+
+Use `mouse-2', `RET', or `S-RET' to choose a candidate as the final
+destination, or `C-g' to quit.  This is an Icicles command - see
+command `icicle-mode'."
+  (interactive)
+  (unless (featurep 'wide-n) (error "You need library `wide-n.el' for this command"))
+  (unless (cadr wide-n-restrictions) (error "No restrictions - you have not narrowed this buffer"))
+  (if (< (length wide-n-restrictions) 3) ; Only one restriction.  If narrowed widen, else apply the restriction.
+      (wide-n 1 'MSG)
+    (let ((icicle-sort-comparer  'icicle-special-candidates-first-p)
+          (icicle-delete-candidate-object
+           (lambda (cand)
+             (let ((nn  (icicle-get-alist-candidate cand)))
+               (if (eq 'all (cadr nn)) (error "Cannot delete `No restriction'")
+                 (with-current-buffer icicle-pre-minibuffer-buffer
+                   (setq wide-n-restrictions  (delete 'all wide-n-restrictions)
+                         wide-n-restrictions  (delete (cdr nn) wide-n-restrictions))
+                   (wide-n-renumber)))))))
+      (icicle-apply (let ((ns  ())
+                          beg end name)
+                      (save-restriction
+                        (widen)
+                        (dolist (nn  wide-n-restrictions)
+                          (if (eq 'all nn)
+                              (push `(,(icicle-propertize "No restriction" 'face 'icicle-special-candidate) all)
+                                    ns)
+                            (setq beg   (marker-position (cadr nn))
+                                  end   (marker-position (cddr nn))
+                                  name  (format "%d-%d, %s" beg end (buffer-substring beg end))
+                                  name  (replace-regexp-in-string "\n" " "
+                                                                  (substring name 0 (min 30 (length name))))
+                                  name  (format "%s\n" name))
+                            (push `(,name ,(car nn) ,@(cdr nn)) ns))))
+                      ns)
+                    #'icicle-wide-n-action
+                    'NOMSG))))
+
+(defun icicle-wide-n-action (cand)
+  "Action function for `icicle-wide-n': Narrow region to candidate CAND.
+If CAND has car \"No restriction\" then widen it instead."
+  (with-current-buffer icicle-pre-minibuffer-buffer
+    (if (not (eq 'all (cadr cand)))     ; "No restriction"
+        (condition-case err
+            (let ((wide-n-push-anyway-p  t))
+              (narrow-to-region (car (cddr cand)) (cdr (cddr cand)))
+              (wide-n-highlight-lighter)
+              (message wide-n-lighter-narrow-part))
+          (args-out-of-range
+           (setq wide-n-restrictions  (cdr wide-n-restrictions))
+           (error "Restriction removed because of invalid limits"))
+          (error (error "%s" (error-message-string err))))
+      (widen)
+      (wide-n-highlight-lighter)
+      (message "No longer narrowed"))))
+
 (defvar icicle-key-prefix nil
   "A prefix key.")
 
@@ -8153,6 +8544,7 @@ Use `mouse-2', `RET', or `S-RET' to finally choose a candidate, or
     (interactive)
     (let* ((completion-ignore-case                  t) ; Not case-sensitive, by default.
            (icicle-transform-function               'icicle-remove-duplicates)
+           (icicle-must-pass-after-match-predicate  nil) ; Remove any current one, e.g. for `M-x'.
            (icicle-orig-sort-orders-alist           icicle-sort-orders-alist) ; For recursive use.
            (icicle-orig-show-initially-flag         icicle-show-Completions-initially-flag)
            (icicle-show-Completions-initially-flag  t)
@@ -8179,6 +8571,7 @@ information."
     (interactive)
     (let* ((completion-ignore-case                  t) ; Not case-sensitive, by default.
            (icicle-transform-function               'icicle-remove-duplicates)
+           (icicle-must-pass-after-match-predicate  nil) ; Remove any current one, e.g. for `M-x'.
            (icicle-orig-sort-orders-alist           icicle-sort-orders-alist) ; For recursive use.
            (icicle-orig-show-initially-flag         icicle-show-Completions-initially-flag)
            (icicle-show-Completions-initially-flag  t)
@@ -8204,20 +8597,28 @@ But IF (a) this command is `icicle-complete-keys' and
            option `icicle-complete-keys-ignored-prefix-keys'
   THEN return [], as if `icicle-complete-keys' was invoked at top
        level, i.e., with no prefix key."
-  (let* ((this-key-sequence  (this-command-keys-vector))
-         (this-prefix        (substring this-key-sequence 0 (1- (length this-key-sequence)))))
-    (when (and (eq this-command 'icicle-complete-keys)
-               (icicle-some icicle-complete-keys-ignored-prefix-keys
-                            this-prefix
-                            #'icicle-same-vector-keyseq-p))
-      (setq this-prefix []))
-    this-prefix))
+    (let* ((this-key-sequence  (this-command-keys-vector))
+           (this-prefix        (substring this-key-sequence 0 (1- (length this-key-sequence)))))
+      (when (or (and (active-minibuffer-window)
+                     (icicle-some icicle-key-complete-keys-for-minibuffer
+                                  this-key-sequence
+                                  #'icicle-same-vector-keyseq-p))
+                (and (eq this-command 'icicle-complete-keys)
+                     (icicle-some icicle-complete-keys-ignored-prefix-keys
+                                  this-prefix
+                                  #'icicle-same-vector-keyseq-p)))
+        (setq this-prefix []))
+      this-prefix))
 
   (defun icicle-same-vector-keyseq-p (key1 key2)
     "Return non-nil if KEY1 and KEY2 represent the same key sequence.
 Each is a vector."
-    (equal (apply #'vector (mapcar #'icicle-unlist key1))
-           (apply #'vector (mapcar #'icicle-unlist key2))))
+    ;; 1. Roundtrip through `key-description' and `kbd' so that [ESC ...] and [27 ...] are treated the same.
+    ;; 2. Use `icicle-read-kbd-macro' instead of just `kbd', because Emacs 20 `read-kbd-macro' chokes the
+    ;;    Emacs 20 byte-compiler.
+    (let ((desc1  (key-description (apply #'vector (mapcar #'icicle-unlist key1))))
+          (desc2  (key-description (apply #'vector (mapcar #'icicle-unlist key2)))))
+      (equal (icicle-read-kbd-macro desc1 nil t) (icicle-read-kbd-macro desc2 nil t))))
 
   ;; Free vars here: `icicle-complete-keys-alist' is bound in `icicles-var.el'.
   ;;
@@ -8252,7 +8653,6 @@ Each is a vector."
           (put (car cand) 'icicle-special-candidate nil))))) ; Reset the property.
 
   ;; Free vars here:
-  ;; `icicle-orig-buff', `icicle-orig-window', bound in `icicle-complete-keys'.
   ;; `icicle-orig-extra-cands', `icicle-this-cmd-keys', `icicle-key-prefix',
   ;; bound in `icicle-complete-keys-1'.
   (defun icicle-complete-keys-action (candidate)
@@ -8264,8 +8664,8 @@ Each is a vector."
            (action-window  (selected-window)))
       (unwind-protect
            (progn
-             (set-buffer icicle-orig-buff)
-             (select-window icicle-orig-window)
+             ;; $$$$$$$$ (set-buffer icicle-orig-buff)       ; These are not bound.
+             ;; $$$$$$$$ (select-window icicle-orig-window)
              (if (string= ".." candidate)
                  (setq cmd-name  "..")
                (unless (and (string-match "\\(.+\\)  =  \\(.+\\)" candidate)  (match-beginning 2))
index 8b5e651..4c692a2 100644 (file)
@@ -4,16 +4,16 @@
 ;; Description: Minibuffer completion and cycling.
 ;; 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: Tue Aug  1 14:21:16 1995
-;; Last-Updated: Tue Apr 29 08:56:33 2014 (-0700)
+;; Last-Updated: Sun Jan  4 15:10:07 2015 (-0800)
 ;;           By: dradams
-;;     Update #: 28193
+;;     Update #: 28346
 ;; URL: http://www.emacswiki.org/icicles-doc1.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:
 ;;
 ;;    (@file :file-name "icicles-doc2.el" :to "Setting a Bookmark and Jumping to a Bookmark")
 ;;    (@file :file-name "icicles-doc2.el" :to "Jumping to a Bookmark")
 ;;    (@file :file-name "icicles-doc2.el" :to "Searching Bookmarked Objects")
+;;    (@file :file-name "icicles-doc2.el" :to "Bookmarking Icicles Search Hits")
 ;;    (@file :file-name "icicles-doc2.el" :to "Acting on Bookmark Properties")
 ;;  (@file :file-name "icicles-doc2.el" :to "Icicles Enhancements for Emacs Tags")
 ;;    (@file :file-name "icicles-doc2.el" :to "`icicle-find-tag': Find Tags in All Tags Tables")
 ;;
 ;;  (@file :file-name "icicles-doc2.el" :to "Icicles Info Enhancements")
 ;;    (@file :file-name "icicles-doc2.el" :to "Icicles Completion for Info")
-;;      (@file :file-name "icicles-doc2.el" :to "Virtual Info Books")
-;;
+;;    (@file :file-name "icicles-doc2.el" :to "Highlighting Index Topics for Visited Info Nodes")
+;;    (@file :file-name "icicles-doc2.el" :to "Virtual Info Books")
+;;    (@file :file-name "icicles-doc2.el" :to "Finding Nodes Containing Some Text")
 ;;    (@file :file-name "icicles-doc2.el" :to "Using Icicle-Search With Info")
 ;;
 ;;  (@file :file-name "icicles-doc2.el" :to "Support for Projects")
 ;;    (@file :file-name "icicles-doc2.el" :to "Jaro-Winkler Completion")
 ;;
 ;;  (@file :file-name "icicles-doc2.el" :to "Completion in Other Buffers")
-;;    (@file :file-name "icicles-doc2.el" :to "Dynamic Abbreviation")
-;;    (@file :file-name "icicles-doc2.el" :to "BBDB Completion")
+;;    (@file :file-name "icicles-doc2.el" :to "Dynamic Completion Using `dabbrev.el'")
+;;    (@file :file-name "icicles-doc2.el" :to "Dynamic Completion Using `completion.el'")
 ;;    (@file :file-name "icicles-doc2.el" :to "Thesaurus Lookup and Completion")
+;;    (@file :file-name "icicles-doc2.el" :to "BBDB Completion")
 ;;    (@file :file-name "icicles-doc2.el" :to "Completion in Comint Modes")
 ;;
 ;;  (@file :file-name "icicles-doc2.el" :to "Customization and General Tips")
 ;;  You need not make a final choice once and for all between
 ;;  `alternatives' and `more-of-the-same'.  You can also make an
 ;;  interactive choice by using a prefix argument (`C-u') at any time
-;;  to override the value of `icicle-default-thing-insertion'.  If you
-;;  use plain `C-u', then `M-.' inserts alternative strings.  If you
-;;  use a numeric prefix argument N (not just plain `C-u'), then it is
-;;  the same as using `M-.' N times with `more-of-the-same' as the
-;;  value of `icicle-default-thing-insertion'.
-;;
-;;  And, if the numeric argument is negative, then text is grabbed to
-;;  the left of the cursor, instead of to the right.  In the example
-;;  above, if you used `M-- M-. M-. M-.', then the successive
+;;  to override the value of `icicle-default-thing-insertion'.
+;;
+;;  If you use plain `C-u', then `M-.' flips the behavior specified by
+;;  `icicle-default-thing-insertion'.
+;;
+;;  If you use a numeric prefix argument N (not just plain `C-u'),
+;;  then:
+;;
+;;  * If `M-.' would normally grab the next thing of the same type,
+;;    then N such things are grabbed in succession.  If N is negative
+;;    then the things are grabbed successively from the left, not the
+;;    right.
+;;
+;;  * If `M-.' would normally grab an alternative thing of a different
+;;    type, then numeric N tells Icicles to grab the particular thing
+;;    at point and then evaluate it as a Lisp sexp and insert the
+;;    result of that evaluation in the minibuffer.
+;;
+;;  So for example, returning to the example above, with the cursor is
+;;  at the beginning of the word "use" in the first paragraph of this
+;;  section, if you used `M-- M-. M-. M-.', then the successive
 ;;  insertions would be as follows:
 ;;
 ;;  differently
 ;;  differently if you
 ;;  ...
 ;;
-;;  If you used `M--3 M-.', then you would immediately insert
-;;  `differently if you'.
+;;  And if you instead used `M--3 M-.', then you would immediately
+;;  insert `differently if you'.
+;;
+;;  The use of a numeric prefix arg to evaluate a Lisp sexp does
+;;  require that you know when the particular thing-grabbing function
+;;  that you want is coming up next.  So if, for example, you want to
+;;  evaluate the active region and insert the resulting value, then
+;;  you use `M-. C-9 M-.', since (by default) it is the second `M-.'
+;;  that grabs the region text.
+;;
+;;  There are thus lots of possibilities when you use `M-.'
+;;  repeatedly.  You need not bother with them until you need them.
+;;  You can build up to using them all gradually.
 ;;
 ;;(@* "Resolve File Names")
 ;;  ** Resolve File Names **
 ;;  the same thing.  You can thus use only `S-SPC', any number of
 ;;  times, to choose a candidate by narrowing down the matches.
 ;;
+;;  With a prefix argument, `S-SPC' uses predicate narrowing, that is,
+;;  `C-u S-SPC' is the same as `S-TAB' followed by `M-&' (described in
+;;  the next section) .
+;;
 ;;  I call this process of completion by successive approximation, or
 ;;  progressively narrowing the candidate set, "progressive
 ;;  completion".  If the name "incremental completion" (= icompletion)
 ;;  Progressive completion is a set of mini-completions that are wired
 ;;  in series, not in parallel.
 ;;
-;;  Note that when you use `M-*' or `S-SPC' in the minibuffer, it
-;;  calls `completing-read' or `read-file-name', which creates a
-;;  recursive minibuffer.  That is, the minibuffer depth is increased.
-;;  (This is not the case for `M-&', however.)  In vanilla Emacs,
-;;  there is no indicator of the current minibuffer depth, and this
-;;  can sometimes be disorienting.  Each time you use `M-*' or `S-SPC'
-;;  you push down one level of minibuffer recursion (that is,
-;;  minibuffer depth is incremented).  Each time you use, say, `C-g',
-;;  you pop up one level of minibuffer recursion (that is, minibuffer
-;;  depth is decremented).
+;;  Note that when you use candidate narrowing (`M-*', `M-&', or
+;;  `S-SPC') in the minibuffer, `completing-read' or `read-file-name'
+;;  is invoked, which creates a recursive minibuffer.  That is, the
+;;  minibuffer depth is increased.
+;;
+;;  In vanilla Emacs, there is no indicator of the current minibuffer
+;;  depth, and this can sometimes be disorienting.  Each time you
+;;  narrow the set of current candidates, you push down one level of
+;;  minibuffer recursion (that is, minibuffer depth is incremented).
+;;  Each time you use, say, `C-g', you pop up one level of minibuffer
+;;  recursion (that is, minibuffer depth is decremented).
 ;;
 ;;  If you use library `mb-depth.el', which is included with Emacs 23
 ;;  and which also works with Emacs 22, Icicle mode takes advantage of
 ;;  standalone minibuffer frame, and it changes the background hue
 ;;  (color) of that frame slightly with each change in minibuffer
 ;;  depth.  This is especially helpful with Icicles, where use of
-;;  `M-*' or `S-SPC' is common.
+;;  candidate narrowing (progressive completion) is common.
 ;;
 ;;  There is a slight difference in behavior between Icicles commands
-;;  and some other Emacs commands when you accept input after `M-*' or
-;;  `S-SPC'.  When possible, Icicles accepts your input and passes it
-;;  immediately to the top level, bypassing any intermediate recursive
-;;  minibuffer levels that are waiting for input.  However, Emacs
-;;  commands that are defined with literal-string `interactive' specs,
-;;  such as (interactive "fFile: "), do not use `completing-read' or
-;;  `read-file-name', so there is no way for Icicles to take this
-;;  shortcut with them.  In that case, you will simply need to hit
-;;  `RET' again to accept your input at each recursive minibuffer
-;;  level, until you get back to the top level.  Sorry for this
-;;  inconvenience!  If you are an Emacs-Lisp programmer, note that
-;;  this is one reason to use `completing-read' and `read-file-name'
-;;  when you write commands that use completion.
+;;  and some other Emacs commands when you accept input after
+;;  narrowing.  When possible, Icicles accepts your input and passes
+;;  it immediately to the top level, bypassing any intermediate
+;;  recursive minibuffer levels that are waiting for input.  However,
+;;  Emacs commands that are defined with literal-string `interactive'
+;;  specs, such as (interactive "fFile: "), do not use
+;;  `completing-read' or `read-file-name', so there is no way for
+;;  Icicles to take this shortcut with them.  In that case, you will
+;;  simply need to hit `RET' again to accept your input at each
+;;  recursive minibuffer level, until you get back to the top level.
+;;  Sorry for this inconvenience!  If you are an Emacs-Lisp
+;;  programmer, note that this is one reason to use `completing-read'
+;;  and `read-file-name' when you write commands that use completion.
 ;;
 ;;  Note: If you use progressive completion with file names in Emacs
-;;  20 or 21, `M-*' or `S-SPC' calls `completing-read', not
+;;  20 or 21 then candidate narrowing invokes `completing-read', not
 ;;  `read-file-name'.  This is because `read-file-name' does not
 ;;  accept a PREDICATE argument before Emacs 22.  The effect is that
 ;;  instead of there being a default directory for completion, the
-;;  current directory at the time you hit `M-*' or `S-SPC' is tacked
-;;  onto each file name, to become part of the completion candidates
-;;  themselves.  Yes, this is a hack.  It works, but be aware of the
-;;  behavior.
+;;  current directory at the time you narrow is tacked onto each file
+;;  name, to become part of the completion candidates themselves.
+;;  Yes, this is a hack.  It works, but be aware of the behavior.
 ;;
 ;;  Progressive completion lets you match multiple regexps, some of
 ;;  which could of course be literal substrings, with their regexp
 ;;(@* "`M-&': Satisfying Additional Predicates")
 ;;  ** `M-&': Satisfying Additional Predicates **
 ;;
-;;  If you use Icicles, then you will use `M-*' or `S-SPC' very often.
-;;  This section describes a seldom-used feature that can be useful in
-;;  certain contexts.  If you are new to Icicles or you are unfamiliar
-;;  with Emacs Lisp, then you might want to just skim this section or
-;;  skip it and come back to it later.
+;;  If you use Icicles, then you will use candidate narrowing
+;;  (progressive completion) very often.  This section describes `M-&'
+;;  (`icicle-narrow-candidates-with-predicate'), which is like `M-*'
+;;  (`icicle-narrow-candidates') except that it also restricts
+;;  candidates by using a predicate for filtering.
+;;
+;;  (If you are new to Icicles or you are unfamiliar with Emacs Lisp,
+;;  then you might want to just skim this section for now or skip it
+;;  and come back to it later.)
 ;;
 ;;  Just as you can use `M-*' or `S-SPC' to narrow the set of
 ;;  candidates by matching an additional regexp, so you can use `M-&'
-;;  (bound to `icicle-narrow-candidates-with-predicate') to narrow by
-;;  satisfying an additional predicate.  The idea is the same; the
-;;  only difference is that, instead of typing a regexp to match, you
-;;  type a predicate to satisfy.
-;;
-;;  The predicate is a Boolean function of a single completion
-;;  candidate.  At the prompt, you enter its name or its
-;;  lambda-expression definition (anonymous function).  The predicate
-;;  is used the same way as the PREDICATE argument to
-;;  `completing-read' and `read-file-name'.  This means that the
-;;  candidate argument to the predicate is whatever is used in the
-;;  original call to `completing-read' or `read-file-name'; it is not
-;;  just a string such as you see in buffer `*Completions*'.  To
-;;  provide an appropriate predicate, you must be familiar with the
-;;  kind of candidate expected by the command you invoked before just
-;;  before `M-&'.
+;;  or `C-u S-SPC' to narrow by satisfying an additional predicate.  The
+;;  idea is the same; the only difference is that you are prompted for
+;;  a predicate for the current candidates to satisfy.
+;;
+;;  This must be a Boolean function of a single completion candidate.
+;;  At the prompt, you enter its name or its lambda-expression
+;;  definition (anonymous function).
+;;
+;;  Completion is available for some existing predicate names
+;;  appropriate for the current command.  For example, if you use `C-x
+;;  4 f TAB M-&' then you can complete against the file-name
+;;  predicates named in option `icicle-cand-preds-for-file'.  This
+;;  lets you quickly filter by file type: directories, executables,
+;;  compressed files, remote files, desktop files, and so on.
+;;
+;;  If you use a prefix arg with `M-&' then additional predicate
+;;  completion candidates are available (they might or might not be
+;;  appropriate for the current command).
+;;
+;;  The predicate you choose is used the same way as the PREDICATE
+;;  argument to `completing-read' and `read-file-name'.  This means
+;;  that the candidate argument to the predicate is a full completion
+;;  candidate; it is not just a string such as you see in buffer
+;;  `*Completions*'.
+;;
+;;  The type of full completion candidate expected by the predicate
+;;  is, to start with, whatever is used in the original call to
+;;  `completing-read' or `read-file-name'.  To provide an appropriate
+;;  predicate, you must be familiar with the kind of candidate
+;;  expected by the command you invoked before just before `M-&'.
 ;;
 ;;  For example:
 ;;
 ;;    the CONTEXT.  An appropriate predicate would accept such a
 ;;    candidate as argument.
 ;;
-;;  Although entering a lambda expression at a prompt might not seem
-;;  too convenient, you can at least retrieve previously entered
-;;  predicates (using `M-p' and so on).
+;;  The type of candidate expected by the current command might be a
+;;  symbol, a string, or a cons with a string car.  It might even be
+;;  an Icicles multi-completion, which in its full form is a cons with
+;;  a list of strings as its car.
+;;
+;;  Knowing what kind of completions the original `completing-read' or
+;;  `read-file-name' call expects is not sufficient, however.  You
+;;  might use `M-&' after otherwise narrowing the set of candidates,
+;;  and narrowing changes the full candidates to be conses whose car
+;;  is a string.
+;;
+;;  For example, command `describe-variable' reads a variable name,
+;;  using completion with Lisp symbols as its full candidates.  But if
+;;  you narrow your input matches (e.g. using `S-SPC'), then the full
+;;  candidates are no longer symbols; they are conses with symbol
+;;  names (strings) as their cars.
+;;
+;;  So if you define your own predicate for use with a command such as
+;;  `describe-variable' then it will need to work with either a symbol
+;;  or a cons that has a symbol-name (string) as its car.
+;;
+;;  If you want to adapt an existing predicate that expects a
+;;  `*Completions*' display candidate (a string) then you can use
+;;  function `icicle-display-cand-from-full-cand' in your predicate
+;;  definition.  If multi-completion is involved then you can use
+;;  function `icicle-transform-multi-completion'.
+;;
+;;  In sum: if you want to adapt an existing predicate that expects an
+;;  argument that is not a cons with a string car, then convert the
+;;  car to what you need.  See the definition of function
+;;  `icicle-custom-variable-p' for an example.
+;;
+;;  User option `icicle-cand-preds-all' defines the predefined
+;;  candidate-filtering predicates, and these are grouped in user
+;;  options named `icicle-cand-preds-for-TYPE', where TYPE is the name
+;;  of a completion type (`bookmark', `buffer', `color', `face',
+;;  `file', `package', `variable', `window',...).  You can add a named
+;;  predicate to one of these options.
+;;
+;;  (Note: Some commands provide minibuffer key bindings that also
+;;  narrow the set of candidates.  For example, during bookmark-name
+;;  completion, there are keys to narrow to different types of
+;;  bookmark.
+;;  See (@file :file-name "icicles-doc2.el" :to "Minibuffer Bindings").)
+;;
+;;  For example, you can customize option
+;;  `icicle-cand-preds-for-buffer', to add a buffer-name predicate
+;;  that you can then enter using completion.  (You will also want to
+;;  add it to option `icicle-cand-preds-all'.)
+;;
+;;  One of the completion-type options is
+;;  `icicle-cand-preds-for-misc'.  This is a catch-all category of
+;;  predicates that apply generally, to pretty much all completion
+;;  types.  These predicates are included as candidates whenever you
+;;  use `M-&'.
+;;
+;;  An important predicate in this catch-all group is
+;;  `icicle-special-candidate-p' (and its opposite,
+;;  `icicle-not-special-candidate-p').  This filter keeps only
+;;  candidates that are (or are not) "special candidates".  These are
+;;  candidates that are highlighted in `*Completions*' using face
+;;  `icicle-special-candidate' (actually, other faces can also be
+;;  used, in which case the doc of the particular command explains
+;;  this).
+;;
+;;  For example, command `icicle-apropos' shows function names as
+;;  special candidates, to help you distinguish them from variable
+;;  names.  And Icicles key completion distiguishes local key bindings
+;;  by showing them as special candidates.  And during file-name
+;;  completion directory names are shown as special candidates.
+;;
+;;  Typing a lambda expression to define a predicate on the fly is
+;;  handy and flexible, but it is of course much less convenient than
+;;  choosing a predefined predicate by name.  (Remember though, that
+;;  you can retrieve previously entered predicates, using `M-p' and so
+;;  on.)
 ;;
 ;;  You can also use `C-M-&' (bound to
 ;;  `icicle-save-predicate-to-variable') at any time during completion
 ;;  definitions, and any other text entities that you can specify by
 ;;  regexp.  Create a library of regexp-valued variables that are
 ;;  useful to you, and use `C-=' to quickly access them in
-;;  `icicle-search'.  See
-;;  (@file :file-name "icicles-doc2.el" :to "Icicles Search Commands, Overview")
+;;  `icicle-search'.
+;;  See (@file :file-name "icicles-doc2.el" :to "Icicles Search Commands, Overview")
 ;;  for more information.
 ;;
 ;;  These shortcuts are also handy for Isearch, in particular, regexp
 ;;  `icicle-buffers-ido-like-flag' and `icicle-files-ido-like-flag' to
 ;;  non-`nil'.
 ;;
+;;(@* "IswitchB-Like Behavior for `icicle-buffer'")
+;;  ** IswitchB-Like Behavior for `icicle-buffer' **
+;;
+;;  As mentioned, you can use IswitchB with Icicles.  GNU Emacs
+;;  deprecated IswitchB starting with Emacs 24.4, but it is still
+;;  available.
+;;
+;;  If you want to get IswitchB-like behavior with Icicles without
+;;  using IswitchB then you can advise `icicle-buffer'.
+;;
+;;  There are at least two ways to do this, depending on what behavior
+;;  you want.  Let's assume that in any case (a) you want incremental
+;;  completion from the outset (no need to hit `TAB' or `S-TAB', and
+;;  (b) you want to Emacs to accept as your choice the sole candidate
+;;  as soon as you narrow matching to a single candidate.  For (a),
+;;  you bind `icicle-incremental-completion' to `always'.  For (b),
+;;  you bind `icicle-top-level-when-sole-completion-flag' to `t'.
+;;
+;;  1. In the first case, prefix completion is the default (as usual),
+;;     but `icicle-buffer' uses vanilla Emacs completion as the
+;;     Icicles `TAB' completion method.  This reflects IswitchB's
+;;     substring matching.  To do this, you bind
+;;     `icicle-current-TAB-method' to `vanilla'.
+;;
+;;  2. In the second case, `icicle-buffer' starts out with apropos
+;;     completion, not prefix completion.  This too reflects
+;;     IswitchB's substring matching, but it extends it to regexp
+;;     completion.  To do this, you bind `icicle-default-cycling-mode'
+;;     to `apropos'.
+;;
+;;  ;; 1. Use vanilla Emacs matching for prefix completion by default.
+;;  (defadvice icicle-buffer (around iswitchb-like-1 activate)
+;;    (interactive)
+;;    (let* ((icicle-current-TAB-method                   'vanilla)
+;;           (icicle-incremental-completion               'always)
+;;           (icicle-top-level-when-sole-completion-flag  't))
+;;      ad-do-it))
+;;  (ad-activate 'icicle-buffer)
+;;
+;;  ;; 2. Start with apropos completion by default.
+;;  (defadvice icicle-buffer (around iswitchb-like-2 activate)
+;;    (interactive)
+;;    (let* ((icicle-default-cycling-mode  'apropos)
+;;          (icicle-incremental-completion  'always)
+;;          (icicle-top-level-when-sole-completion-flag 't))
+;;      ad-do-it))
+;;  (ad-activate 'icicle-buffer)
+;;
+;;
 ;;  See Also:
 ;;
 ;;  * (@> "Exiting the Minibuffer Without Confirmation")
 ;;       You can choose such a proxy candidate to use its value.  (All
 ;;       candidates are proxy candidates for these functions.)
 ;;
-;;     . When you use command `icicle-read-color-wysiwyg', the proxy
+;;     . When you use command `icicle-read-color-WYSIWYG', the proxy
 ;;       candidates include the following:
 ;;
 ;;       - `*point foreground*' - proxy for the foreground color at
 ;;  weight.  Eventually a fixed point is reached: `C-M-+' produces no
 ;;  further change in the order.
 ;;
-;;  For example, consider `icicle-read-color-wysiwyg'.  With user
+;;  For example, consider `icicle-read-color-WYSIWYG'.  With user
 ;;  option `icicle-WYSIWYG-Completions-flag' non-`nil' (e.g. a string)
 ;;  it lets you see the effect of `C-M-+' in a striking, graphical
 ;;  way.  However, to see the effect you will first want to use
 ;;  brightest colors followed by dimmer and dimmer colors, down to the
 ;;  dimmest (black).
 ;;
-;;  Try `M-x icicle-read-color-wysiwyg', sorting (`C-,', possibly with
+;;  Try `M-x icicle-read-color-WYSIWYG', sorting (`C-,', possibly with
 ;;  a prefix arg) first by hue.  Save the completion candidates
 ;;  (`C-M->').  Now sort by brightness (`C-,' again, possibly with a
 ;;  prefix arg).  Now use `C-M-+' to add/merge the two sort orders.
 ;;  Icicles file-name commands that use multi-completion include
 ;;  `icicle-locate-file', `icicle-locate-file-other-window',
 ;;  `icicle-recent-file', and `icicle-recent-file-other-window'.
-;;  These commands let you match against two-part multi-completion
-;;  candidates that are composed of an absolute file name and the
-;;  file's last modification date.  This means that you can easily
-;;  find those notes you took sometime last week...
+;;  These commands let you match against multi-completion candidates
+;;  that have an absolute file name part and a part that is the file's
+;;  last modification date.  This means that you can easily find those
+;;  notes you took sometime last week...
 ;;
 ;;  The way multi-completion commands work is a bit inelegant perhaps,
 ;;  and it can take a little getting used to, but it is quite powerful
 ;;  * `icicle-find-file-read-only' (`C-x C-r') - Visit read-only
 ;;  * `icicle-find-first-tag' (`C-x 4 .') - Trip among tag hits
 ;;  * `icicle-find-tag' (`M-.')        - Trip among tag hits
+;;  * `icicle-goto-any-marker' (`C-0 C-SPC') - Trip among all markers
 ;;  * `icicle-goto-global-marker' (`C-- C-x C-SPC') - Trip among
 ;;                                       global markers
 ;;  * `icicle-goto-marker' (`C-- C-SPC') - Trip among local markers
 ;;                                       single-line hits)
 ;;  * `icicle-occur-dired-marked-recursive' - Search marked in Dired
 ;;  * `icicle-recent-file'             - Trip among recent files
+;;
 ;;  * `icicle-search' (`C-c `')        - Trip among regexp search hits
 ;;  * `icicle-search-bookmarks-together' (`C-u C-c `'),
 ;;    `icicle-search-bookmark',        - Search multiple bookmarks
 ;;  * `icicle-search-keywords' (`C-c ^') - Trip among keyword search
 ;;                                       hits.
 ;;  * `icicle-search-overlay-property' - Trip among buffer strings
-;;    with some overlay property.
+;;                                       with some overlay property.
 ;;  * `icicle-search-pages'            - Search Emacs pages
 ;;  * `icicle-search-paragraphs'       - Search Emacs paragraphs
 ;;  * `icicle-search-sentences'        - Search sentences as contexts
 ;;  * `icicle-select-frame' (`C-x 5 o') - Trip among frames, by name
 ;;  * `icicle-select-window' (`C-0 C-x o') - Trip among windows, by
 ;;                                       buffer name
+;;  * `icicle-wide-n'                  - Trip among narrowings
+;;                                       (buffer restrictions)
 ;;
 ;;  (You need library library `Bookmark+' for
 ;;  `icicle-search-bookmark-list-marked'.  You need library `Dired+'
 ;;  for `icicle-occur-dired-marked-recursive' and
-;;  `icicle-search-dired-marked-recursive'.)
+;;  `icicle-search-dired-marked-recursive'.  You need library
+;;  `wide-n.el' for `icicle-wide-n'.)
+;;
+;;  Note: Icicles search commands and commands `icicle-find-tag',
+;;  `icicle-goto-marker', `icicle-goto-any-marker', and
+;;  `icicle-goto-global-marker' effectively bind user option
+;;  `icicle-incremental-completion' to `always', because I think you
+;;  typically want to start them out with incremental completion
+;;  turned on.  Remember that you can use `C-#' (once or twice) to
+;;  turn incremental completion off.
 ;;
 ;;(@* "Highlighting the Destination")
 ;;  ** Highlighting the Destination **
 ;;  my library `ucs-cmds.el' then you might want to remap that command
 ;;  to command `ucsc-insert', which is an enhancement.
 ;;
-;;  Icicles enhances this by showing in `*Completions*', for each
-;;  candidate Unicode character, its name and code point, as well as
-;;  the character itself.
+;;  If option `icicle-read-char-by-name-multi-completion-flag' is
+;;  non-`nil' then Icicles enhances this in a few ways:
 ;;
-;;  Also, when you cycle among the matching candidates, the name and
-;;  code point of the current candidate are shown in the mode line.
-;;  The code point is shown in hexadecimal, octal, and decimal
-;;  notations.
+;;  * It shows in `*Completions*', for each candidate Unicode
+;;    character, its name and code point, as well as the character
+;;    itself.
 ;;
-;;  Completion candidates are in fact multi-completions, meaning that
-;;  you can match against the name or the code point, or both.
+;;  * When you cycle among the matching candidates, the name and code
+;;    point of the current candidate are shown in the mode line.  The
+;;    code point is shown in hexadecimal, octal, and decimal
+;;    notations.
 ;;
-;;  You can even match the character itself.  Why might you want to do
-;;  that?  To see the corresponding Unicode character name(s),
-;;  including any old names.  For example, for the character ` (grave
-;;  accent) you get these two completion candidates:
+;;  * Completion candidates are in fact multi-completions, meaning
+;;    that you can match against the name or the code point, or both.
 ;;
-;;    GRAVE ACCENT      60      `
-;;    SPACING GRAVE     60      `
+;;  * You can even match the character itself.  Why might you want to
+;;    do that?  To see the corresponding Unicode character name(s),
+;;    including any old names.  For example, for the character `
+;;    (grave accent) you get these two completion candidates:
+;;
+;;      GRAVE ACCENT      60      `
+;;      SPACING GRAVE     60      `
 ;;
 ;;  The main purpose for this is to show you the characters and code
 ;;  points together with their names (WYSIWYG).  The characters are
 ;;  adds to it.  See (@> "Persistent Sets of Completion Candidates")
 ;;  for ways to save candidates persistently.
 ;;
+;;  In addition to persistently saving a candidate set in a file, if
+;;  you also use library `Bookmark+' then you can save a set of
+;;  Icicles search candidates as a bookmark.  You "jump" to the
+;;  bookmark to restore those search results during another Icicles
+;;  search.
+;;
 ;;  One way you can save candidates is to use
 ;;  `icicle-candidate-set-save', bound to `C-M->'.  This saves all of
 ;;  the current candidates.
 ;;    A prefix arg sets the option value to the numeric prefix value.
 ;;
 ;;  * `C-x R' (`icicle-toggle-include-recent-files') Toggle whether
-;;    `icicle-buffer' includes recent file names as candidates.  That
-;;    is, toggle option `icicle-buffer-include-recent-files-nflag'.
-;;    A prefix arg sets the option value to the numeric prefix value.
+;;    `icicle-buffer' includes the names of recently accessed files as
+;;    candidates.  That is, toggle option
+;;    `icicle-buffer-include-recent-files-nflag'.  A prefix arg sets
+;;    the option value to the numeric prefix value.
 ;;
 ;;  * `C-x m' (`icicle-bookmark-non-file-other-window') to visit a
 ;;    bookmarked buffer.  This is available only if you use library
 ;;  You can save the current set of completions (whatever it is)
 ;;  persistently by supplying a plain prefix argument (`C-u') when you
 ;;  use `C-M->' (`icicle-candidate-set-save') during completion.
+;;
 ;;  Alternatively, you can use `C-}', bound to
 ;;  `icicle-candidate-set-save-persistently', which does the same
 ;;  thing.  To retrieve completion candidates that were previously
 ;;  completion-candidates set using a variable that you name, not a
 ;;  cache file.  See (@> "Sets of Completion Candidates").
 ;;
+;;  In addition to persistently saving a candidate set in a file,
+;;  which is described in this section, if you also use library
+;;  `Bookmark+' then you can alternatively save a set of Icicles
+;;  search candidates as a bookmark.  You "jump" to the bookmark to
+;;  restore those search results during another Icicles search.
+;;
 ;;(@* "Saving Candidates in Cache Files")
 ;;  ** Saving Candidates in Cache Files **
 ;;
index 814bcf6..8a5a027 100644 (file)
@@ -4,16 +4,16 @@
 ;; Description: Minibuffer completion and cycling.
 ;; 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: Tue Aug  1 14:21:16 1995
-;; Last-Updated: Tue Apr 29 08:59:02 2014 (-0700)
+;; Last-Updated: Sun Jan  4 15:22:41 2015 (-0800)
 ;;           By: dradams
-;;     Update #: 29509
+;;     Update #: 29739
 ;; URL: http://www.emacswiki.org/icicles-doc2.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:
 ;;
 ;;  Files `icicles-doc1.el' and `icicles-doc2.el' contain the doc for
 ;;  Icicles, including how to install and use Icicles.  You can also
 ;;  read the Icicles doc, in formatted form, on the Emacs-Wiki Web
-;;  site: http://www.emacswiki.org/cgi-bin/wiki/Icicles.  Emacs Wiki
-;;  also has a few addtional pages about Icicles.  In particular, if
-;;  you are new to Emacs, as well as Icicles, see this page:
-;;  http://www.emacswiki.org/cgi-bin/wiki/EmacsNewbieWithIcicles.
+;;  site: http://www.emacswiki.org/Icicles.  Emacs Wiki also has a few
+;;  addtional pages about Icicles.  In particular, if you are new to
+;;  Emacs, as well as Icicles, see this page:
+;;  http://www.emacswiki.org/EmacsNewbieWithIcicles.
 ;;
 ;;  This file continues the Icicles documentation, which starts in
 ;;  file `icicles-doc1.el'.
@@ -47,7 +47,7 @@
 ;;  highlight this Index and render it more readable.  Likewise, for
 ;;  the cross-references and section headings throughout this file.
 ;;  You can get `linkd.el' here:
-;;  http://www.emacswiki.org/cgi-bin/wiki/linkd.el.
+;;  http://www.emacswiki.org/linkd.el.
 ;;
 ;;  (@file :file-name "icicles-doc1.el" :to "Documentation in File `icicles-doc1.el'")
 ;;  -----------------------------------------------------------
 ;;    (@> "Setting a Bookmark and Jumping to a Bookmark")
 ;;    (@> "Jumping to a Bookmark")
 ;;    (@> "Searching Bookmarked Objects")
+;;    (@> "Bookmarking Icicles Search Hits")
 ;;    (@> "Acting on Bookmark Properties")
 ;;
 ;;  (@> "Icicles Enhancements for Emacs Tags")
 ;;
 ;;  (@> "Icicles Info Enhancements")
 ;;    (@> "Icicles Completion for Info")
-;;      (@> "Virtual Info Books")
-;;      (@> "Using Icicle-Search With Info")
-;;
+;;    (@> "Highlighting Index Topics for Visited Info Nodes")
+;;    (@> "Virtual Info Books")
+;;    (@> "Finding Nodes Containing Some Text")
 ;;    (@> "Using Icicle-Search With Info")
 ;;
 ;;  (@> "Support for Projects")
 ;;    (@> "Jaro-Winkler Completion")
 ;;
 ;;  (@> "Completion in Other Buffers")
-;;    (@> "Dynamic Abbreviation")
-;;    (@> "BBDB Completion")
+;;    (@> "Dynamic Completion Using `dabbrev.el'")
+;;    (@> "Dynamic Completion Using `completion.el'")
 ;;    (@> "Thesaurus Lookup and Completion")
+;;    (@> "BBDB Completion")
 ;;    (@> "Completion in Comint Modes")
 ;;
 ;;  (@> "Customization and General Tips")
 ;;     match) with more semantic search criteria.  After building up a
 ;;     complex predicate by using `M-&', you can save it to a variable
 ;;     with `C-M-&' and then reuse it later with `C-='.
-;;     See also (@file :file-name "icicles-doc1.el" :to "Progressive Completion").
+;;     See also (@file :file-name "icicles-doc1.el" :to "`M-&': Satisfying Additional Predicates").
 ;;
 ;;  5. Icicles finds all of the qualified search contexts, and
 ;;     presents them to you as completion candidates.  As always for
 ;;  you do not need to read/scan the whole list.
 ;;
 ;;  If you look at the definition of `icicle-imenu' you'll see that it
-;;  simply lets you choose an Imenu submenu (`Functions', `User
-;;  Options', and so on) that is appropriate for the current buffer
-;;  type, and then it calls `icicle-search', passing it the
-;;  appropriate Imenu regexp.  You can similarly define your own
-;;  specialized search commands using `icicle-search' to browse regexp
-;;  matches.  You get all of the features of `icicle-search' when you
-;;  do that.  For example, `icicle-imenu' gives you these advantages
-;;  over a standard Imenu menu:
+;;  simply lets you choose an Imenu submenu (`Functions', `Options',
+;;  and so on) that is appropriate for the current buffer type, and
+;;  then it calls `icicle-search', passing it the appropriate Imenu
+;;  regexp.  You can similarly define your own specialized search
+;;  commands using `icicle-search' to browse regexp matches.  You get
+;;  all of the features of `icicle-search' when you do that.  For
+;;  example, `icicle-imenu' gives you these advantages over a standard
+;;  Imenu menu:
 ;;
 ;;  * You can restrict navigation (search) to a region.
 ;;
 ;;  * As for `icicle-search', you can search multiple bookmarks,
 ;;    multiple buffers, or multiple files.
 ;;
+;;  When you use an Icicles Imenu command, first you choose a submenu
+;;  for a given object type (e.g. submenu `Functions' for functions),
+;;  and then you choose an object definition from that submenu.  But
+;;  multiple regexps can be used for a given Imenu submenu, such as
+;;  `Function'.  Icicles Imenu commands use these regexps separately,
+;;  so they present multiple completion candidates with the same name
+;;  when you choose the object type.
+;;
+;;  For example, if two different regexps are used to gather function
+;;  definitions then there might be two corresponding `Functions'
+;;  candidates (depending on whether there are matches for each of the
+;;  regexps).  Choosing one or the other of these submenu candidates
+;;  then gives you different function choices.  (Remember that you can
+;;  cycle to choose among multiple candidates that have the same
+;;  name.)
+;;
 ;;(@* "Type-Specific Imenu Commands")
 ;;  *** Type-Specific Imenu Commands ***
 ;;
 ;;  * Tagging files (a la delicious) and jumping to tagged files
 ;;  * Bookmarking the region and selecting a bookmarked region
 ;;  * Setting a bookmark and jumping to a bookmark
-;;  * Searching the text of a bookmark's buffer or region
+;;  * Searching the text of a bookmark's destination buffer or region
+;;  * Saving sets of Icicles search hits as bookmarks - "jump" to such
+;;    a bookmark to restore the saved hits during a later search.
 ;;  * Applying an arbitrary function to any bookmark property
 ;;
 ;;  Each is described in a little more detail below.  More generally,
 ;;
 ;;  * With a multiple plain prefix arg (`C-u C-u'), `C-x C-x' jumps to
 ;;    a region bookmark that you choose using completion, and
-;;    activates it.
+;;    activates it.  (See also Icicles tripping command
+;;    `icicle-wide-n', which lets you trip among your buffer
+;;    narrowings (restrictions).
 ;;
 ;;  * With a numeric prefix arg, `C-x C-x' saves the region.  If the
 ;;    prefix arg is negative, then you are prompted for the name to
 ;;    caching.  Caching is also used for bookmark searching.
 ;;  * (@> "Support for Projects")
 ;;
+;;(@* "Bookmarking Icicles Search Hits")
+;;  ** Bookmarking Icicles Search Hits **
+;;
+;;  When you use Icicles search (of any kind), you can use `C-x C-M->'
+;;  to save the current set of completion candidates (search hits) as
+;;  an Icicles search-hits bookmark.  "Jumping" to such a bookmark
+;;  during Icicles search (of anything) restores those search hits:
+;;  `C-x C-M-<' replaces the current search hits with them, and `C-x
+;;  C-<' adds them to the set of current search hits.
+;;
 ;;(@* "Acting on Bookmark Properties")
 ;;  ** Acting on Bookmark Properties **
 ;;
 ;;
 ;;  Icicles can help with Dired in these ways:
 ;;
+;;  * Commands `dired' and `dired-other-window' are multi-commands.
+;;    If you use library `Dired+' (`dired+.el') then these commands
+;;    are particularly powerful.
+;
 ;;  * You can use Icicles search-and-replace on the marked files in
 ;;    the current directory and in marked subdirectories
 ;;    (recursively).
 ;;  * You can create virtual Info books composed of an arbitrary set
 ;;    of nodes from any set of manuals.
 ;;
+;;  * You can easily find nodes that contain text matching a
+;;    combination of patterns.
+;;
 ;;  * You can use `icicle-search' on part or all of a manual, if you
 ;;    flatten it first with `Info-merge-subnodes' .
 ;;
 ;;  `g' in Info not only to explore nodes by name, but also as another
 ;;  means to traverse the Info menu hierarchy.
 ;;
-;;  Starting with Emacs 22, command `icicle-Info-goto-node' lets you
-;;  type multi-completion input whose second part (after `C-M-j') is a
-;;  content-searching pattern (regexp).  This means you can search a
-;;  set of nodes (or an entire manual) and choose from the list of
-;;  matching nodes.  The `*Completions*' candidates you see are just
-;;  the node names.  After you choose one of the matching nodes to
-;;  visit, you can use `C-M-s' to find each match of the
-;;  content-search pattern.  See
-;;  (@file :file-name "icicles-doc1.el" :to "Chapter & Verse: Searching Named Containers").
-;;
 ;;(@* "Highlighting Index Topics for Visited Info Nodes")
-;;  *** Highlighting Index Topics for Visited Info Nodes ***
+;;  ** Highlighting Index Topics for Visited Info Nodes **
 ;;
 ;;  When you are looking for something in an Info manual, `i'
 ;;  (multi-command `icicle-Info-index') is your friend.  It is
 ;;  `icicle-historical-candidate').  (This feature is not available
 ;;  for Emacs 20 or 21.)
 ;;
-;;  But because it takes extra time to track down each of the current
-;;  topic candidates, this can be costly.  You can customize option
-;;  `icicle-Info-visited-max-candidates' to control the behavior.
-;;  This extra highlighting is skipped whenever there are more
-;;  candidates that the option value.  It is also skipped if you turn
-;;  off historical candidate highlighting altogether, by setting
-;;  option `icicle-highlight-historical-candidates-flag' to `nil'.
+;;  This highlighting can be automatic, or you can effect it on demand
+;;  using `C-x C-M-l'.  Because it takes extra time to track down each
+;;  of the current topic candidates, this highlighting can be costly.
+;;  You can customize option `icicle-Info-highlight-visited-nodes' to
+;;  allow and control automatic highlighting.  It is turned off
+;;  (`nil') by default.  Even when the option value is non-`nil',
+;;  automatic highlighting does not occur if you turn off historical
+;;  candidate highlighting altogether, by setting option
+;;  `icicle-highlight-historical-candidates-flag' to `nil'.
 ;;
 ;;(@* "Virtual Info Books")
 ;;  ** Virtual Info Books **
 ;;  `t', then this will not work at all.  Any other value presents no
 ;;  problem.  (Personally, I use `nil'.)]
 ;;
+;;(@* "Finding Nodes Containing Some Text")
+;;  ** Finding Nodes Containing Some Text **
+;;
+;;  In Icicle mode, `g' (command `icicle-Info-goto-node') lets you
+;;  type multi-completion input whose second part (after `C-M-j') is a
+;;  content-searching pattern (regexp).  This means you can search a
+;;  set of nodes, or an entire manual, and choose from the list of
+;;  matching nodes.  The `*Completions*' candidates you see are just
+;;  the node names.
+;;
+;;  As always during Icicles completion, you can combine any number of
+;;  search patterns (for both node name and content), using
+;;  progressive completion.
+;;
+;;  After you choose one of the matching nodes to visit, you can use
+;;  `C-M-s' to find each match of the content-search pattern.
+;;
+;;  See Also:
+;;
+;;  * (@file :file-name "icicles-doc1.el" :to "Chapter & Verse: Searching Named Containers")
+;;  for information about content-searching.
+;;  * (@> "Using Icicle-Search With Info")
+;;  * (@> "Icicles Completion for Info")
+;;
 ;;(@* "Using Icicle-Search With Info")
 ;;  ** Using Icicle-Search With Info **
 ;;
 ;;  with a negative prefix argument removes the advice, restoring the
 ;;  default choice of methods for the target command.
 ;;
-;;  For example, this sets the available `TAB' methods for command
-;;  `icicle-read-color-wysiwyg' to fuzzy (the default for this
-;;  command) and basic:
+;;  For example, the following interaction sets the available `TAB'
+;;  methods for command `icicle-read-color-WYSIWYG' to fuzzy and
+;;  basic:
 ;;
 ;;    M-x icicle-set-TAB-methods-for-command RET
-;;    Command: icicle-read-color-wysiwyg RET
+;;    Command: icicle-read-color-WYSIWYG RET
 ;;    TAB methods: fuzzy RET
 ;;    TAB methods: basic RET
 ;;    TAB methods: RET
+;;
+;;  Fuzzy will be the default method for this command, since it is
+;;  first.
 ;;      
-;;  And this removes the special treatment for `C-(' during
-;;  `icicle-read-color-wysiwyg', restoring the default `TAB' methods
-;;  that are defined by option `icicle-TAB-completion-methods':
+;;  And the following interaction removes the special treatment for
+;;  `C-(' during `icicle-read-color-WYSIWYG', restoring the default
+;;  `TAB' methods that are defined by option
+;;  `icicle-TAB-completion-methods':
 ;;
 ;;    C-- M-x icicle-set-TAB-methods-for-command RET
-;;    Command: icicle-read-color-wysiwyg RET
+;;    Command: icicle-read-color-WYSIWYG RET
 ;;
 ;;(@* "Partial Completion")
 ;;  ** Partial Completion **
 ;;  2. Word completion using the dynamic abbreviation of standard
 ;;     Emacs library `dabbrev.el', via `C-M-/'.
 ;;
-;;  3. Mailing information completion for BBDB (Insidious Big Brother
-;;     Database).
+;;  3. Word completion using the `dynamic-completion-mode' of standard
+;;     Emacs library `completion.el', via `C-RET' or `M-RET'.
 ;;
 ;;  4. Word completion using the words and phrases in a thesaurus, via
 ;;     `C-c /' (requires library `synonyms.el').
 ;;
-;;  5. `TAB' completion of the following in Shell mode and ESS modes
+;;  5. Mailing-information completion for BBDB (Insidious Big Brother
+;;     Database).
+;;
+;;  6. `TAB' completion of the following in Shell mode and ESS modes
 ;;     (and other, similar interpreters):
 ;;
 ;;     * Commands
 ;;  (`S-TAB'), progressive completion (`S-SPC'), help on individual
 ;;  candidates (`C-M-RET'), and so on.
 ;;
-;;(@* "Dynamic Abbreviation")
-;;  ** Dynamic Abbreviation **
+;;(@* "Dynamic Completion Using `dabbrev.el'")
+;;  ** Dynamic Completion Using `dabbrev.el' **
 ;;
 ;;  Library `dabbrev.el' lets you type a few characters in a buffer
 ;;  and then prefix-complete them (in the same buffer) to a full word
 ;;  or symbol name.  The completion candidates come from words or
 ;;  symbol names in buffers that you are editing.  This functionality
-;;  is called "dynamic abbreviation", though that is not a very good
-;;  term for it (words are completed, not abbreviated, dynamically).
+;;  is called "dynamic abbreviation", though "dynamic completion"
+;;  would be a better term for it (words are completed, not
+;;  abbreviated, dynamically).
 ;;
-;;  In Emacs, there are two ways to "dynamically abbreviate" text:
+;;  Library `dabbrev.el' provides two ways to dynamically complete
+;;  text:
 ;;
 ;;  a. `M-/' (command `dabbrev-expand') completes to a candidate word.
 ;;     Repeating it replaces the completion with a different one -
 ;;     However, in this case, there is no way to cycle among the
 ;;     candidates.
 ;;
-;;  If there are many candidate completions, then cycling among them
+;;  If there are many candidate completions then cycling among them
 ;;  with `M-/' can be tedious.  You can use `C-M-/' to complete to a
 ;;  common prefix, thus narrowing the set of candidates, but then you
 ;;  lose the ability to cycle among them.
 ;;  cycling.  In addition, you can complete an empty prefix, starting
 ;;  from scratch with apropos completion.
 ;;
-;;(@* "BBDB Completion")
-;;  ** BBDB Completion **
-;;
-;;  Library `bbdb.el' is a rolodex-like database program for GNU
-;;  Emacs.  You can obtain a recent version, such as 3.02, from
-;;  http://melpa.milkbox.net/, or you can pick up an older version,
-;;  such as 2.35, from http://bbdb.sourceforge.net/.
-;;
-;;  If user option `icicle-functions-to-redefine' contains an entry
-;;  for `bbdb-complete-mail' (for BBDB version 3.02 or later) or
-;;  `bbdb-complete-name' (for BBDB version 2.35), then Icicles
-;;  redefines that command so that it uses Icicles completion when
-;;  there are multiple completions.  You can use any Icicles features,
-;;  such as apropos completion and candidate cycling.  For this
-;;  feature to take effect, you must load BBDB before you load
-;;  Icicles.  Option `icicle-functions-to-redefine' includes entries
-;;  for both `bbdb-complete-mail' and `bbdb-complete-name' by default.
+;;(@* "Dynamic Completion Using `completion.el'")
+;;  ** Dynamic Completion Using `completion.el' **
+;;
+;;  Standard Emacs library `completion.el' is quite old and little
+;;  known nowadays.  It is nevertheless very useful.  In a way, it is
+;;  like `dabbrev.el' on steroids.  It is pretty smart, proposing
+;;  first the completions that you have used most recently.  You can
+;;  use it anywhere, to complete all kinds of buffer text.
+;;
+;;  The command for completing the text before point is `complete' (an
+;;  unfortunately general name, as is the name of the library), which
+;;  is bound globally to `C-RET' and `M-RET' when you are in
+;;  `dynamic-completion-mode'.
+;;
+;;  Command `complete' can act similar to the `dabbrev' commands, in
+;;  which case it is said to be using method `cdabbrev' (but this name
+;;  is not defined in any way programmatically; it is referred to
+;;  informally).
+;;
+;;  But the `dabbrev'-like behavior of `complete' is only a fallback,
+;;  when its normal completion method comes up empty-handed.  The
+;;  normal method matches what you type against a persistent personal
+;;  "database" of completions, which is constructed and updated
+;;  automatically as you type.  (It is saved only on demand or when
+;;  you exit Emacs.)
+;;
+;;  To make good use of this library, you really should read the
+;;  complete Commentary in the `completion.el' source code (keeping in
+;;  mind that in a few places it is not up to date).  But the doc
+;;  string of command `icicle-complete' (which is the version of
+;;  `complete' used in Icicle mode) is a good place to start.
+;;
+;;  To make this kind of completion available, you must turn on
+;;  `dynamic-completion-mode'.
+;;
+;;  Here is the beginning of the `completion.el' Commentary:
+;;
+;;    This watches all the words that you type and remembers them.
+;;    When typing a new word, pressing "complete" (meta-return)
+;;    "completes" the word by inserting the most recently used word
+;;    that begins with the same characters.  If you press meta-return
+;;    repeatedly, it cycles through all the words it knows about.
+;;
+;;    If you like the completion then just continue typing, it is as
+;;    if you entered the text by hand.  If you want the inserted extra
+;;    characters to go away, type control-w or delete.  More options
+;;    are described below.
+;;
+;;    The guesses are made in the order of the most recently "used".
+;;    Typing in a word and then typing a separator character (such as
+;;    a space) "uses" the word.  So does moving a cursor over the
+;;    word.  If no words are found, it uses an extended version of the
+;;    `dabbrev'-style completion.
+;;
+;;    You automatically save the completions you use to a file between
+;;    sessions.
+;;
+;;    Completion enables programmers to enter longer, more descriptive
+;;    variable names while typing fewer keystrokes than they normally
+;;    would.
+;;
+;;  Just as for the `dabbrev' commands, Icicles enhances this
+;;  completion by letting you use Icicles minibuffer completion when
+;;  there are multiple candidates.  This happens only if one of these
+;;  is true:
+;;
+;;  * The number of candidates is greater than the value of option
+;;    `icicle-cmpl-max-candidates-to-cycle'.
+;;
+;;  * There are at least two candidates and you explicitly request
+;;    Icicles completion by using two or more plain prefix args (`C-u
+;;    C-u').
+;;
+;;  What about that fallback completion method, `cdabbrev'?  Vanilla
+;;  `complete' uses it only if no matching completions are found in
+;;  the database.  (It is generally slower than database lookup.)
+;;
+;;  Icicles lets you choose whether to match only database completions
+;;  or also terms found in your current Emacs windows (`cdabbrev'), by
+;;  customizing option `icicle-cmpl-include-cdabbrev-flag'.  (You can
+;;  toggle the value anytime using `M-x icicle-toggle-option'.)
+;;
+;;  If the option value is non-`nil' then whenever Icicles completion
+;;  is used the candidates include the completions found dynamically
+;;  by searching your current windows.  If it is `nil' then only
+;;  database completions are candidates.  The dynamically found
+;;  candidates are highlighted in buffer `*Completions*' using face
+;;  `icicle-special-candidate', so you can easily distinguish them.
 ;;
 ;;(@* "Thesaurus Lookup and Completion")
 ;;  ** Thesaurus Lookup and Completion **
 ;;  All of these Icicles commands require that you load library
 ;;  `synonyms.el'.
 ;;
+;;(@* "BBDB Completion")
+;;  ** BBDB Completion **
+;;
+;;  Library `bbdb.el' is a rolodex-like database program for GNU
+;;  Emacs.  You can obtain a recent version, such as 3.1, from one of
+;;  these locations:
+;;
+;;  * http://download.savannah.gnu.org/releases/bbdb/
+;;  * http://melpa.milkbox.net/
+;;
+;;  If user option `icicle-functions-to-redefine' contains an entry
+;;  for `bbdb-complete-mail' (for BBDB version 3.0.2 or 3.1) or
+;;  `bbdb-complete-name' (for BBDB version 2.35), then Icicles
+;;  redefines that command so that it uses Icicles completion when
+;;  there are multiple completions.  You can use any Icicles features,
+;;  such as apropos completion and candidate cycling.  For this
+;;  feature to take effect, you must load BBDB before you load
+;;  Icicles.  By default, option `icicle-functions-to-redefine'
+;;  includes an entry for `bbdb-complete-mail' (not for
+;;  `bbdb-complete-name').
+;;
+;;  (If you have BBDB version 3.0.2 instead of version 3.1, then
+;;  uncomment the version of `icicle-bbdb-complete-mail' in
+;;  `icicles-cmd1.el' that supports BBDB version 3.0.2.)
+;;
 ;;(@* "Completion in Comint Modes")
 ;;  ** Completion in Comint Modes **
 ;;
 ;;    default value for minibuffer input.  When the value is non-`nil'
 ;;    and the INITIAL-INPUT argument of minibuffer-reading functions
 ;;    is `nil' or "", the DEFAULT-VALUE argument can be inserted into
-;;    the minibuffer as the initial input.  For `completing-read', if
-;;    the option value is `t' then the default value is instead added
-;;    the prompt as a hint.
+;;    the minibuffer as the initial input.
+;;
+;;    For `completing-read' and `read-file-name', if the option value
+;;    is `t' then the default value is normally added the prompt as a
+;;    hint.  However, for `read-file-name', if option
+;;    `insert-default-directory' is non-`nil', then to avoid
+;;    duplication:
+;;
+;;    * If the default value is the same as the value of
+;;      `default-directory' then it is not added to the prompt.
+;;
+;;    * If the default value is added to the prompt then it is first
+;;      made relative to `default-directory'.
 ;;
 ;;    Adding the default value to the prompt corresponds to the more
 ;;    or less conventional behavior of vanilla Emacs.  But vanilla
 ;;
 ;;  * In buffer `*Completions*' during completion for multi-command
 ;;    `icicle-Info-index' (`i' in Info), face
-;;    `icicle-historical-candidate-other' is used to highlight index
-;;    topics that refer to Info nodes that you have already visited.
-;;    This highlighting is controlled by user option
-;;    `icicle-Info-visited-max-candidates' as well as option
+;;    `icicle-historical-candidate-other' can be used to highlight
+;;    index topics that refer to Info nodes that you have already
+;;    visited.  This highlighting is controlled by options
+;;    `icicle-Info-highlight-visited-nodes' and
 ;;    `icicle-highlight-historical-candidates-flag'.
 ;;    See (@> "Highlighting Index Topics for Visited Info Nodes").
 ;;
 ;;
 ;;  * Option `icicle-key-complete-keys-for-minibuffer' is the list of
 ;;    keys that Icicles binds to `icicle-complete-keys' in the
-;;    minibuffer keymaps.  By default, this is the singleton list
-;;    ([M-backtab]), which means `M-S-TAB'.  `S-TAB' itself is of
+;;    minibuffer keymaps.  By default, this is the list ([M-backtab]
+;;    [ESC backtab]), which means `M-S-TAB' and `ESC S-TAB'
+;;    (essentially equivalent to `M-S-TAB').  `S-TAB' itself is of
 ;;    course used (by default) for apropos completion of your
 ;;    minibuffer input, so it cannot also be used for key completion
 ;;    in the minibuffer.  If your window manager steals `M-S-TAB' then
-;;    customize this option to choose another key, or try `ESC S-TAB'
-;;    (equivalent to `M-S-TAB').
+;;    try `ESC S-TAB' or customize this option to choose another key.
 ;;
 ;;  * Option `icicle-complete-keys-ignored-prefix-keys' is a list of
 ;;    prefix keys to be ignored by `icicle-complete-keys' (`S-TAB').
 ;;    values at any time using `C-#'.  For more information, see
 ;;    (@file :file-name "icicles-doc1.el" :to "Icompletion").
 ;;
+;;    Note: Several tripping (navigating) commands, including Icicles
+;;    search commands, bind option `icicle-incremental-completion' to
+;;    `always', because I think you typically want to start them out
+;;    with incremental completion turned on.  Remember that you can
+;;    use `C-#' (once or twice) to turn incremental completion off.
+;;
 ;;  * User options `icicle-incremental-completion-delay' and
 ;;    `icicle-incremental-completion-threshold' together cause a delay
 ;;    before incremental completion takes effect.
 ;;    `custom-file' or init file (`~/.emacs') updated in this way,
 ;;    then customize `icicle-customize-save-flag' to `nil'.
 ;;
-;;  * If `icicle-buffers-ido-like-flag' is `t' then `icicle-buffer'
-;;    and similar commands act more Ido-like.  Specifically, those
-;;    commands then bind these options to `t':
+;;  * If user option `icicle-buffers-ido-like-flag' is `t' then
+;;    `icicle-buffer' and similar commands act more Ido-like.
+;;    Specifically, those commands then bind these options to `t':
 ;;    `icicle-show-Completions-initially-flag',
 ;;    `icicle-top-level-when-sole-completion-flag', and
 ;;    `icicle-default-value'.
 ;;
-;;  * If `icicle-files-ido-like-flag' is `t' then `icicle-file' and
-;;    similar commands act more Ido-like.  Specifically, those
+;;  * If option `icicle-files-ido-like-flag' is `t' then `icicle-file'
+;;    and similar commands act more Ido-like.  Specifically, those
 ;;    commands then bind these options to `t':
 ;;    `icicle-show-Completions-initially-flag',
 ;;    `icicle-top-level-when-sole-completion-flag', and
 ;;    `icicle-default-value'.
 ;;
+;;  * User options `icicle-cmpl-max-candidates-to-cycle' and
+;;    `icicle-cmpl-include-cdabbrev-flag' control the behavior of
+;;    Icicles command `icicle-complete', which replaces Emacs command
+;;    `complete' from standard Emacs library `completion.el' when you
+;;    are in Icicle mode.  The first of these options controls how
+;;    many completion matches are required for Icicles completion to
+;;    be used instead of in-place cycling replacement.  The second
+;;    controls whether Icicles completion candidates can be found
+;;    dynamically or should be limited to terms from your completions
+;;    database.
+;;
 ;;  * The value of option `icicle-customize-save-variable-function' is
 ;;    the function Icicles uses to automatically save user option
 ;;    changes made by some commands.  I recommend that you do *NOT*
 ;;    such option saving using their own function instead of the
 ;;    default value, `customize-save-variable'.
 ;;
+;;  * Non-`nil' option
+;;    `icicle-read-char-by-name-multi-completion-flag' means that
+;;    `icicle-read-char-by-name' (which, by the default value of
+;;    option `icicle-functions-to-redefine', replaces vanilla
+;;    `read-char-by-name' in Icicle mode) uses multi-completion and
+;;    shows helpful information about the current completion candidate
+;;    in the mode line (the character name and code point, in hex,
+;;    octal, and decimal notation).
+;;
+;;    The 3-part multi-completion, NAME CODE CHAR, shows three ways to
+;;    represent the character as text:
+;;
+;;    * NAME is the Unicode name
+;;    * CODE is the Unicode code point, as a hexidecimal numeral
+;;    * CHAR is the character (as it appears in text, not an integer)
+;;
+;;    Setting this option to `nil' can speed up reading a character
+;;    considerably, but it does not give you the advantages of seeing
+;;    the character (WYSIWYG) or matching its code point.
+;;    
+;;    Instead of using a `nil' value, you can also speed things up by:
+;;
+;;    * turning off incremental completion
+;;    * choosing a strong input pattern, before asking for candidate
+;;      matching
+;;
 ;;  * Option `icicle-zap-to-char-candidates' determines which
 ;;    character names are used for `icicle-zap-to-char' (bound to
 ;;    `M-z' by default) when completing.  The default value of `nil'
 ;;    complete against all Unicode character names.  Or you can set it
 ;;    to any function that returns a value of the same form at that
 ;;    returned by `icicle-ucs-names' (hence `ucs-names').
+;;
+;;  * The options whose names start with prefix `icicle-cand-preds-'
+;;    are lists of predefined predicates that are used to filter
+;;    completion candidates when you narrow with `M-&'.  Option
+;;    `icicle-cand-preds-all' includes all such predicates, across all
+;;    types of candidate.  The other options, named
+;;    `icicle-cand-preds-for-TYPE', are each for a particular
+;;    completion TYPE.  For example, `icicle-cand-preds-for-bookmark'
+;;    provides predicates for narrowing bookmark candidates.  Option
+;;    `icicle-cand-preds-for-misc', is an exception: its predicates
+;;    apply to all candidate types.
+;;
+;;    These are the TYPE-specific options:
+;;
+;;      `icicle-cand-preds-for-bookmark'
+;;      `icicle-cand-preds-for-buffer'
+;;      `icicle-cand-preds-for-color'
+;;      `icicle-cand-preds-for-face'
+;;      `icicle-cand-preds-for-file'
+;;      `icicle-cand-preds-for-frame'
+;;      `icicle-cand-preds-for-package'
+;;      `icicle-cand-preds-for-symbol'
+;;      `icicle-cand-preds-for-variable'
+;;      `icicle-cand-preds-for-window'
+;;
+;;    See also (@file :file-name "icicles-doc1.el" :to "`M-&': Satisfying Additional Predicates").
  
 ;;(@* "File-Name and Directory-Name Completion Tips")
 ;;
 ;;  to whatever the value of option `icicle-yank-function' is.  By
 ;;  default, this value is `yank'.
 ;;
+;;  The substitution of `icicle-dired(-other-window)' for
+;;  `dired(-other-window)' happens by default only if you do not use
+;;  library `Dired+'.  If you do use `Dired+' then the commands are
+;;  already Icicles multi-commands, and are especially powerful.
+;;
 ;;  Option `icicle-top-level-key-bindings' remaps not only these
 ;;  standard Emacs commands but also some commands provided by other
 ;;  libraries.  For example, if you use package `Bookmark+', then
 ;;  bindings.  For example, `Info-index' is by default redefined to
 ;;  `icicle-Info-index' in Icicle mode, so `i' in Info mode is
 ;;  effectively bound to `icicle-Info-index'.  Commands listed in
-;;  option `icicle-functions-to-redefine' are typically bound in
-;;  keymaps other than the global map.
+;;  option `icicle-functions-to-redefine' are typically, but not
+;;  always, bound in keymaps other than the global map.
 ;;
 ;;  There are many Icicles commands that are not bound to any keys by
 ;;  default.  You might want to bind some of them to keys in keymap
 ;;                      toggle option
 ;;                      `icicle-buffer-include-recent-files-nflag')
 ;;
+;;  The following minibuffer binding during completion refreshes the
+;;  `*Completions*' display.
+;;
+;;    `C-x C-M-l'     - `icicle-display-candidates-in-Completions'
+;;
+;;  You will likely never need to use it for that purpose.  However,
+;;  in Info mode, during command `icicle-Info-index' (bound to `i' in
+;;  Info), the same key, `C-x C-M-l', searches for all nodes that
+;;  correspond to the current completion candidates, and highlights
+;;  those that you have already visited, using face
+;;  `icicle-historical-candidate-other' (which by default looks like a
+;;  link).
+;;
 ;;  The following minibuffer binding moves the cursor to the start of
 ;;  the part of your input, if any, that is highlighted because it
 ;;  does not match any completion candidate (see option
 ;;    prefix `C-M-' are bound to commands that narrow the available
 ;;    candidates to bookmarks of a specific type.  For example,
 ;;    `C-M-d' narrows the choices to Dired bookmarks.
+;;    (You can also narrow bookmark choices by type using `M-&'.
+;;    See (@file :file-name "icicles-doc1.el" :to "`M-&': Satisfying Additional Predicates").)
 ;;
 ;;  The following bindings are made for `completion-list-mode', that
 ;;  is, for buffer `*Completions*', which shows the list of candidate
 ;;  value of `icicle-functions-to-redefine' contains the following
 ;;  functions:
 ;;
-;;    `bbdb-complete-mail' (from BBDB 3.02), `bbdb-complete-name'
-;;    (from BBDB 2.35), `comint-completion-at-point' (or
-;;    `comint-dynamic-complete', prior to Emacs 24),
-;;    `comint-dynamic-complete-filename',
+;;    `bbdb-complete-mail' (from BBDB 3.0.2 or 3.1),
+;;    `bbdb-complete-name' (from BBDB 2.35),
+;;    `comint-completion-at-point' (or `comint-dynamic-complete',
+;;    prior to Emacs 24), `comint-dynamic-complete-filename',
 ;;    `comint-replace-by-expanded-filename',
 ;;    `ess-complete-object-name' (from ESS),
 ;;    `gud-gdb-complete-command', `Info-goto-node', `Info-index',
-;;    `Info-menu', `lisp-complete-symbol', `lisp-completion-at-point',
+;;    `Info-menu', `lisp-complete-symbol', `elisp-completion-at-point'
+;;    (or `lisp-completion-at-point', prior to Emacs 25),
 ;;    `minibuffer-default-add-completions', `read-char-by-name',
 ;;    `read-color', `read-from-minibuffer', `read-string',
 ;;    `recentf-make-menu-items'.
 ;;  dealing with multi-completions.  Function `icicle-read-file-name'
 ;;  provides an example: file names that match ".+/$", that is,
 ;;  directory names, are highlighted as special candidates.  Function
-;;  `icicle-read-color-wysiwyg' provides another example (using the
+;;  `icicle-read-color-WYSIWYG' provides another example (using the
 ;;  similar, but internal, variable `icicle-proxy-candidate-regexp'):
 ;;  proxy color-name candidates such as `*point foreground*' and
 ;;  `'icicle-region-background'' are highlighted, but not their color
 ;;  `display-completion-list' so that it retains text properties.
 ;;  Emacs should do the same, but it does not (yet).
 ;;
-;;  Icicles command `icicle-read-color-wysiwyg' presents an
+;;  Icicles command `icicle-read-color-WYSIWYG' presents an
 ;;  illustration, using the `face' property.  (It also uses properties
 ;;  `icicle-mode-line-help' and `help-echo', to provide RGB and HSV
 ;;  information in the mode-line and via tooltip.)
 ;;
-;;  In `icicle-read-color-wysiwyg', a multi-completion candidate is
+;;  In `icicle-read-color-WYSIWYG', a multi-completion candidate is
 ;;  used, composed of an unpropertized string that names a color and a
 ;;  propertized string that names its RGB (red, green, blue) value.
 ;;  The RGB string, by default, has a background of the same color -
 ;;  swatch.
 ;;
 ;;  The code that does this is function `icicle-make-color-candidate',
-;;  which is used by `icicle-read-color-wysiwyg' and other Icicles
+;;  which is used by `icicle-read-color-WYSIWYG' and other Icicles
 ;;  commands that read colors.  Here is a simplified definition:
 ;;
 ;;   (defun icicle-make-color-candidate (color-name)
 ;;  completion.)
 ;;
 ;;  You can match any part of the multi-completion: color name or RGB
-;;  value.  Command `icicle-read-color-wysiwyg' defines a set of sort
+;;  value.  Command `icicle-read-color-WYSIWYG' defines a set of sort
 ;;  orders that are pertinent to the color candidates.
 ;;
 ;;  You can use `C-,' to sort by color name, amount of red, blue,
 ;;  HSV distance from a base color.
 ;;
 ;;  If option `icicle-add-proxy-candidates-flag' is non-`nil', then
-;;  command `icicle-read-color-wysiwyg' includes proxy completion
+;;  command `icicle-read-color-WYSIWYG' includes proxy completion
 ;;  candidates that are not color-name-and-RGB pairs.  As always, you
 ;;  can toggle the use of proxy candidates using `C-M-_' in the
 ;;  minibuffer.
 ;;
 ;;  The best way to learn how to do this is to look at how the
 ;;  existing tripping commands are defined.  Some of them use macro
-;;  `icicle-define-command'; others do not.  Some use the
-;;  building-block functions `icicle-explore' or `icicle-apply';
-;;  others do not.  Several use `icicle-search' as a building block.
+;;  `icicle-define-command'; others do not.  Some use building-block
+;;  function `icicle-explore' or `icicle-apply'; others do not.
+;;  Several use `icicle-search' as a building block.
 ;;
 ;;(@* "Using `icicle-define-command'")
 ;;  ** Using `icicle-define-command' **
 ;;  `icicle-get-alist-candidate' to get the location information for a
 ;;  given display candidate.
 ;;
+;;  Note: `icicle-explore' binds user option
+;;  `icicle-incremental-completion' to `always', because I think you
+;;  typically want to start it out with incremental completion turned
+;;  on.  Functions that call `icicle-explore' thus also turn on
+;;  incremental completion.  This includes the predefined Icicles
+;;  commands `icicle-find-tag' and `icicle-search', and the many
+;;  specialized Icicles search commands derived from `icicle-search'.
+;;  Remember that you can use `C-#' (once or twice) to turn
+;;  incremental completion off.
+;;
 ;;(@* "Using `icicle-apply'")
 ;;  ** Using `icicle-apply' **
 ;;
 ;;  make no such provision, but with suitable arguments you can use
 ;;  them too to define tripping commands.
 ;;
+;;  Note: `icicle-apply' binds user option
+;;  `icicle-incremental-completion' to `always', because I think you
+;;  typically want to start it out with incremental completion turned
+;;  on.  Functions that call `icicle-apply' thus also turn on
+;;  incremental completion.  This includes the predefined Icicles
+;;  commands `icicle-goto-marker', `icicle-goto-any-marker', and
+;;  `icicle-goto-global-marker'.  Remember that you can use `C-#'
+;;  (once or twice) to turn incremental completion off.
+;;
 ;;(@* "Using `icicle-search'")
 ;;  ** Using `icicle-search' **
 ;;
 ;;  completion candidates.  Several predefined Icicles tripping
 ;;  commands were defined using `icicle-search'.
 ;;
+;;  Note: `icicle-search' effectively binds user option
+;;  `icicle-incremental-completion' to `always', because I think you
+;;  typically want to start it out with incremental completion turned
+;;  on.  Other Icicles search commands are defined using
+;;  `icicle-search', so they also effectively turn on incremental
+;;  completion.  Remember that you can use `C-#' (once or twice) to
+;;  turn it off.
+;;
 ;;(@* "Tripping on Foot")
 ;;  ** Tripping on Foot **
 ;;
 ;;  apply to the full alist-entry candidates that are supplied to
 ;;  `completing-read' or `read-file-name', not just to the textual
 ;;  candidates that are displayed in buffer `*Completions*'.
-;;  See (@file :file-name "icicles-doc1.el" :to "Progressive Completion").
+;;  See (@file :file-name "icicles-doc1.el" :to "`M-&': Satisfying Additional Predicates").
  
 ;;(@* "Specifying Match Functions for Commands")
 ;;
 ;;     doc string to tell users that they can cycle
 ;;     `icicle-incremental-completion' using `C-#'.
 ;;
-;;  9. Another of my libraries that can help programmers provide
+;;  9. Yes, you can define commands that do or do not use Icicles.
+;;     That is, users can take advantage of Icicles behavior during
+;;     particular commands, even while in general leaving Icicle mode
+;;     off.  Conversely, they can get vanilla Emacs behavior while in
+;;     general leaving Icicle mode on.
+;;
+;;     When you define a command, you can use macro
+;;     `icicle-with-icy-mode-ON' to enable Icicle mode during the
+;;     evaluation of its body sexps.  The original value of Icicle
+;;     mode (on or off) is restored when done.  If Icicle mode was
+;;     already on then enabling it is skipped (a no-op).
+;;
+;;     Similarly, you can use macro `icicle-with-icy-mode-OFF' to
+;;     disable Icicle mode during the evaluation of its body sexps.
+;;     The original value of Icicle mode (on or off) is restored when
+;;     done.  If Icicle mode was already off then disabling it is
+;;     skipped (a no-op).
+;;
+;; 10. Another of my libraries that can help programmers provide
 ;;     default values is `thingatpt+.el'.  It provides functions for
 ;;     picking up symbols, sexps, numbers, words, and other sorts of
 ;;     thing near the text cursor (`point').
index 49c541a..0731ee0 100644 (file)
@@ -4,16 +4,16 @@
 ;; Description: Faces 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 09:19:43 2006
-;; Last-Updated: Thu Dec 26 09:30:35 2013 (-0800)
+;; Last-Updated: Thu Jan  1 10:55:12 2015 (-0800)
 ;;           By: dradams
-;;     Update #: 713
+;;     Update #: 717
 ;; URL: http://www.emacswiki.org/icicles-face.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:
 ;;
@@ -361,13 +361,15 @@ This means that they belong to list `icicle-extra-candidates'."
                                                    :underline t)))
     "*Face to highlight `*Completions*' candidates that were used indirectly.
 That is, you might or might not have entered these candidates but in
-some sense you have used or visited them.  Example: index topics that
-point to Info nodes that you have visited.
-
-Whether or not such highlighting is done at all is governed by option
-`icicle-highlight-historical-candidates-flag'.  Whether it is done for
-a given set of candidates is governed by option
-`icicle-Info-visited-max-candidates'."
+some sense you have used or visited them.  Whether or not such
+highlighting is done is governed by option
+`icicle-highlight-historical-candidates-flag'.
+
+Example:
+Index topics that point to Info nodes that you have visited.  Whether
+such highlighting occurs automatically for Info-node candidates is
+governed by option `icicle-Info-highlight-visited-nodes'.  But you can
+highlight the nodes on demand, using `C-x C-M-l'."
     :group 'Icicles-Completions-Display :group 'faces))
 
 (defface icicle-input-completion-fail
index 0f442ec..ef4e53d 100644 (file)
@@ -4,24 +4,29 @@
 ;; Description: Non-interactive functions 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 09:25:53 2006
-;; Last-Updated: Tue Apr 29 18:03:41 2014 (-0700)
+;; Last-Updated: Sat Feb  7 14:17:40 2015 (-0800)
 ;;           By: dradams
-;;     Update #: 14628
+;;     Update #: 15075
 ;; URL: http://www.emacswiki.org/icicles-fn.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,