Autocomplete do nome do arquivo no diretório

14

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

Estou tentando autocompletar a lista de diretórios que são colocados em /something/ :

$ ls /something/

One    Other    Three

de uma forma que isso acontecerá:

$ hi [TAB]

One Other Three
$ hi O[TAB]

One Other

Somente quando a primeira palavra for hi e não somente dentro de /something/ .

Isso é o que estou fazendo em .profile :

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

}
complete -F _codeComplete "hi "
    
por Donovan 04.01.2012 / 12:39

3 respostas

13

Tente:

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

complete -F _codeComplete hi

Você precisa especificar a opção -W em compgen e 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 suas próprias Função de conclusão do bash

    
por 04.01.2012 / 14:00
1

Deixe-me tentar melhorar a resposta aceita.

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

IFS=$'\n'

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

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

complete -F _codeComplete hi
    
por 27.01.2017 / 13:34
0

Aqui está uma versão que não apenas lida com 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 "

(Baseado nas respostas de dogbane e Eduardo Almeida dos Santos ', mas com escape conforme previsto pelo antak no SO: link )

    
por 09.02.2018 / 11:29