对特定命令和特定文件类型的组合禁用 bash 自动完成

对特定命令和特定文件类型的组合禁用 bash 自动完成

在当前目录中,如果我们有一个 C++ 源文件hello_world.cpp和相应的已编译可执行二进制文件hello_world,我希望具有 bash 的自动完成功能,以完全忽略(即避免呈现)可执行文件的文件名 vimvinanonvim(以及lesscatmorenlheadtail)命令。

即按TABvim hello_wor应立即继续完成 C++ 源文件名。

我们怎样才能实现这种行为?

答案1

您可以为这些命令编写自己的可编程完成函数,让我们调用它_cpp并设置它

complete -F _cpp vim vi nano nvim less cat more nl head tail

我现在不编写整个函数,但您将生成(并丢弃)这样的匹配:

files=( $(compgen -f hello_) )
COMPREPLY=()
for word in "${files[@]}"; do
    if [[ $word = *.cpp ]]; then
        COMPREPLY+=("$word")
    else
        if [[ ! -f "${word}.cpp" ]]; then
            COMPREPLY+=("$word")
        fi
    fi
done

由此touch hello_world hello_world.cpp hello_world2给出:

echo ${COMPREPLY[@]}
hello_world.cpp hello_world2

相关内容