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