如何从bash autocomplete中删除单个命令



如何删除单个"命令";从Bash的自动完成命令建议?我问的是自动完成中的第一个参数,即命令,而不是问"如何为特定命令的参数禁用bash自动完成">

例如,如果我有命令ls,系统路径也找到ls_not_the_one_I_want_ever,并且我键入ls,然后按tab键,我想要一种方法从每个可行的选项中删除ls_not_the_one_I_want_ever

我认为这可能与compgen -c列表有关,因为这似乎是可用的命令列表。


背景:Windows上的WSL将所有.dll文件放在我的路径上,除了应该在那里的.exe文件之外,因此我有许多我想在bash环境中删除的dll,但我不确定如何进行。

Bash 5.0的complete命令为此添加了一个新的-I选项。

根据man bash-

  • 完成公关[一些][名称…]

    […-I选项表示其他提供的选项和动作应该应用于初始非赋值字的补全或在命令分隔符(如;|)之后,通常是命令名称完成. […]


例子:

function _comp_commands()
{
local cur=$2
if [[ $cur == ls* ]]; then
COMPREPLY=( $(compgen -c "$cur" | grep -v ls_not_wanted) )
fi
}
complete -o bashdefault -I -F _comp_commands

使用@pynexj的答案,我想出了下面的例子,似乎工作得很好:

if [ "${BASH_VERSINFO[0]}" -ge "5" ]; then
function _custom_initial_word_complete()
{
if [ "${2-}" != "" ]; then
if [ "${2::2}" == "ls" ]; then
COMPREPLY=($(compgen -c "${2}" | grep -v ls_not_the_one_I_want_ever))
else
COMPREPLY=($(compgen -c "${2}"))
fi
fi
}
complete -I -F _custom_initial_word_complete
fi

最新更新