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)