Bash 完成自定义命令以完成静态目录树

Bash 完成自定义命令以完成静态目录树

我想为 bash 的可编程完成添加一个自定义完成规范,它执行以下操作:每当输入的命令是时foo,我想对之后的部分标记执行文件名/目录完成foo,但相对于固定目录(比如/a/b/c)而不是当前工作目录。

例如,假设/a/b/c包含文件

hello goodbye cheers directory

/a/b/c/directory包含文件

adieu ciao

然后,输入foo go<TAB>应该完成gogoodbye,并且输入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

相关内容