如何从 bash 自动完成中删除单个命令

How to remove a single command from bash autocomplete

如何从 Bash 的自动完成命令建议中删除单个“命令”?我问的是第一个参数,命令,自动完成,而不是问“How to disable bash autocomplete for the arguments of a specific command

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

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


背景:Windows 上的 WSL 将所有 .dll 文件放在我的路径上,除了应该在那里的 .exe 文件,所以我有很多 dll想在我的 bash 环境中删除,但我不确定如何继续。

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

根据man bash

  • complete -pr [-DEI] [name ...]

    [...] The -I option indicates that other supplied options and actions should apply to completion on the initial non-assignment word on the line, or after a command delimiter such as ; or |, which is usually command name completion. [...]


示例:

function _comp_commands()
{
    local cur=

    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 "" | \grep -v ls_not_the_one_I_want_ever))
      else
        COMPREPLY=($(compgen -c ""))
      fi
    fi
  }

  complete -I -F _custom_initial_word_complete
fi