我已经为 bash 提供了自动完成功能。当我键入程序名称的一部分,然后按 TAB 键时,我会得到完整的命令。工作如预期,没有抱怨。
但是,在我的设置中,我定义了一个名为的别名flexo
(它将我登录到具有相同名称的计算机)。当我输入时,fle
TAB我只得到flex
,因为这是机器上完全有效的程序。我如何指示complete忽略这个特定的完成?换句话说,我想fle
TAB完成flexo
并flex
完全忽略。谢谢。
答案1
使用制表符完成算法从池中取出几个项目比您想象的更复杂。它实际上是可以做到的,但使用起来并不容易、高效,也不推荐。
相反,@jasonwryan 的观点是正确的,您应该为您的命令名称想出其他名称。然而,我建议您不要尝试使用一个单词(即服务器名称作为命令名称),而是将模型切换为多单词模型,就像 Unix 的其余部分一样。命令名称的制表符补全与参数的制表符补全有很大不同,后者非常简单。
设置一个简短的简单别名,例如“s”或任何连接别名,但不包括主机名。然后为该命令设置一个自定义完成例程,该例程仅自动完成主机名,例如:
alias s=ssh
complete -F _known_hosts_real s
您还可以为此创建一个自定义函数:
alias s=ssh
_my_hosts() {
type compopt &>/dev/null && compopt -o nospace
COMPREPLY=( $( compgen -S = -W 'flexo mexo dexo' -- "$cur") )
}
complete -F _my_hosts s