我想为 bash 的可编程完成添加一个自定义完成规范,它执行以下操作:每当输入的命令是时foo
,我想对之后的部分标记执行文件名/目录完成foo
,但相对于固定目录(比如/a/b/c
)而不是当前工作目录。
例如,假设/a/b/c
包含文件
hello goodbye cheers directory
并/a/b/c/directory
包含文件
adieu ciao
然后,输入foo go<TAB>
应该完成go
到goodbye
,并且输入foo dir<TAB>ci<TAB>
应该先将参数完成到directory/
然后完成到directory/ciao
,不管我当前的工作目录是什么。
我希望能够通过一次调用来完成此设置complete
,但阅读手册后,似乎无法做到这一点。可以做到吗?如果不行,我该如何添加 compspec 来做到这一点?
答案1
您可以使用如下自定义完成函数:
_foo () {
local cur
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
k=0
i="/a/b/c" # the directory from where to start
for j in $( compgen -f "$i/$cur" ); do # loop trough the possible completions
[ -d "$j" ] && j="${j}/" || j="${j} " # if its a dir add a shlash, else a space
COMPREPLY[k++]=${j#$i/} # remove the directory prefix from the array
done
return 0
}
然后注册要与您的命令一起使用的函数foo
:
complete -o nospace -F _foo foo