bash 中 cd 的通配符自动补全

bash 中 cd 的通配符自动补全

在 ubuntu (debian jessie/sid) 上使用 bash 我不知道为什么我不能完成通配符的 Tab 补全使用内置命令

例如,假设我当前的工作目录包含以下子目录。

% ls -l
drwxr-xr-x 2 userX 4096 2016-08-31 11:46:40 0830a/
drwxr-xr-x 2 userX 4096 2016-08-31 11:46:52 0830b/
drwxr-xr-x 2 userX 4096 2016-08-31 11:47:33 0831a/
drwxr-xr-x 2 userX 4096 2016-08-31 11:47:18 0831b/
drwxr-xr-x 2 userX 4096 2016-08-31 11:50:38 z0830z/

我可以在输入“ls -l *31a”后点击 [tab] 并完成完成。

ls -l *31a<tab>

完成到..

ls -l 0831a

但是,如果我尝试使用内置“cd”命令执行相同操作,它将无法完成。

cd *31a<tab>

..不会完成

此外,使用尾随通配符也会失败。

cd z*<tab>

..不会完成

有趣的是,没有通配符的补全对于内置函数来说是可以正常工作的。例如,我可以使此完成工作正常:

cd z<tab>

已完成至..

cd z0830z/

此外,我可以按原样使用“cd *31a”命令并使其成功(只要它是唯一的)。但我希望扩展能够发生,这样我就可以确定我要进入的内容。

我的 .inputrc 包含这个..

$if Bash
  Space: magic-space
  set mark-directories on
  set mark-symlinked-directories on
  set completion-ignore-case off
  set show-all-if-ambiguous on
$endif

我没有 ~/.bash_completion 文件。我确实有 /etc/bash_completion,它只提供 /usr/share/bash-completion/bash_completion 的源。后一个文件有点长,所以我不会将其包含在这里。

我的最终目标是能够为 cd 命令提供通配符补全工作。

答案1

我正在与同样的问题作斗争。正如 @Gilles 提到的,目前还没有真正的基于 bash 的解决方案。

由于bash-completion并没有真正添加太多功能cd(据我所知仅使用$CDPATH目录),因此如果您不使用它,那么您可以将其添加到您的~/.bashrc

compopt -o bashdefault cd

这会将完成的行为重置cd为默认值(通配符完成有效),并且不会更改任何其他内容。

相关内容