Preenchimento automático do nome do arquivo no diretório

16

Essa pergunta é bem parecida com essa , mas não consigo entender a solução. Também conheço este tutorial , mas ainda não consigo entender o que estou fazendo de errado.

Estou tentando preencher automaticamente a lista de diretórios colocados em /something/:

$ ls /something/

One    Other    Three

de uma maneira que isso vai acontecer:

$ hi [TAB]

One Other Three
$ hi O[TAB]

One Other

Somente quando a primeira palavra é hie não apenas dentro /something/.

Isto é o que estou fazendo em .profile:

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen `ls /something/` -- $cur) )

}
complete -F _codeComplete "hi "
Donovan
fonte

Respostas:

14

Experimentar:

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen -W "$(ls /something/)" -- $cur) )
}

complete -F _codeComplete hi

Você precisa especificar a -Wopção compgene também citar o comando que produz a lista de palavras.

Mais informações sobre como escrever funções de conclusão neste blog: Escrevendo sua própria função de conclusão de bash

dogbane
fonte
6
Isso falhará nos nomes de arquivos que contenham espaços em branco e outros caracteres especiais.
Gilles 'SO- stop be evil'
2
É estranhamente difícil encontrar o nome do completecomando se você ainda não o conhece e está procurando autocompleteou tab-completion... Este foi o primeiro local em que encontrei o nome do comando e o que eu precisava para corrigi-lo ejectna atualização para o Ubuntu 14.04 ( $ complete -p ls-> complete -F _longopt ls, então a correção foi: complete -F _longopt eject) (Aqui está esperando que este comentário ajuda os outros a encontrá-lo!)
Izkata
1

Deixe-me tentar melhorar a resposta aceita.

A resposta original falhará com nomes de arquivos que contenham espaços em branco. Após alguma investigação, percebo que você pode alterar o separador de entrada para final de linha:

IFS=$'\n'

tornando a função manipular espaços corretamente.

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    IFS=$'\n' tmp=( $(compgen -W "$(ls ~/something/ )" -- $cur))
    COMPREPLY=( "${tmp[@]// /\ }" )
}

complete -F _codeComplete hi
Eduardo Almeida dos Santos
fonte
1

Aqui está uma versão que não apenas lida com os espaços, mas também os escapa:

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    local AUTO_COMPLETE_DIRS=$(ls /something/)

    IFS=$'\n' COMPREPLY1=( $(compgen -W "$AUTO_COMPLETE_DIRS" -- $cur))
    COMPREPLY2=( "${COMPREPLY1[@]// /\ }" )
    COMPREPLY=($(printf "%q\n" "${COMPREPLY2[@]}"))

}
complete -F _codeComplete "hi "

(Com base nas respostas de dogbane e Eduardo Almeida dos Santos , mas com escape conforme fornecido pela antak no SO: /programming//a/11536437/1536933 )

EM0
fonte
0
_hi() {
    COMPREPLY=(cd /something/ && compgen -A directory -S / -- $2)
}

complete -o nospace -F _hi hi
xdch47
fonte