Conclusão de bash para comando personalizado para concluir a árvore de diretórios estática

3

Gostaria de adicionar uma especificação de conclusão personalizada para a Conclusão programável do bash que faz o seguinte: sempre que o comando digitado for foo , gostaria de concluir o nome do arquivo / diretório do token parcial após foo , mas relativo para um diretório fixo (digamos /a/b/c ) em vez do diretório de trabalho atual.

Por exemplo, suponha que /a/b/c contenha os arquivos

hello goodbye cheers directory

e /a/b/c/directory contém os arquivos

adieu ciao

Em seguida, digitar foo go<TAB> deve concluir go a goodbye e digitar foo dir<TAB>ci<TAB> deve concluir o argumento primeiro em directory/ e, em seguida, em directory/ciao , independentemente do diretório atual.

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

    
por lambdacalculator 09.12.2015 / 06:55

1 resposta

4

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, em seguida, registre a função a ser usada com seu comando foo :

complete -o nospace -F _foo foo
    
por chaos 09.12.2015 / 09:32