bash 按 <tab> 两次以完成文件名的行为

bash behaviour of pressing <tab> twice for filename completion

举个例子,假设我输入了姓名的一部分:

$ vi partn                         <= here I press <tab><tab>
partname     partnook     partnum  <= these are the results

这是 bash 中的标准行为,这很好,但我最近在 PowerShell 上做了很多工作,默认行为是,如果您按 Tab,它会循环遍历名称,完成每个name 然后再次按 tab 将转到下一个文件,所以如果我按一次 tab,我会看到 vi ./partname,然后再次按 tab,我会看到 vi ./partnook,然后再次按 tab 我会看到 [=16] =].我倾向于更喜欢这种行为,因为它不需要打字(您只需按 Tab 键循环浏览,直到获得所需的文件名或命令)。

当然,Linux 中的一切都可以自定义,所以有人可以建议我如何更改默认的 bash 行为以默认遵循上述行为吗?

要坚持使制表符补全需要两个制表符 keypresses 每当有多个匹配完成时,而不是 cycle 通过它们,in-line:

选项 A: 如果您已经拥有:

  • 一个/etc/inputrc文件(适用于系统范围,修改需要sudo
  • and/or 一个 ~/.inputrc 文件(用户特定)

and/or

您打算广泛自定义 Readline 库and/or 想要在 脚本 调用 read -e 时使自定义也有效:

添加行:

"\C-i": menu-complete

任一文件,具体取决于您希望设置对所有用户有效还是当前 用户(必要时创建文件)。

注意:或者,您可以简单地关闭需要按Tab 两次 显示标准行为立即,这意味着显示多列列表所有可能的补全,然后重新显示输入行,允许您输入额外的字符来完成论点或键入足够多的内容,以便下一个 Tab 按键明确完成:

set show-all-if-ambiguous on

选项 B: 或者,您可以将 Readline 命令添加到用户特定的初始化文件(~/.bash_profile 在 macOS 上,~/.bashrc 在 Linux 和其他类 Unix 平台),通过将它们作为 单个 参数传递给 bind builtin:

bind '"\C-i": menu-complete'

如果您更喜欢显示所有匹配行为:

bind 'set show-all-if-ambiguous on'

请注意,~/.bash_profile / ~/.bashrc 中的 bind 命令优先于 /etc/inputrc~/.inputrc 中的等效命令。

如上所述,以这种方式配置 Readline 不会 在调用 read -e 以激活的 脚本 中生效Readline 支持读取用户输入。