如何实现目录树可执行文件的Bash自动补全(结合fzf)
覆盖Bash中./的默认补全,实现可执行文件交互式选择(结合fzf)
问题核心
complete -F __compl_foo './'无法生效的原因是:Bash不将./识别为独立命令,而是把它当作路径前缀的一部分,默认调用文件补全逻辑,因此无法直接通过complete命令针对./注册补全函数。
解决方案:重写路径补全函数
通过修改Bash默认的文件补全函数_filedir,实现对./开头输入的特殊处理,结合fzf完成交互式选择:
- 备份并重写
_filedir函数
# 备份原始的文件补全函数 _filedir_orig=$(declare -f _filedir) # 重写_filedir,优先处理./开头的可执行文件补全 _filedir() { # 仅处理以./开头的补全请求 if [[ "${COMP_WORDS[COMP_CWORD]}" == ./* ]]; then # 查找当前目录及子目录下的可执行文件(排除隐藏文件/目录) # 若需包含Windows可执行文件(.exe),可添加 `-o -name "*.exe"` 到find条件中 local execs execs=$(find . -type f -executable ! -name ".*" | grep -v '/\.' | sort) # 用fzf交互式选择 local selected selected=$(echo "$execs" | fzf --height=40% --reverse --prompt="选择可执行文件: ") # 设置补全结果 if [[ -n "$selected" ]]; then COMPREPLY=("$selected") return 0 fi fi # 非./开头的输入,调用原始补全逻辑 $_filedir_orig "$@" }
- 生效配置
将上述代码添加到~/.bashrc或~/.bash_profile中,执行source ~/.bashrc即可生效。
优化建议
- 限制查找深度:在find命令中添加
-maxdepth N(N为数字),避免遍历过深的目录 - 无fzf fallback:如果未安装fzf,可替换为直接输出可执行文件列表作为补全选项:
COMPREPLY=($(compgen -W "$execs" -- "${COMP_WORDS[COMP_CWORD]}"))
内容的提问来源于stack exchange,提问作者glades
相关产品推荐
相关产品推荐

