Emacs的Command-T插件是什么?

6
我是一位长期使用Emacs的用户,但在两年前部分转向MacVim,并一直将其用于所有编程工作(仍然使用Emacs进行其他操作)。现在我决定回到Emacs,主要是因为强大的evil-mode。我很满意,但我仍然没有找到像Vim Command-T插件一样好用且简单的东西。
Emacs替代品的主要问题是它们要么太复杂,要么太慢。
最接近Command-T的东西是helm/helm-cmd-t,但它的使用方式不太相同。
假设你有两个路径:
  • app/controllers/admin/feedback_controller.rb
  • app/controllers/fee_controller.rb
在Vim的Command-T中,你可以写:
app/controllers/fe

它将匹配两个路径。

使用 helm-cmd-t,如果我写 app/controllers/fee,它只会匹配 fee_controller。如果我想匹配两个,我必须使用正则表达式,如 app/controllers/.*,这并不是那么糟糕,但需要更多的按键。

任何建议都将受到赞赏!


1
你尝试使用空格而不是斜杠进行搜索了吗?据我所知,helm 默认使用空格进行惰性匹配(我记得在某个地方读过匹配算法可插拔,因此也可能有其他实现),因此你可以尝试在单词之间使用空格。如果搜索是关于匹配路径中的单词,则输入斜杠是多余的,因此你可以使用空格代替斜杠并查看发生了什么。 - Tom
Vim的命令-t与Sublime Text 2的搜索功能相似。Emacs本身没有类似的功能。我很快就会尝试使用正则表达式实现helm-cmd-t - event_jr
1
似乎你想要找到一个部分路径的文件。你试过使用 helm-locate 吗?https://github.com/emacs-helm/helm/wiki#helmlocate - Amumu
在你的例子中,你可以在helm-locate中尝试这个正则表达式:app.*contr.*fe - Amumu
1
目前,只有flx + ido-mode + Projectile + ido-vertical可以正确地复制Cmd-T功能。它不使用.*或/或其他插入字符,可以允许您模糊匹配(快速)。请注意,目前没有任何东西实现Ctrl+P的多选特性。 - ocodo
8个回答

3

我最近开始使用flx配合ido-modeprojectile,它具有出色的模糊匹配功能,并且与Vim中的CtrlP和CmdT非常相似。

可以通过MELPA安装。

M-x package-install
flx

更多信息请查看flx项目

这里是一个截屏来说明...

flx模糊匹配


3

ido 不错,我喜欢它。我尝试了不同的选项,包括 Textmate 插件,它提供了一个使用 ido 的查找文件实现。然而,我已经习惯了 Command-T 渲染文件列表的方式 - 垂直堆叠。我想要一些模仿 Command-T 工作方式的东西。我真的觉得很惊奇,Emacs 没有像 Command-T 一样好、简单、快速的东西。 - FullOfCaffeine
要明确一点,我故意不喜欢ido对"flex"的简陋实现。Sublime Text 2的搜索功能非常出色。 - event_jr
1
@FullOfCaffeine:这是我得到垂直结果列表的方法 http://emacswiki.org/emacs/InteractivelyDoThings#toc20 - tungd
它有... :) 我刚刚安装了它,现在我使用的是“Alt+T”,而不是“Ctrl+P” :)... https://github.com/defunkt/textmate.el - pesho hristov

2
这是它,但需要先安装helm:https://github.com/emacs-helm/helm-cmd-t 编辑:请参阅我的Helm指南。阅读它为什么强大。在该部分中查看使用projectilehelm的示例。
使用类似于Ido + flx或其他Vim中的模糊搜索器,您必须按顺序输入内容。使用Helm,您可以执行无序匹配。我称之为无序,因为无论我输入“main.c x86”还是“x86 main.c”,我都会得到相同的结果集。但这也可以称为多步搜索。Helm让我更加自由,无需按顺序输入搜索字符串(称为“模式”,实际上是正则表达式),我可以首先输入我想要的内容,而无需记住其复杂路径;如果有许多目标候选项,我可以通过更多细节(模式)进一步缩小范围。
上面的例子说明了以上优势的两种情况:
1. 如果我的目标不唯一,那么我可以进一步缩小范围。 2. 如果我的目标是唯一的,我可以立即得到它。
正如您所看到的,Linux内核源代码树包含超过40k个文件,而我立即将其缩小到了几个文件。
Visual Studio也在其项目搜索中实现了这种机制,但它不如Helm那样通用。在Helm中,您可以重复使用相同的Helm接口进行许多其他操作;例如,请参见helm-semantic-or-imenu。您可以获得类似于大纲树的东西,但是您可以通过几个简单的模式交互式地和渐进式地缩小到想要的候选项。最后,提醒一下,flx作者Le Wang正在使用Helm。

@EmacsFodder 但是你正在使用Helm,它提供了一个更强大的界面。确实,您无法进行正确的模糊匹配,但您拥有更强大的功能:无序匹配,具有多个查询。使用模糊搜索器,您必须按顺序键入内容,但是使用Helm,例如,您可以先键入文件名的一部分,然后再键入路径。使用Ido,您永远无法做到这一点。 - Amumu
只需尝试使用我在答案中概述的解决方案,也可以在垂直模式下使用ido。您将不太关心Helm理论上如何完成此操作。您只需要高兴地发现它实际上运行得非常好。 - ocodo
@EmacsFodder 我已经从 Ido + flx + vertical-ido 切换到了 Helm,再也没有回头。由于我必须按特定顺序匹配候选项,因此它不够灵活;而且我还必须记住过去的候选项才能使模糊匹配生效。Helm 甚至可以在文件匹配之外使用,例如作为 带有大量候选项的自动补全界面,带有语法高亮; 或者 交互式搜索。我认为你应该尝试 Helm。而且正如我告诉过你的,flx 的作者也在使用 Helm - Amumu
我已经使用Helm很长时间来完成各种不同的任务,但是我猜Cmd-t插件是新的?我会查看你提供的链接。 - ocodo
@EmacsFodder 说实话,我从来不使用 helm-cmd-t,因为我已经在使用 projectileHelm。如果一个目录没有被版本控制,那么我会使用 helm-locate,它非常快速,因为它使用了 locate - Amumu
显示剩余2条评论

1

你试过 LustyExplorer 吗?它是基于 Vim 插件同名的。

另外,看起来你没有充分利用 Command-T 的功能:acfe 应该足以匹配这两个文件。你所做的并不比 :e app/con*/**/fe<Tab> 更好。


LustyExplorer(至少是emacs版本)与Command-T的工作方式不完全相同,因为我无法开始匹配深度嵌套的文件(例如您展示的带有“acfe”的示例,非常好用!),实际上我需要首先将其范围限定到一个目录中,这非常令人恼火。 - FullOfCaffeine
嗯,这可能就是我转用CtrlP的原因。不过,作为一个非Emacs用户,我无法再帮你更多了。 - romainl
没问题。顺便问一下,CtrlP是什么? - FullOfCaffeine
CtrlP类似于Command-T,但我认为更好。 - romainl

1

我曾经发现gpicker,它声称在速度方面优于Ido和其他“本地”elisp包。尽管我从未真正尝试过它在实际项目中的表现,但它可能适合你。


我过去使用过gpicker,它确实非常好。我可能会再次使用它,但我正在寻找能够在emacs窗口/框架内呈现的东西。 - FullOfCaffeine
@FullOfCaffeine,我很确定gpicker确实有一种模式,可以仅在Emacs缓冲区内进行交互...我想,我需要自己去验证一下。 - immerrr
更新:它并没有。真的很奇怪,竟然没有类似的东西存在。 - immerrr
这是。我有点失望。在其他方面,我更喜欢Emacs,但在这个方面,我仍然更喜欢Vim,只是因为Command-T-在我看来,这是最快速和最有效的搜索/选择文件。 - FullOfCaffeine
我已经浏览了gpicker的源代码,它看起来足够简单,我想我可能真的会有时间写一些东西出来... - immerrr

1
长话短说 - 对于Emacs来说,没有什么比command-T更好了。最佳选择是gpicker或Peepcode的peepopen,但它们是外部应用程序,而且在使用command-T很长时间后,我发现它们会分散注意力。目前,我会继续使用MacVim,只因为有command-T,但可能会考虑实现一个行为类似于command-T的东西作为练习。

感谢所有人的答案和评论!


1
现在这不是真的,尽管在2013年3月时是这样的。 - ocodo
@EmacsFodder 那会是什么? - FullOfCaffeine
根据@FullOfCaffeine的建议,您可以使用ido + flx或使用Helm。通过Helm,您可以在helm-mini(用于匹配缓冲区)或helm-find-files中进行模糊匹配。 - Amumu

0

0

https://github.com/bling/fzf.el

在我看来,这是目前最好的解决方案。以下是原因:

  1. 如果你在一个项目中,它使用projectile来确定项目根目录。
  2. 否则它会非常快速地对当前目录中的文件进行索引。
  3. 模糊匹配。
  4. 可以自定义(顶部或底部放置、记录数量等)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接