Conclusão de festança para comando personalizado para concluir a árvore de diretórios estáticos

2

Gostaria de adicionar uma especificação de conclusão personalizada para a Conclusão Programável do bash que faça o seguinte: sempre que o comando digitado for foo, eu gostaria de concluir o nome do arquivo / diretório para o token parcial depois foo, mas em relação a um diretório fixo (por exemplo /a/b/c) em vez de o diretório de trabalho atual.

Por exemplo, suponha que /a/b/ccontenha os arquivos

hello goodbye cheers directory

e /a/b/c/directorycontém os arquivos

adieu ciao

Em seguida, a digitação foo go<TAB>deve ser concluída goem goodbye, e a digitação foo dir<TAB>ci<TAB>deve concluir o argumento primeiro para directory/e depois para directory/ciao, independentemente do meu diretório de trabalho atual.

Eu esperava poder configurar isso com apenas uma chamada complete, mas depois de ler o manual, não parece que eu posso fazer isso. Isso pode ser feito? E, se não, como eu poderia adicionar um compspec para fazer isso?

lambdacalculator
fonte

Respostas:

5

Você pode usar uma função de conclusão personalizada como a seguinte:

_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
}

E então registre a função a ser usada com o seu comando foo:

complete -o nospace -F _foo foo
caos
fonte
Embora eu já tenha testado e aceito esta resposta (obrigado, btw!), Ainda estou curioso para saber se pode ser confirmado que não posso alcançar a funcionalidade que estou procurando usando apenas os muitos e não completamente documentados comandos- opções de linha para complete ( -Fque não seja).
lambdacalculator
@lambdacalculator Você pode trabalhar -P /a/b/c, mas isso sempre substituirá o padrão de conclusão por todo o caminho. Eu não acho que é possível sem uma função.
caos