在当前目录中,如果我们有一个 C++ 源文件hello_world.cpp
和相应的已编译可执行二进制文件hello_world
,我希望具有 bash 的自动完成功能,以完全忽略(即避免呈现)可执行文件的文件名 vim
、vi
、nano
和nvim
(以及less
、cat
、more
、nl
、head
等tail
)命令。
即按TAB
后vim 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