Shell 模式的 Tab 补全

Shell 模式的 Tab 补全

在我的 Debian 服务器上,我习惯按 Tab 来“预览” shell 模式的扩展:

$ cp *some*<Tab>
something  somewhat  have-some-cake
$ cp *some*_

当模式扩展为一个条目时,Tab 会用实际条目替换模式;否则会显示匹配条目的列表。这很直观且有用,因为它与常规“前缀”Tab 补全一致。

但我的 Ubuntu 服务器和桌面表现不同:即使扩展到多个条目,Tab 用第一个条目替换模式。

我检查了常见的嫌疑犯(/etc/bash.bashrc、/etc/inputrc 和本地版本),但没有发现任何区别。

有人知道哪个设置控制这种行为吗?

答案1

相反另一个答案特定问题可能是使用 bash-completion 的直接结果。bash-completion 包有几个错误(如这个 U&L 答案例如,关于类似的问题)。

如果我在我的代码中注释掉这一部分.bashrc

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

并启动一个新的 bash 实例,然后我得到:

$ echo *o*<tab><tab>
foo     food    foo.sh  
$ echo *o*

然后,如果我/usr/share/bash-completion/bash_completion像在以下位置一样获取脚本.bashrc

$ . /usr/share/bash-completion/bash_completion
$ echo foo

立即自动*o*完成,foo而不显示其他匹配。

顺便说一下,我使用的是 16.04。我不知道这个问题在新版本中是否已经修复。

$ dpkg-query --show --showformat='${Package} ${version}\n' bash bash-completion
bash 4.3-14ubuntu1.2
bash-completion 1:2.1-4.2ubuntu1.1

答案2

Bash 中更智能的制表符补全需要该bash-completion包。

sudo apt install bash-completion

Bash 补全实际上是 Debian 直接编写和维护的。
(另请参阅其Debian 软件包Ubuntu 软件包页。

一旦安装完成,它就会自动加载(例如通过/etc/bash.bashrc),或者您需要使用~/.bashrc如下节指示 Bash 在您的程序中加载它:

if [[ -z "$BASH_COMPLETION" ]] && [[ -r /etc/bash_completion ]]; then
  . /etc/bash_completion
fi

在 Red Hat 和其他公司包含此软件包之前,我曾经/etc/bash_completion*在系统之间手动复制。虽然这样做效果很好,但我不建议这样做;它还会剥夺您的软件包管理器更新现有补全并安装新补全的机会(/usr/share/bash-completion/completions/尽管它们最初与您的自定义补全一起存在,但现在已进入/etc/bash_completion.d/)。

相关内容