我可以使用ido-completed-read而不是在任何地方完成阅读吗?

时间:2009-05-25 04:39:52

标签: emacs elisp editing ido-mode icicles

我是ido-mode的忠实粉丝,以至于我想将它用于像describe-functionfind-tag之类的东西,等等,而不必像在“我可以获得在Emacs中搜索标签的ido模式式完成吗?”对于每一个。

两个

(defalias completing-read ido-completing-read)

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

不起作用,至少部分是因为ido-completing-read在其正文中调用completing-read,因此任何简单的重新定义都会导致无限递归。

理论上,它应该是可能的,因为ido-completing-read的文档字符串的第一行是“Ido替换内置completing-read”。我环顾四周,似乎无法找到任何尝试或成功的人。

我意识到Icicles可能会提供类似这样的东西,无论如何我最终还是会这样做,但这比我现在想要的更多一点。

感谢您的帮助。

6 个答案:

答案 0 :(得分:10)

编辑:现在是Emacs package available from MELPA。它已经扩展为一个成熟的次要模式。发展发生on GitHub

原帖:

以下是雅各布答案的改进。归功于原始魔法。我添加了一个覆盖变量,您可以使用它来阻止在特定函数中使用ido-completing-read。如果没有完成,我还添加了一个使用原始完成阅读的检查(这偶尔发生,例如在org-mode的org-remember-apply-template中,这打破了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))))

哦,在 M-x 中使用ido,请使用smex

答案 1 :(得分:7)

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))))))

答案 2 :(得分:3)

我认为ido-mode还没有为此做好准备。特别是,ido-completing-read目前仅适用于字符串,而completing-read也支持字母。一旦您希望对要完成的项目具有不同的用户级描述,这一点非常重要。

因此,我并不惊讶它开箱即用。如果没有自己修改代码,最好的办法就是提交错误报告/功能请求。

答案 3 :(得分:1)

Ido附带了一个应该执行此操作的函数,因此只需在.emacs文件中调用它:

  

(ido-everywhere t)

答案 4 :(得分:1)

使用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)

答案 5 :(得分:0)

只是想一想:您是否尝试过编辑ido-completing-read来呼叫original-completing-read而不是completing-read,将original-completing-read定义为当前completing-read,然后执行defalias还是setf?