Bash终端中的多个制表符完成例程

时间:2013-07-12 14:48:30

标签: bash tab-completion

是否可以使用由不同组合键触发的多个制表符完成例程?

例如,我有一个自定义制表符完成功能,它将myprog -help的输出解析为制表符完成选项。有没有什么方法可以保持 Tab 上的默认制表符完成行为不变,并将我的自定义完成绑定到类似 Shift + Tab 的内容?

1 个答案:

答案 0 :(得分:2)

键绑定本身是readline的一部分,可以在~/.inputrc中更改,也可以在bind(等)中使用.bashrc命令,但它们不会绑定< em>直接到用户定义的函数,只是间接作为可能调用这些函数的宏。

"\C-xhf": dump-functions        # for ~/.inputrc
bind '"\C-xhf":dump-functions'  # in .bashrc (etc.)

bind -l会向您显示可以绑定到的内置函数。您可以通过这种方式添加宏,这样您就可以运行所需的任何bash函数,但不是在完成上下文中,因此结果不会被填充回命令行。例如:

"\C-xc":  "echo hi\n"       # note it's a just macro, not a direct binding.

我猜你已经知道你可以用命令行左边的complete内置命令来覆盖完成。通常情况下,我建议以这种方式创建自己的完成例程并使用它们,而不是设法调用备用集。例如:

_complete_ssh ()
{
    local ssharg="${COMP_WORDS[COMP_CWORD]}"
    local filter=cat
    case "$ssharg" in *@*) filter="sed s/^/${ssharg%@*}@/" ;; esac
    local host=${ssharg##*@}
    COMPREPLY=( $(compgen -W "`
        sed 's/[, ].*//'  ~/.ssh*/known_hosts{,2} | sort | uniq
    `" $host | $filter ))
    return 0
}
complete -F _complete_ssh ssh          # for any command starting with "ssh "...

我尝试绑定universal-argument以查看它是否会影响通过宏运行的函数(“C-xu”为前缀UA,然后“C-xf”运行函数),但我没有'注意到任何东西都表明该功能可以检测到UA。您认为bind可以选择重新调整UA对于前一个命令的作用,或者是$ -something,这可能允许用户定义的完成子函数从{{1}内部检测UA因此行为不同,但我在readline源代码中没有看到任何想法的迹象。没有明显的方法可以看到键绑定引发了一个函数或宏(我没想到一个),允许将两个键绑定映射到相同的complete内置,然后回溯以查看哪个键绑定触发了它。

请注意,Shift-TAB无论如何都很难绑定,也无法从老式终端输入。 bash不使用X库,也不能直接看到Shift作为修饰符,而是根据终端或终端仿真器在某些字符集中输入,这些字符集没有适用的修饰符概念。