Posso usar ido-completando-ler em vez de completar a ler em todos os lugares?
Pergunta
Eu sou um grande fã de ido-mode
, tanto assim que eu gostaria de usá-lo para coisas como describe-function
ou find-tag
e assim por diante, sem ter que escrever algo como em "Posso obter a conclusão do modo de estilo ido para procurando marcas no Emacs?" para cada um.
Ambos
(defalias completing-read ido-completing-read)
e
(setf 'completing-read 'ido-completing-read)
não funcionam, pelo menos em parte, porque as chamadas ido-completing-read
completing-read
em seu corpo, portanto, qualquer redefinição simples resultaria em recursão infinita.
Em teoria, deve ser possível, uma vez que a primeira linha do docstring para ido-completing-read
é "substituição Ido para o built-in completing-read
." Eu olhei ao redor um pouco e não consigo encontrar qualquer outra pessoa que tenha tentado ou sucedido no que faz.
Eu percebo que Icicles provavelmente fornece algo assim, e eu pode acabar indo com isso de qualquer maneira , mas é um pouco mais de um mergulho que eu gostaria de tomar agora.
Obrigado por qualquer ajuda.
Solução
Eu não acho que ido-mode
está pronto para isso ainda. Em particular, ido-completing-read
atualmente só funciona com cordas, enquanto completing-read
suporta alists também. Isto é muito importante uma vez que você quer ter uma descrição em nível de usuário diferente dos itens que você deseja completar diante.
Por isso não estou surpreso que ele não funciona fora da caixa, ainda. Curto de modificar o código você mesmo a sua melhor aposta é provavelmente apenas para apresentar um pedido de relatório de bug / recurso.
Outras dicas
Edit: Esta é agora uma Emacs pacote disponível a partir Melpa . Tem sido expandido em um modo menor de pleno direito. O desenvolvimento acontece no GitHub .
Original post:
Aqui está o meu refinamento da resposta de Jacobo. Creditar a ele para a magia originais. Eu adicionei uma variável de substituição, que você pode usar para evitar o uso de ido-completing-read
em funções específicas. Tenho também acrescentou um cheque que usa o original completando-ler se não há conclusões (Isso acontece de vez em quando, por exemplo, em org-remember-apply-template
de org-mode, que rompe com o conselho original de 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))))
Oh, e para usar ido em Mx , use PyMEx
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))))
que funciona com tudo, mas SUBR de, a partir do qual executar-estendeu-comando é o que importa (o que é binded a M-x). Mas podemos ter o que queremos da M-x
(global-set-key
"\M-x"
(lambda ()
(interactive)
(call-interactively
(intern
(ido-completing-read
"M-x "
(all-completions "" obarray 'commandp))))))
Ido vem com uma função que deve fazer isso, então basta chamá-lo em seu arquivo .emacs:
(ido-em toda parte t)
Usando Emacs 24.3, ido-onipresente não funcionou para mim. Então tentei isso e ele está funcionando bem até agora:
(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)
Apenas um pensamento: você já tentou editar ido-completing-read
para original-completing-read
chamada em vez de completing-read
, definindo original-completing-read
ser o completing-read
atual e, em seguida, fazer seus defalias ou coisa setf