0

问题:我有一个问题显然没有被Stack Overflow 上这个已经问过的 Bash 完成问题回答。问题是,如何在部分子字符串上获得 Bash 别名完成(对于任何别名)。

示例: 例如,假设我有以下别名:

open.alicehome="cd /usr/home/alice"
open.bakerhome="cd /usr/home/baker"
open.charliehome="cd /usr/home/charlie"
gohomenow="shutdown -now"

我想懒洋洋地输入“baker{{TAB}}”来调用第二个别名。

我想懒洋洋地输入“home{{TAB}}”来获取上述所有别名的列表,然后我可以使用键盘(最佳)从中进行选择,或者通过输入区分三个选项的明确子字符串进行选择(低于最佳)。

.. 或者 ..

我想懒洋洋地输入“home”,然后反复按 {{TAB}} 直到出现我想要的特定别名,然后按 {{ENTER}} 执行它。

随意发挥创意: 如果你有办法做到这一点,即使它需要求助于极端的大师黑客,请随时分享并随时将你的大师黑客解释为一个五岁的孩子的水平将不得不尝试自己实施您的想法。

欢迎链接到现有网页或 RTFM。

4

3 回答 3

2

如果你真的想改变bash的标签行为,

# ~/.inputrc
# The default binding for [Tab] is ``complete'', which is what we're used to.
# ``menu-complete'' gives you irssi-like behavior: cycle through completions.
"\t": menu-complete

这在GNU Readline 库#Letting Readline Type For You中有记录。

于 2009-02-04T22:15:59.493 回答
1

也许您可以通过自定义 bash_completion 设置实现您想要的,但我不会为您完成这项工作,好吗?:-)

如果您不知道我在说什么,请参阅此处此处了解详细信息。顺便说一句,我会觉得这很烦人

我想懒洋洋地输入“home”,然后反复按 {{TAB}} 直到出现我想要的特定别名,然后按 {{ENTER}} 执行它。

我认为这是 M$ 风格的“完成”(你是来 DOS/windows 环境的吗?)

于 2009-02-04T20:40:14.537 回答
1

您可以为指定的子字符串生成匹配项compgen -c -X'!*substring*'

要将其包含在 bash 自动完成中,您可以在主目录中创建一个 .bash_completion 文件,其中包含以下内容:

_comp() {
    local cur

    cur=${COMP_WORDS[$COMP_CWORD]}

    COMPREPLY=( $( compgen -c -X '!*'$cur'*' ) )

}
complete -F _comp $nospace eval

当您按下命令<TAB>的参数时,此匹配函数将运行eval。我还没有找到一种方法来为 bash 中的第一个命令搜索包含一个新的匹配函数,我只找到了关于如何为特定命令添加自定义完成的文档,就像eval上面一样。

但我有点怀疑这是多么有用......没有简单的方法可以从列表中选择您想要的匹配项。

于 2009-02-05T08:51:24.670 回答