Могу ли я использовать ido-завершающий-чтение вместо завершающего-чтения везде? - PullRequest
11 голосов
/ 25 мая 2009

Я большой поклонник ido-mode, настолько, что я хотел бы использовать его для таких вещей, как describe-function или find-tag и так далее, без необходимости писать что-то вроде "Могу ли я получить Идо" -режим в стиле поиска тегов в Emacs? " за каждого.

Оба

(defalias completing-read ido-completing-read)

и

(setf 'completing-read 'ido-completing-read)

не работает, хотя бы частично, потому что ido-completing-read вызывает completing-read в своем теле, поэтому любое простое переопределение может привести к бесконечной рекурсии.

Теоретически это должно быть возможно, так как первая строка строки документа для ido-completing-read - это "замена Ido для встроенного completing-read". Я немного огляделся и, похоже, не могу найти никого, кто пытался или преуспел в этом.

Я понимаю, что Сосульки , вероятно, обеспечивает что-то подобное, и я могу в конечном итоге пойти на это в любом случае, но это немного больше, чем я хочу сделать прямо сейчас.

Спасибо за любую помощь.

Ответы [ 6 ]

10 голосов
/ 19 июня 2009

Редактировать: теперь это пакет Emacs , доступный от MELPA . Он был расширен в полноценный минорный режим. Разработка происходит на GitHub .

Оригинальный пост:

Вот мое уточнение ответа Якобо. Благодарю его за оригинальную магию. Я добавил переменную переопределения, которую вы можете использовать, чтобы предотвратить использование ido-completing-read в определенных функциях. Я также добавил проверку, которая использует исходное чтение-завершение, если нет завершений (это иногда случается, например, в org-remember-apply-template из режима org, что нарушает первоначальный совет Якобо).

(defvar ido-enable-replace-completing-read t
  "If t, use ido-completing-read instead of completing-read if possible.

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-enable-replace-completing-read) ad-do-it))")

;; Replace completing-read wherever possible, unless directed otherwise
(defadvice completing-read
  (around use-ido-when-possible activate)
  (if (or (not ido-enable-replace-completing-read) ; Manual override disable ido
          (boundp 'ido-cur-list)) ; Avoid infinite loop from ido calling this
      ad-do-it
    (let ((allcomp (all-completions "" collection predicate)))
      (if allcomp
          (setq ad-return-value
                (ido-completing-read prompt
                               allcomp
                               nil require-match initial-input hist def))
        ad-do-it))))

О, а для использования ido в M-x , используйте smex

7 голосов
/ 06 июля 2009

Фокус-покус, абракадабра, presto!

(defadvice completing-read
  (around foo activate)
  (if (boundp 'ido-cur-list)
      ad-do-it
    (setq ad-return-value
      (ido-completing-read
       prompt
       (all-completions "" collection predicate)
       nil require-match initial-input hist def))))

Это работает со всем, кроме subr, из которого важна команда execute-extended-command (то, что связано с M-x). Но мы можем получить то, что хотим от М-х

(global-set-key
 "\M-x"
 (lambda ()
   (interactive)
   (call-interactively
    (intern
     (ido-completing-read
      "M-x "
      (all-completions "" obarray 'commandp))))))
3 голосов
/ 26 мая 2009

Я не думаю, что ido-mode к этому уже готова. В частности, ido-completing-read в настоящее время работает только со строками, в то время как completing-read также поддерживает списки. Это очень важно, если вы хотите иметь другое пользовательское описание элементов, которые вы хотите выполнить.

Поэтому я не удивлен, что это не работает из коробки, пока. Если вам не нужно самостоятельно модифицировать код, лучше всего подать отчет об ошибке / запрос функции.

1 голос
/ 12 марта 2013

Используя Emacs 24.3, ido-ubiquitous не работал для меня. Итак, попробовал это, и пока все работает нормально:

(defun my-completing-read (prompt collection &optional predicate
                  require-match initial-input
                  hist def inherit-input-method)
  (if (listp collection)
      (ido-completing-read prompt collection predicate require-match
               initial-input hist def inherit-input-method)
    (completing-read-default prompt collection predicate require-match
                 initial-input hist def inherit-input-method)))

(setq completing-read-function 'my-completing-read)
1 голос
/ 25 мая 2009

Ido поставляется с функцией, которая должна это делать, поэтому просто вызовите ее в файле .emacs:

(идо-везде t)

0 голосов
/ 25 мая 2009

Просто мысль: вы пытались отредактировать ido-completing-read для вызова original-completing-read вместо completing-read, определив original-completing-read как текущий completing-read, а затем выполнив свои действия по дефалиации или setf?

...