终端-自定义文件名部分补全需求,解决通配符多文件匹配问题
实现自定义Tab补全解决精准文件名匹配需求
我太懂这种痛点了——输长文件名麻烦到崩溃,通配符又容易误匹配多个文件,碰到只支持单参数的程序直接报错。咱们用Bash的可编程补全就能完美解决这个问题,让你输入关键词按Tab就能精准补全到目标文件。
步骤1:编写自定义补全函数
首先,咱们写一个针对evince的补全函数,它会根据你输入的关键词,精准筛选出匹配的PDF文件(你可以按需改成其他格式):
_evince_custom_completion() { # 获取当前正在输入的参数内容 local cur=${COMP_WORDS[COMP_CWORD]} # 只处理evince的第一个参数(也就是文件名参数) if [ $COMP_CWORD -eq 1 ]; then local matches # 筛选包含当前关键词的PDF文件,同时处理带空格的文件名 mapfile -t matches < <(ls -1 *.pdf | grep -F "$cur") # 生成补全候选列表 COMPREPLY=($(compgen -W "${matches[*]}" -- "$cur")) fi }
这里的grep -F是把关键词当作纯文本匹配,避免正则表达式的干扰;mapfile用来处理带空格的文件名,防止补全时把空格当成参数分隔符。
步骤2:绑定补全函数到evince
写完函数后,把它和evince命令绑定:
complete -F _evince_custom_completion evince
步骤3:让设置永久生效
把上面两段代码加到你的~/.bashrc或者~/.bash_completion文件里,然后执行以下命令让设置立即生效:
source ~/.bashrc
效果演示
现在你输入evince first<tab>,如果当前目录只有2017-10-16-first_lesson.pdf这一个包含first的PDF,它会直接补全成完整命令;如果有多个匹配文件,按Tab会列出所有候选,你可以继续输入更精准的关键词缩小范围,完全不会出现通配符一次性打开多个文件的问题。
扩展优化
如果你想给其他程序也加这种自定义补全,只需要复制上面的函数,改个名字(比如_firefox_custom_completion),把筛选的文件格式改成你需要的(比如*.html),然后绑定到对应的命令就行。
内容的提问来源于stack exchange,提问作者Pado
相关产品推荐
相关产品推荐

