3

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

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

4

1 回答 1

2

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

"\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,这可能允许用户定义的完成子函数从内部检测 UA complete,因此行为不同,但我在 readline 源代码中看不到任何想法的迹象。也没有明显的方法可以查看是什么键绑定引发了一个函数或宏(我没想到会这样),以允许将两个键绑定映射到同一个complete内置函数,然后回溯以查看哪个键绑定触发了它。

请注意,Shift-TAB 无论如何都很难绑定,并且不可能从老式终端输入。bash 不使用 X 库并且不能将 Shift 直接视为修饰符,而是依赖于终端或终端仿真器来输入某些字符集,这些字符集没有适用的修饰符概念。

于 2013-07-19T07:42:42.733 回答