是否有一个支持模糊完成的shell,如Sublime Text?


10

我正在使用bash,我想知道bash或其他shell中是否有任何插件允许我这样做 cat tfnislong.txt + [tab] 完成了 cat ThisFileNameIsSoLong.txt 就像Sublime Text中的制表符完成一样。


为什么不这样做呢 cat Th + tab
daviewales

Answers:


9

我知道 https://github.com/mgalgs/fuzzy_bash_completion 这是一堆用于的shell函数 complete

我想我们可能会做得更好,但更简洁。是时候破坏你的.bashrc或.profile ......

我们使用的基本钩子是这样的:

complete -o nospace -o filenames -F fuzzypath cd ls cat

-F选项意味着使用shell函数进行制表符完成,其中的选项设置在 COMPREPLY 变量。例如:

function fuzzypath() {
    if [ -z $2 ] 
    then
        COMPREPLY=( `ls` )
    else
        DIRPATH=`echo "$2" | gsed 's|[^/]*$||'`
        BASENAME=`echo "$2" | gsed 's|.*/||'`
        FILTER=`echo "$BASENAME" | gsed 's|.|\0.*|g'`
        COMPREPLY=( `ls $DIRPATH | grep -i "$FILTER" | gsed "s|^|$DIRPATH|g"` )
    fi
}

哪里 DIRPATH 就是你输入的最后一个/你的路径之前的一切 BASENAME 是光标当前的位置。

FILTER 是模糊的来源。基本上,采取 BASENAME 并插入一个 .* 每个字母之间产生我们的模糊正则表达式。

其余的只是将正则表达式与ls相结合来制作 COMPREPLY。你可能会在这里找到更多聪明的事情,也许还有 find

我也找到了 http://fahdshariff.blogspot.com/2011/04/writing-your-own-bash-completion.html 有用。


5

你可能会发现 FZF 有用。它是一个用Ruby编写的通用模糊查找器,可以用于任何事物列表:文件,进程,命令历史,git分支等。

它的安装脚本将设置 CTRL-T 你的shell的键绑定。以下GIF显示了它的工作原理。


FZF很棒!非常感谢您的贡献。这节省了我数周的工作。当我幸运地找到FZF时,我开始为Bash写模糊完成。它工作得很完美,我只需要记住在调用之前保存光标位置 fzf ..(tput sc)以后再恢复它 tput rc..
Håkon Hægland

3

要继续您的其他答案,您可能需要查看zsh。它向后兼容bash,因此您可以将其用作替代品,但它支持显着扩展的功能,其中一个功能大大增强了上下文感知选项卡的完成。

zsh完成常见问题解答 扩展了用例,但我相信根据你的例子,你最感兴趣的是 COMPLETE_IN_WORD 功能。这不是理想的行为,但它很接近。重点是,有很多方法可以以比使用bash更平易近人的方式扩展基本功能。

这是一个模糊匹配扩展,可以更接近您想要的内容; zsh-fuzzy匹配

对于一些想法,你可以看看流行的 哦,我的-的zsh 框架,具有许多用于管理zsh和扩展它的功能。这很可能比你想要的更多,但在插件下你会注意到各种角色的自动完成脚本。了解功能。

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.