在 bash 或 zsh 中设置路径的制表符补全以类似于 tcsh

在 bash 或 zsh 中设置路径的制表符补全以类似于 tcsh

我是一个长期的 tcsh 用户,但是现在所有酷孩子似乎都在使用 bash 或 zsh(也就是说,git 或其他东西的完成模式可用于 bash 和 zsh,而很少用于 tcsh)。

我的问题是,这两个 shell 的路径制表符补全行为都让我抓狂,而且我很难找到如何根据自己的喜好进行更改。

下面是一些我在 tcsh 中习惯做的与其他人做的不同的事情的例子:

  • /u<TAB>完成至/usr/
  • 然后选项卡列出了/usr/
  • /usr/li<TAB>完成/usr/lib并列出lib/libexec/
  • 再次按下 Tab 键即可完成/usr/lib/
  • 第三次按下 Tab 键会列出内容/usr/lib/

在 bash 中,无论我按多少次 tab 键,它都不会超过/usr/lib,要求我输入斜线,而这是我不想做的。

在 zsh 中,/usr/li<TAB>首先完成到/usr/lib,然后另一个 tab 列出lib/libexec/,第三次 tab 完成到/usr/lib/,并且所有后续 tab 在/usr/lib/和之间循环/usr/libexec/。我不知道如何越过这一点。我只想从 到/usr/li/usr/lib然后/usr/lib/,然后列出其内容。

python 也是如此。在 tcsh 中,我输入pyt<TAB>,它会补全到python并列出pythonpython2.5python2.6等,然后第二个 tab 会显示 python 并添加空格。在 bash 中,它要求我输入空格,而在 zsh 中,它会像第一个示例一样无限循环。

任何有关驯服这些外壳的帮助都将不胜感激。在解决上述问题之前,我真的不想花时间调整这些外壳的其他方面。

答案1

很好地准确描述了您的要求,但如果存在歧义,我不确定我是否真正理解您想要做什么,例如之后/usr/lib,您希望Tab密钥做什么。

如果我尝试 tcsh,在 之后/usr/libTab键仅列出liblibexec。您可以在 zsh 中使用 重现此效果setopt no_auto_menu,但这可能会以您不喜欢的方式改变行为。如果您也这样做setopt rec_exact,行为看起来就像您描述的一样:在 之后/usr/liTab插入b,然后另一个Tab插入/,第三个列出 中的补全/usr/lib/

zsh 补全选项已记录在“完成”下man zshoptions

答案2

对于 bash:在您的~/.inputrc输入中:

set show-all-if-unmodified  on

相关内容