Answers:
我知道 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 有用。
你可能会发现 FZF 有用。它是一个用Ruby编写的通用模糊查找器,可以用于任何事物列表:文件,进程,命令历史,git分支等。
它的安装脚本将设置 CTRL-T
你的shell的键绑定。以下GIF显示了它的工作原理。
fzf
..(tput sc)以后再恢复它 tput rc
..
要继续您的其他答案,您可能需要查看zsh。它向后兼容bash,因此您可以将其用作替代品,但它支持显着扩展的功能,其中一个功能大大增强了上下文感知选项卡的完成。
zsh完成常见问题解答 扩展了用例,但我相信根据你的例子,你最感兴趣的是 COMPLETE_IN_WORD
功能。这不是理想的行为,但它很接近。重点是,有很多方法可以以比使用bash更平易近人的方式扩展基本功能。
这是一个模糊匹配扩展,可以更接近您想要的内容; zsh-fuzzy匹配
对于一些想法,你可以看看流行的 哦,我的-的zsh 框架,具有许多用于管理zsh和扩展它的功能。这很可能比你想要的更多,但在插件下你会注意到各种角色的自动完成脚本。了解功能。
cat Th
+tab
?