[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Using ido-completions in other packages

From: Štěpán Němec
Subject: Re: Using ido-completions in other packages
Date: Fri, 04 Jun 2010 14:06:47 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.50 (gnu/linux)

Tassilo Horn <> writes:

> Andrea Crotti <> writes:
> Hi Andrea,
>> I've looked in the code but I don't see what I could substitute, maybe
>> substituting some functions or advising something else would do the
>> trick?

What I've been successfully using for some time is this, based on the
dysfunctional (for me, anyway) tip from the Emacs Wiki:


(defvar ido-replace-completing-read t
  "If non-nil, use `ido-completing-read' instead of `completing-read' if 

Set it to nil using `let' in around-advice for functions where the
original `completing-read' is required.  For example, if a function
foo absolutely must use the original `completing-read', define some
advice like this:

\(defadvice foo (around original-completing-read-only activate)
  \(let (ido-replace-completing-read) ad-do-it))")

(defvar ido-replace-completing-read-ignore-commands nil
  "List of commands to... you get the point.")

(setq ido-replace-completing-read-ignore-commands
      '(describe-function describe-variable find-function find-variable
        w3m-goto-url w3m-goto-url-new-session))

;; replace completing-read wherever possible, unless directed otherwise
(defadvice completing-read
  (around use-ido-when-possible activate)
  (if (or (not ido-replace-completing-read)
          ido-cur-list             ; Avoid infinite loop from ido calling this
          (memq this-command ido-replace-completing-read-ignore-commands))      
    (let ((allcomp (all-completions "" collection predicate)))
      (if allcomp
          (setq ad-return-value
                (ido-completing-read prompt
                                     nil require-match initial-input hist def))



> Basically, if you want to use ido-completion in some code, you would use
> `ido-comleting-read' instead of `completing-read'.  For example, in some
> home-brewn mode I have something like that:
> (if (and (featurep 'ido) ido-mode)
>     ;; ido is available and enabled, so use it.
>     (ido-completing-read "Command: " commands)
>   ;; fallback to normal completion with the
>   ;; most frequently used command as default.
>   (completing-read
>    (concat "Command (defaults to `"
>            (car commands) "'): ")
>    commands
>    nil t nil nil (car commands)))
> You could try to make `completing-read' point to `ido-completing-read':
>   (fset 'completing-read 'ido-completing-read)
> But that might error in some cases, cause `completing-read' has one
> optional parameter more than `ido-completing-read'.  You might want to
> create a function `andrea-completing-read' with the exact signature of
> `completing-read' which just delegates to `ido-completing-read' and
> throws away the additional parameter, and then do
>   (fset 'completing-read 'andrea-completing-read)
> In any case: This method is a hammer, so be warned. ;-)
> Bye,
> Tassilo

reply via email to

[Prev in Thread] Current Thread [Next in Thread]