我正在使用 bash,我想知道 bash 或其他 shell 中是否有任何插件可以让我执行此操作
cat tfnislong.txt
+[tab]
完成,cat ThisFileNameIsSoLong.txt
就像 Sublime Text 中的制表符补全一样。
答案1
我知道https://github.com/mgalgs/fuzzy_bash_completion这是一组与之一起使用的 shell 函数complete
。
不过,我认为我们可以做得更好,更简洁一些。是时候打开你的 .bashrc 或 .profile 了……
我们使用的基本钩子是这样的:
complete -o nospace -o filenames -F fuzzypath cd ls cat
-F 选项表示使用 shell 函数进行制表符补全,其中选项在变量中设置COMPREPLY
。例如:
函数模糊路径(){ 如果[-z $ 2] 然后 COMPREPLY=(`ls`) 别的 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”`) 菲 }
DIRPATH
您所输入的路径上的最后一个 / 之前的所有内容以及BASENAME
您的光标当前所在的位置。
FILTER
这就是模糊性出现的地方。基本上,在每个字符之间取一个BASENAME
并插入一个,.*
以生成我们的模糊正则表达式。
剩下的只是将正则表达式与 ls 结合起来生成COMPREPLY
。您可能会发现这里有更多巧妙的事情要做,也许使用find
。
我还发现http://fahdshariff.blogspot.com/2011/04/writing-your-own-bash-completion.html才有用。
答案2
你可能会发现陣陣很有用。它是用 Ruby 编写的通用模糊查找器,可用于任何事物列表:文件、进程、命令历史记录、git 分支等。
它的安装脚本CTRL-T
将为您的 shell 设置键绑定。以下 GIF 显示了它的工作原理。
答案3
为了与您的其他答案保持一致,您可能需要研究 zsh。它向后兼容 bash,因此您可以将其用作替代品,但它支持显着扩展的功能,其中之一是大大增强了上下文感知制表符补全。
zsh 补全常见问题解答扩展了用例,但我相信根据您的示例,您最感兴趣的是该COMPLETE_IN_WORD
函数。它不是理想的行为,但很接近。重点是有很多方法可以以比使用 bash 更易于理解的方式扩展基本功能。
这是一个模糊匹配扩展,可以更具体地近似您的需求; zsh-模糊匹配
你可以看看流行的哦我的天啊框架具有许多用于管理和扩展 zsh 的功能。很可能它比您想要的要多,但在插件下,您会注意到各种角色的自动完成脚本。了解功能。