Могу ли я использовать чтение ido-complete-read, а не заполнять-читать везде?
Я большой поклонник ido-mode
, настолько, что хотел бы использовать его для таких вещей, как describe-function
или find-tag
и т.д., без необходимости писать что-то вроде "Могу ли я получить ido -mode-style для поиска тегов в Emacs?" для каждого из них.
И
(defalias completing-read ido-completing-read)
и
(setf 'completing-read 'ido-completing-read)
не работают, по крайней мере отчасти потому, что ido-completing-read
вызывает completing-read
в своем теле, поэтому любое простое переопределение приведет к бесконечной рекурсии.
В теории это должно быть возможно, так как первая строка docstring для ido-completing-read
- это "замена Ido для встроенного completing-read
". Я немного огляделся и не могу найти никого, кто попытался бы или не смог бы это сделать.
Я понимаю, что Icicles, вероятно, предоставляет что-то вроде этого, и я могу закончить с этим в любом случае, но это немного больше погружения, чем я сейчас хочу.
Спасибо за любую помощь.
Ответы
Ответ 1
Я не думаю, что ido-mode
уже готов к этому. В частности, ido-completing-read
в настоящее время работает только со строками, а completing-read
также поддерживает алисты. Это очень важно, если вы хотите иметь другое описание элементов, которые вы хотите заполнить, на уровне пользователя.
Поэтому я не удивлен, что это не работает из коробки. Если вы не измените код самостоятельно, лучшим вариантом будет просто файл с сообщением об ошибке/запросом функции.
Ответ 2
Изменить: теперь это пакет Emacs доступный из MELPA. Он был расширен в полноценный второстепенный режим. Разработка происходит на GitHub.
Оригинальное сообщение:
Вот моя утонченность ответа Якобо. Поблагодарите его за оригинальную магию. Я добавил переменную переопределения, которую вы можете использовать для предотвращения использования ido-completing-read
в определенных функциях. Я также добавил чек, который использует исходное чтение для завершения, если завершений нет (иногда это происходит, например, в org-remember-apply-template
из org-mode, что ломается с оригинальным советом Jacobo).
(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
Ответ 3
Hocus pocus, abracadabra, 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). Но мы можем получить то, что хотим от M-x
(global-set-key
"\M-x"
(lambda ()
(interactive)
(call-interactively
(intern
(ido-completing-read
"M-x "
(all-completions "" obarray 'commandp))))))
Ответ 4
Ido поставляется с функцией, которая должна это делать, поэтому просто вызовите ее в файле .emacs:
(ido-всюду t)
Ответ 5
Используя Emacs 24.3, ido-vubiquitous не работал у меня. Так что попробовал это, и он работает до сих пор:
(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)
Ответ 6
Просто подумайте: вы пробовали редактировать ido-completing-read
, чтобы вызвать original-completing-read
вместо completing-read
, указав original-completing-read
как текущий completing-read
, а затем выполнив свои действия defalias или setf?