是否可以有多个由不同组合键触发的制表符完成例程?
例如,我有一个自定义的制表符完成功能,它将输出解析myprog -help
为制表符完成选项。有什么方法可以保持默认的制表符完成行为Tab不变,并将我的自定义完成绑定到类似的东西Shift+ Tab?
是否可以有多个由不同组合键触发的制表符完成例程?
例如,我有一个自定义的制表符完成功能,它将输出解析myprog -help
为制表符完成选项。有什么方法可以保持默认的制表符完成行为Tab不变,并将我的自定义完成绑定到类似的东西Shift+ Tab?
键绑定本身是 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 直接视为修饰符,而是依赖于终端或终端仿真器来输入某些字符集,这些字符集没有适用的修饰符概念。