我刚刚开始使用 vim 的 Command-T 插件,它很棒。如果你还没听说过它,它允许你输入如下内容:
Sb
从列表中选择 Something.hs-boot
src/project/Control/Whatever/Foobs.hs
src/project/Control/Whatever/Something.hs-boot
src/project/Control/Whatever/Something.hs
等等。
我想知道我是否可以使用类似的自动完成样式来处理 zsh。我知道 shell 的完成不可能像 vim 的完成那样广泛,因为 shell 的完成可能不应该在你每次输入字母时搜索整个系统,但有没有类似的完成方式,至少我可以输入
s/p/c/w/Sb<tab>
并获得与上面类似的效果?
我听说 zsh 具有相当好的可编程自动完成功能,但我的 shell-fu 相当弱。
有人知道如何设置吗?
答案1
要完成部分路径,只需初始化完成系统就足够了(至少在我的系统上,使用zsh v4.3.17
):
autoload -U compinit && compinit
zmodload zsh/complist
如果你想要更花哨一点,你可以让匹配不区分大小写:
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'
更新 1:
我不知道你是否可以实现 Command-T 风格的自动完成功能……但由于 zsh 必须全部在显示某些内容之前进行匹配,动态执行此操作(尤其是在具有大量子目录/文件的地方)可能不可行。
但是你可以使用:
**/*thing <Tab>
匹配**
当前目录的所有文件和子目录。
主意: 如果它不必是最新的文件列表,您可以编写一个使用输出locate
(即预先计算的文件列表)的完成函数
更新 2: https://github.com/junegunn/fzf#fuzzy-completion-for-bash-and-zsh
答案2
另一个有趣的选择是使用类似胎儿发育不全症。