[emacs] 用 ido 或 anything 进行选择

本文详细介绍了如何在Emacs中利用ido-mode和anything这两个扩展包来提高选择buffer、文件和目录的效率。通过它们提供的备选项列表和便捷的交互方式,用户可以在多种操作中节省时间,提升工作流程。此外,文章还对比了这两个工具的特点,如ido的缓冲区模式和anything的多关键字匹配功能,并推荐了适用于不同场景的使用建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在任何一个编辑器中穿梭时,充满了选择:转到哪个buffer, 打开哪个文件,跳到哪个窗口,定位哪个函数,设置哪个选项。。。比如在Emacs里面,俺C-x b之后它就让我输入一个buffer 名,虽然它都知道有哪些buffer, 但还是让我输,少输入几个字母敲了回车,结果它给我新创建了一个buffer ! 真是相当不给力啊。

ido/anything 这样的扩展就是把备选项直接给你列出来,你可以输入几个字来缩小备选范围,也可以用其它键来导航、选择。


ido - interactively do things with buffers and files

当你在 Emacs 中穿梭,ido-mode 有助于提高你的效率:通过M-x ido-mode打开后,在切换buffer(C-x b 或者M-x switch-buffer), 打开文件(C-x C-f 或者M-x find-file),打开目录浏览(C-x d 或者M-x dired)时,它会在minibuffer中列举出备选项,方便你选择(可以部分匹配,可以用左右键选择上一个/下一个备选项等等)。



ido-mode其实是ido风格的一个应用,ido目的很简单,就是提供一种从列表中选择一个备选项的方法,你也可以在自己的扩展中调用ido-completing-read来获取用户的选择

     (setq mylist (list "red" "blue" "yellow" "clear" "i-dont-know"))
     (ido-completing-read "What, ... is your favorite color? " mylist)


(Emacs原本在swtich-buffer/find-file时使用自己completing-read函数,只不过风格不同:不是预先列举出备选项,而是得用tab键来补全。)

虽然在GNU Emacs 22时ido就已经被收录进去了,但GNU Emacs Manual中没有相应的文档说明,想要了解的话还是到EmacsWik去看吧: EmacsWiki: Interactively Do Things。该页面还提供了一些用ido-completing-read 实现的扩展,比如M-x 时列出所有命令、idomenu 列出所有函数名并跳转等。


anything - open anything / QuickSilver-like candidate-selection framework

anything 的基本能力跟 ido 很类似,也是列举备选项供用户选择,差异在于:

  1. 用一个临时buffer来列举备选项,每行一个(而ido是在minibuffer中)
  2. 缺省不改变find-file, switch-buffer 等命令的行为,而是用单独的命令激活(比如M-x anything-find-files或者<f5> a C-x C-f )
  3.  匹配备选项时支持多个关键字(用空格隔开)
  4. 有不少地方是先选择被操作的内容,然后选择操作,比如M-x anything-find-files 是先列举文件供选择,按<tab>后再选操作(打开文件、比较文件、拷贝/删除/复制文件、转到dired中查看、将eshell转到相应目 录等等)
  5. 自带了很多source,也就是选择/补全之上要完成的具体功能,不仅仅有切换buffer, 打开文件, recentf, kill-ring, imenu这些编辑器相关的内容,还有apt, gentoo, world-time, firefox-bookmarks等方面的功能



相对ido 我更喜欢anything,比如我原本喜欢在find-file时输入M-0 C-k来删除当前内容(即用做缺省值的当前路径),然后自己手工输入d:/或者~/之类的,但ido-mode下你没法删掉开头的"d:/",导致你不知 道怎么输入"c:/"下的一个目录(网上查了一下才知道,原来你可以随时输入d:/或者~/);内容太多了也难以查找(而anything支持多个关键 字,并且有插件anything-match-plugin可扩展匹配方式)。

对于上面第二点,如果你不想这样,反而期望类似ido- mode那样,在C-x b切换buffer, C-x C-f 打开文件时就用anything来选择,那么可以使用anything-complete这个扩展,它比ido-mode还多了M-x命令, M-x set-variable时的选择/补全 (但没有C-h v, C-h f, C-h p时的补全)。

anything 并不包含在GNU Emacs 官方版中,想装的话可以到EmacsWiki: Anything下载, 其中anything.el 和anything-config.el 是基本部分。

icicles - Minibuffer input completion and cycling.

似乎 icicles 也有类似的功能,并且提供了很多种匹配方式,也提供了icicle-completing-read 替代 completing-read,不过我没有用过这个包,以后再补充说明吧。

总结
虽然有的地方会使用“补全”这个词来描述这几个包的功能,但这跟代码补全还是有点不一样,代码补全一般是由用户输入了一个前缀,补全引擎根据前面的部分去找后面的部分,Emacs上的代码补全包主要有auto-complete, company, completion-ui 等包,尤其是auto-compete和company有漂亮的弹出式备选框,自动根据前面输入的内容触发,跟众多IDE粉丝的期望比较一致。
(当然"清纯版"Emacs也有hippie-expand和completion-at-point (缺省绑定到M-TAB),尤其是后者在Emacs 24中得到了增强,不仅支持elisp, python, tex, irc, semantic补全,还可以通过实现completion-at-point-functions 来扩展)

但ido/anything这种补全跟代码补全并没有绝对的分界线,anything就有php-completion, anything-etags, anything-complete等扩展用来补全代码(虽然后者基本上只支持elisp代码),还有ac-anything这种将auto-complete做为备选项来源的扩展。从这个角度来看 ido、anything 都只是一种选择备选项的风格,侧重在用户交互上。

如果要在自己写的扩展中让用户从一堆备选项中选择一个,如果备选项比较少,建议使用ido (比如这个ido-jump-to-window使用ido就很合适,一般用户在整个frame 上能有几个window呢?);而如果备选项比较多,用户可能需要用多个关键字搜索或者模糊搜索,则可以使用anything,比如整个工程的tags。至于代码补全,就看熟悉哪个、喜欢哪个了(回头有空来比较一下几个代码补全包)。

转载于:https://www.cnblogs.com/bamanzi/archive/2011/04/22/choose-with-ido-or-anything.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值