script de conclusão automática bash

7

Estou tentando configurar o autocompletar para um comando, que usa apenas um parâmetro, um nome de pasta,

Em /secure/kernel_builds/ , tenho as três seguintes subpastas:

3.5.6/ 3.6.2/ source/

Agora eu quero o preenchimento automático, que lista todos os nomes de subpastas possíveis, mas não o chamado source , no momento estou usando uma maneira bastante estúpida de fazer isso, verificando se a palavra de conclusão é iniciada com um número,

_avail_kernel_builds()
{
    case $COMP_CWORD in
        1)
            if [[ "${COMP_WORDS[COMP_CWORD]}" =~ ^[0-9] ]];then
                COMPREPLY=( /secure/kernel_builds/"${COMP_WORDS[COMP_CWORD]}"* )
            else
                COMPREPLY=( /secure/kernel_builds/"${COMP_WORDS[COMP_CWORD]}"[0-9]*/ )
            fi
            COMPREPLY=( "${COMPREPLY[@]#/secure/kernel_builds/}" )
            COMPREPLY=( "${COMPREPLY[@]%/}" )
            ;;
    esac    
}

Existe uma maneira melhor de fazer isso?

    
por daisy 17.10.2012 / 04:54

2 respostas

1

O compgen builtin tem um argumento -X para esse propósito:

-X filterpat
    filterpat is a pattern as used for filename expansion. It is applied to the list of 
    possible completions generated by the preceding options and arguments, and each 
    completion matching filterpat is removed from the list. A leading ! in filterpat 
    negates the pattern; in this case, any completion not matching filterpat is removed.

Então você provavelmente poderia fazer algo como:

_avail_kernel_builds() {
    case $COMP_CWORD in
        1) COMPREPLY=( $(cd /secure/kernel_builds; compgen -d -X "source") ) ;;
    esac
 }

Então compgen -d diz "listar as pastas no diretório atual", e -X "source" diz "... mas filtra qualquer coisa chamada" fonte ".

    
por 14.07.2014 / 20:23
0

Você pode verificar em um loop as strings que você não quer:

declare -a accept
declare -a reject
for s in "${COMPREPLY[@]}"; do
    if [[ "$s" =~ want ]]; then
        accept=( "${accept[@]}" "$s" )
    else
        reject=( "${reject[@]}" "$s" )
    fi
done
    
por 31.10.2012 / 11:50