我是一个长期的 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
并列出python
、python2.5
、python2.6
等,然后第二个 tab 会显示 python 并添加空格。在 bash 中,它要求我输入空格,而在 zsh 中,它会像第一个示例一样无限循环。
任何有关驯服这些外壳的帮助都将不胜感激。在解决上述问题之前,我真的不想花时间调整这些外壳的其他方面。
答案1
很好地准确描述了您的要求,但如果存在歧义,我不确定我是否真正理解您想要做什么,例如之后/usr/lib
,您希望Tab密钥做什么。
如果我尝试 tcsh,在 之后/usr/lib
,Tab键仅列出lib
和libexec
。您可以在 zsh 中使用 重现此效果setopt no_auto_menu
,但这可能会以您不喜欢的方式改变行为。如果您也这样做setopt rec_exact
,行为看起来就像您描述的一样:在 之后/usr/li
,Tab插入b
,然后另一个Tab插入/
,第三个列出 中的补全/usr/lib/
。
zsh 补全选项已记录在“完成”下man zshoptions
。
答案2
对于 bash:在您的~/.inputrc
输入中:
set show-all-if-unmodified on