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