Emacs 我可以用我完成阅读而不是到处阅读吗?

Emacs 我可以用我完成阅读而不是到处阅读吗?,emacs,elisp,editing,ido-mode,icicles,Emacs,Elisp,Editing,Ido Mode,Icicles,我非常喜欢ido模式,因此我想将其用于描述函数或查找标记等,而不必为每个模式编写类似于“我可以在Emacs中搜索标记时使用ido模式完成吗?” 两者 及 不工作,至少部分是因为i完成读取在其主体中调用完成读取,所以任何简单的重新定义都会导致无限递归 从理论上讲,这应该是可能的,因为文档字符串的第一行是“ido替换内置的完成读取”。我环顾了一下,似乎找不到任何其他人尝试过或成功过它 我意识到这可能提供了类似的东西,我可能最终还是会这样做,但这比我现在想做的要多一些 谢谢您的帮助。想一想:您是否尝试

我非常喜欢
ido模式
,因此我想将其用于
描述函数
查找标记
等,而不必为每个模式编写类似于“我可以在Emacs中搜索标记时使用ido模式完成吗?”

两者

不工作,至少部分是因为
i完成读取
在其主体中调用
完成读取
,所以任何简单的重新定义都会导致无限递归

从理论上讲,这应该是可能的,因为文档字符串的第一行是“ido替换内置的
完成读取”
。我环顾了一下,似乎找不到任何其他人尝试过或成功过它

我意识到这可能提供了类似的东西,我可能最终还是会这样做,但这比我现在想做的要多一些


谢谢您的帮助。

想一想:您是否尝试过编辑
i完成阅读
调用
原始完成阅读
,而不是
完成阅读
,将
original completing read
定义为当前的
completing read
,然后执行您的defalias或setf操作?

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

(我不知道)


我认为,
ido模式
还没有准备好。特别是,
ido完成读取
当前仅适用于字符串,而
完成读取
也支持alist。如果您希望对要完成的项目有不同的用户级别描述,这一点非常重要


因此,我并不惊讶它还没有开箱即用。除了自己修改代码之外,最好的办法可能是提交一个bug报告/功能请求。

编辑:这现在是一个Emacs。它已经扩展到一个成熟的小调模式。发展发生了

原职: 以下是我对雅各布答案的提炼。归功于他独创的魔法。我添加了一个覆盖变量,您可以使用它来防止在特定函数中使用
ido来完成读取。我还添加了一个检查,如果没有完成,则使用原始完成读取(这种情况偶尔发生,例如在
org memory apply template
from org mode中,这与Jacobo的原始建议不同)


哦,对于在M-x中使用ido,请使用。

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之外的所有东西,从subr执行扩展命令是最重要的(绑定到M-x的内容)。但是我们可以从M-x那里得到我们想要的

(global-set-key
 "\M-x"
 (lambda ()
   (interactive)
   (call-interactively
    (intern
     (ido-completing-read
      "M-x "
      (all-completions "" obarray 'commandp))))))

使用Emacs24.3,ido不适合我。因此,我们尝试了这个方法,到目前为止效果良好:

(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 completing read
,然后在
ido completing read
周围放置一个
defadvice
,在ido期间恢复原始的
完成读取
。这是相当粗糙的,而且可能不值得。似乎在Emacs 23.2中已经被破坏了。将ido cur项替换为ido cur列表似乎可以使其再次工作。ido-Ubious现在可以与最近的Emacsen配合使用,因为Ryan重写了它。
(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))))
(global-set-key
 "\M-x"
 (lambda ()
   (interactive)
   (call-interactively
    (intern
     (ido-completing-read
      "M-x "
      (all-completions "" obarray 'commandp))))))
(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)