【问题标题】:How to add fuzzy completion (like Sublime Text palette) to ZSH如何将模糊补全(如 Sublime Text 调色板)添加到 ZSH
【发布时间】:2014-02-05 16:21:41
【问题描述】:

我通过 shell 从 bash 更改为 zsh,我想知道这是否可以像使用 Sublime Text 调色板一样模糊完整的命令。我认为这种寻找、完成的概念必须无处不在。这样可以节省大量时间。

示例

cd dcmts -> cd Documents

cd dwnls/mnf -> cd Downloads/MyNewFolder

我看到了下面这个项目,并没有真正令人信服。

zsh-fuzzy-match

似乎可以定义一些设置或算法来配置 zsh 在完成时的行为。

zstyle ':completion:*' completer _complete _match _approximate

zstyle ':completion:*:match:*' original only

zstyle ':completion:*:approximate:*' max-errors 10 numeric

前两种解决方案的问题是文件夹在完成时不会出现在列表顶部,而这通常是用户想要的。

如果你有任何有趣的.zshrc 来统计模糊搜索,那会很有趣。

感谢您的帮助。

【问题讨论】:

    标签: zsh sublimetext fuzzy-search


    【解决方案1】:

    试试这个

    zstyle ':completion:*' matcher-list 'r:[[:ascii:]]||[[:ascii:]]=** r:|=* m:{a-z\-}={A-Z\_}'
    

    进入您的zshrc。它完全符合您的要求,并且针对zsh 自己的补全系统执行此操作,而不是针对外部补全系统。

    【讨论】:

    • 你能详细解释一下“matcher-list”后面的参数吗?经过短暂的测试(使用ls)后它似乎可以工作,但有一些小故障:绝对路径未完成,子目录中的匹配项显示在完成列表中但从命令行中删除,例如cd / 然后ls etc/p<tab> 列出了 /etc 中的一些文件,它们的名称中有一个 p 但我的命令行设置为 ls etc/
    【解决方案2】:

    我建议您查看fzf,这是一个通用的模糊查找器,可以处理来自标准输入的行。它是用 Ruby 编写的,而不是 zsh 脚本,所以它可能不是你想要的,但就像 zsh-fuzzy-match 一样,它为你的 shell 设置了 CTRL-T 绑定,并且自定义它的行为非常简单。

    下面的 GIF 展示了它的工作原理。

    编辑:

    fzf 完全用 Go 重写,现在带有用于 zsh 和 bash 的 fuzzy completion support

    【讨论】:

    • 这是一部好作品。我正在等待为 zsh 开发模块。开发人员似乎在等待拉取请求。感谢这个目的。
    【解决方案3】:

    您能否举例说明完成时文件夹没有出现在列表顶部似乎你的配置中有一些东西会破坏你的东西。 Zsh 默认只会用目录完成cd

    zsh -f # new Zsh with only default configs
    % zstyle ':completion:*' completer _complete _match _approximate
    % zstyle ':completion:*:approximate:*' max-errors 3 numeric
    % mkdir test && cd test
    % mkdir etc && touch et0
    % autoload -U compinit && compinit 
    % cd et0[TAB] # removes the 'et0' and replaces it with 'etc'.
    

    FWIW,对于“到处搜索和完成”,请考虑尝试 predict https://stackoverflow.com/a/17230878/766289(我觉得这有点疯狂......)

    此外,在 Zsh 中,您可以执行以下操作:

    setopt auto_cd
    alias -d build=/home/foo/very/long/path/build # dir alias
    build # <-- changes into /home/foo/very/long/path/build
    

    或者只是

    zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match upper from lower case
    cd d/m[TAB] # just type the initial letter of each dir
    cd Downloads/MyNewFolder
    

    我的意思是cd d/mcd dwnls/mnf 需要更少的输入;-)

    【讨论】:

    • 事实上,文件夹并没有出现在顶部,因为我没有输入 cd 命令,而只是输入了文件夹名称。所以这是正常的。你完全正确,cd d/mcd dwnls/mnf 快得多。我会尝试使用它。预测解决方案真是太棒了。我喜欢它,谢谢;)
    • 问题是按照你的第一个例子cd abc[TAB]也完成到cd etc/。对我来说,这不太有用,因为我经常发现它在纠正方面过于激进。您确实有一定程度的调整,但我认为这并不是问题所希望的模糊匹配。
    猜你喜欢
    • 2014-01-14
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 2017-02-11
    • 2014-04-06
    • 2023-03-18
    相关资源
    最近更新 更多