部分路径的类似Zsh的制表符完成


11

Vim中文件名的类似Bash的部分制表符完整相关

的真正奇妙功能之一zsh就是您可以键入,例如ls /u/s/m/m/who.1,按Tab并完成输入 ls /usr/share/man/man1/who.1.gz。一旦习惯了,回到真的很烦/u<tab>/s<tab>/m<tab>/m<tab>...,特别是当整个部分路径只能解析为一条实际路径,但是每个单独的组件可能有多个补全时。例如在使用:e或时,可以在Vim中实现:cd吗?

zsh中还有其他与路径有关的有用功能,例如用于使用替换cd foo bar为的等效路径(即变为)。如果有一个解决方案也可以引入这些(本质上是将与shell相关的任务移交给可以很好地完成这些任务的shell),那将是很好的。foobar/blah/foo/baz/yada/blah/bar/baz/yada


1
我不知道有什么能完全满足您的要求,但是有各种模糊文件查找器可以让您以类似方式打开文件。我喜欢CtrlP,但也有Command-T,而且我敢肯定还有其他我忘了它的名字了。
丰富

1
@Rich只要我不必十几次将Tab混搭,我就会很高兴。
muru

Answers:


6

在我真正发现vim的强大功能之前,我曾经大量使用CtrlP和其他相关插件。让我解释一些不需要外部插件的方法:

  1. :e,关于:e的好处是,您可以做类似的事情,:e /u*/s*/m*/m*/<Tab>而vim会自动将其扩展为:e /usr/share/man/man。这比您发布的内容短和简单得多,但是更好的方法是这样做:e /usr/**/man<Tab>,它将以递归方式查找/usr并列出所有匹配的路径,尽管这取决于集合的大小,但是这可能会花费一些时间,但是这个项目之所以起作用,是因为您可以做类似的事情:e ap**/jav**/user<Tab>,它将完成所有不完整的路径,并为您提供匹配路径的列表,并且效果非常好。
  2. :b,打开现有的缓冲区。这确实非常强大,因为它默认情况下接受部分内容,因此您可以执行类似的操作:b usr*man<Tab>,如果文件名已被加载到缓冲区列表中,它将完成文件名。这特别好,因为它几乎是即时且非常快。另外,在tpope / vim- obsessiondhruvasagar / vim- prosession的帮助下,我大量使用vim会话,这些会话将我打开的所有文件保留在缓冲区列表中,即使我存在vim并从项目目录。

1
/u*/s*/m*/m*/<Tab>这就是我过去解决bash的方式。它远远不能替代zsh。/usr/**/man<Tab>当您打开整个文件系统时,它非常慢,但是对于小型项目可能很有用。除非我误会:b,否则它不是用于打开新文件。
muru

@muru,您是对的,它不能替代zsh,但它比必须自己键入整个内容还要好,它是要使其变得更简单,**确实非常慢,但对于常规项目却很有用。:b是针对现有的开放缓冲区的,这就是使用会话有帮助的原因。
Dhruva Sagar'2

5

vim-zsh-path-completion旨在完全按照您的要求(至少是第一部分)进行操作,但我从未尝试过。(直到romainl与其作者的SO答案相关联时我才听说过它,尽管它的文档中也提到了一些限制。

除此之外,还有各种模糊文件查找器可以实现类似的打开文件功能。

我最喜欢的插件是CtrlP。当用于打开文件时,它将搜索所有包含完整路径的文件,这些文件包含按正确顺序键入的字符-您不必在输入路径的每个部分(以及所有路径分隔符)时键入在您的示例中具有,但是如果您这样做,则效果很好。它还使用相同的界面来打开最近使用的文件和当前打开的缓冲区,以及其他功能。

默认情况下,它<c-p>以常规模式映射以打开CtrlP提示符。提示会显示文件列表,当您输入字符时会缩小范围。您可以随时按Enter打开当前选择的文件,或使用<c-k><c-j>在当前匹配的文件列表中上下移动选择。

另一种流行的替代方法是Command-T,但我赞成CtrlP,因为它是在VimScript中实现的。Command-T具有Ruby组件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.