Bash completion - Como obter a conclusão do nome do arquivo para subopções

2

Eu tenho uma função que pode receber argumentos principais e sub-argumentos. Alguns desses sub-argumentos são nomes de arquivos. O código de conclusão atual que tenho é o seguinte.

_scm() {
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts=$(mpv -input cmdlist | awk '{print $1}')

    case "${prev}" in
        sub_add)
            COMPREPLY=( $(compgen -f ${cur}) )
            return 0
            ;;
        *)
            ;;
    esac

    COMPREPLY=( $(compgen -W "${opts}" -- ${cur} ) )
}
complete -o plusdirs -F _scm scm

Eu quero que o sub_add arg tenha um nome de arquivo como subarg e o código atual seja capaz de fazer isso. Mas, eu também quero voltar a autocompletar args, uma vez que sub_add e aubargs estejam completos. Mas, em vez disso, a conclusão do arquivo continua acontecendo de novo e de novo.

Por exemplo, agora mesmo, pressionando

scm sub_add <TAB>

me dá conclusão para nomes de arquivos. O que eu também quero é que, depois de completar o nome do arquivo, o preenchimento do argumento original seja iniciado

scm sub_add ~/filename.txt <TAB>

deve dar sub_add sub_load seek.... etc.

O motivo para a conclusão do nome do arquivo acontecer novamente é por causa de complete -o plusdirs . Mas, sem ele, o bash completa os diretórios e arquivos, enquanto eu quero apenas nomes de arquivos. Como posso modificar meu código para conseguir o que quero?

    
por Hashken 13.04.2015 / 08:57

1 resposta

0

Eu não acho que haja alguma função padrão de conclusão ou bash-completion para completar apenas nomes de arquivos. Os diretórios podem conter arquivos para que o comportamento padrão para completar um nome de arquivo seja concluído em arquivos e diretórios (como _filedir do bash-completion tem. Ele tem uma opção para apenas diretórios, mas não apenas para arquivos.).

Você pode escrever uma função personalizada para retornar apenas correspondências de nome de arquivo simples, por exemplo, iterando em completions=( "$word"* ) e verificando [[ -f "$i" ]] para criar COMPREPLY .

Eu leio seu código com mais cuidado. Se você está gerando completações para o mpv , você não deve restringir isso apenas ao trabalho para nomes de arquivos nus no diretório atual. Não é assim que qualquer outra função de conclusão personalizada que conheço se comporta.

    
por 23.04.2015 / 01:21