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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top