Como adicionar padrão ao término do bash (para descompactar)?

10

Quando eu digito

unzip <tab>

Eu recebo uma lista de todos os arquivos terminados em .zip , que é o comportamento padrão da conclusão da tabulação para o comando unzip .

No entanto, também quero a conclusão do bash para os arquivos unzip list que terminam em .udp , além dos arquivos .zip . Como posso conseguir esse comportamento no meu local .bashrc ?

    
por Alex 08.01.2014 / 17:26

4 respostas

21

Em vez de continuar comentando ...

complete -f -X '!*.@(zip|udp)' unzip

deve adicionar conclusão para

-f -X '!*.@(zip|udp)'
 |  |  | |||________|
 |  |  | ||     |
 |  |  | ||     +- filterpat: zip or udp
 |  |  | |+-------------  @ : Matches one of the given patterns
 |  |  | +-------------- *. : Anything+<dot>
 |  |  +----------------  ! : Negate
 |  +------------------- -X : Filter out matches in "filterpat"
 +---------------------- -f : files

Em outras palavras: complete os arquivos e remova todos que não terminem em .zip ou .udp .

Extras

Se você adicionar -o default completará / combinará todos arquivos e diretórios se houver não arquivos que terminam em .zip ou .udp .

Se você adicionar -o plusdirs completion, todos os diretórios serão adicionados a quaisquer correspondências de arquivos que terminem em .zip ou .udp .

Atual

Quando você usa complete -p unzip , você obtém o padrão atual.

Dos seus comentários, parece que você está perdendo + ou @ no padrão, como em:

# Err:
complete -f -X '!*.(zip|udp)' unzip
                   |
                   +---- Missing + or @

, o que significa que corresponde a qualquer ficheiro que termine em .(zip|udp) . Por exemplo,

touch 'file_test.(zip|udp)'

Veja também esta seção do manual:

é possível, e. extglob não está ativado. Ativar por:

shopt -s extglob

Verifique o status atual de todas as configurações de shopt digitando:

shopt

Função

Se isso for -F something , significa que ele usa uma função chamada algo para gerar a lista de conclusões.

O _filedir_xspec é tipicamente uma função Debian. Você pode ter algo assim:

$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion

O que significa /usr/share/bash-completion/bash_completion ser originado. Aqui você encontrará o função em questão . Algumas linhas abaixo você vê que esta função / conclusão é adicionada por uma função chamada _install_xspec por exemplo:

_install_xspec '!*.@(zip|[ejsw]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|do[ct][xm]|p[op]t[mx]|xl[st][xm])' unzip zipinfo

Entradas manuais:

Atualizar para comentários 1:

- Nenhuma correspondência devido a arquivos inválidos ou permissões de arquivo.

Isso não deve afetar o resultado. complete corresponde apenas aos arquivos fornecidos pelas regras e não processa os arquivos. Se você puder listá-los com ls , eles deverão corresponder.

Como uma nota lateral, um poderia adicionar tal funcionalidade usando uma função completa:

function _unzip_validated() {
    # 1. Generate list of files ending in e.g. .zip and .udp
    # 2. Validate each file and remove invalid ones from file list.
}

complete -F _unzip_validated unzip

- Cores. Por que ls distingue test.zip de test.upd ?

Isso não afeta complete . As cores por ls são fornecidas por $LS_COLORS . Experimente:

echo "$LS_COLORS" | tr : '\n' | sort

Você deve ver algo como *.zip=01;31 , o que significa:

*.zip=01;31
|____| |  |
   |   |  +--- Red
   |   +------ Bold
   +---------- Files with .zip extension

*.udp , por outro lado, não possui nenhuma entrada associada a ele, portanto, nenhuma coloração.

Próximo passo (deveria ter sido o primeiro)

  1. Abra o terminal e vá para um diretório com arquivos de teste. Ambos .zip e .udp
  2. Insira bash --norc
  3. Insira complete -f -X '!*.@(zip|udp)' unzip
  4. Insira shopt -s extglob
  5. Insira unzip <tab><tab>

Resultado?

Além disso, clique edite abaixo da sua pergunta e adicione a saída de:

bind -V
shopt
env

pode ser útil.

    
por 10.01.2014 / 03:47
2

Tente adicionar esta linha ao seu .bashrc:

complete -f -o default -X '!*.+(zip|udp)' unzip
    
por 08.01.2014 / 17:28
2

No arquivo /etc/bash_completion , que você provavelmente está obtendo em algum lugar, a conclusão padrão, pelo menos para minha versão de bash (v4.2.25) é

complete -f -X '!*.@(zip|[ejw]ar|exe|pk3|wsz|zargo|xpi|sxw|o[tx]t|od[fgpst]|epub|apk)' unzip zipinfo

Tente alterar a expressão inteira para

complete -f -X '!*.@(zip|[ejw]ar|exe|pk3|wsz|zargo|xpi|sxw|o[tx]t|od[fgpst]|epub|apk|udp)' unzip zipinfo

E adicione ao seu .bash_profile

    
por 08.01.2014 / 20:13
1

Use melhor _filedir em vez de "cru" complete .

Justificação

  • grep _filedir -r $(pkg-config --variable=completionsdir bash-completion) | wc -l
  • Os caminhos
  • til ( ~ ) estão sendo expandidos
  • Os prefixos são removidos dos diretórios, ou seja, para /home/tux/Do<TAB><TAB> , a lista obtida como resposta remove '/ home / tux' e, portanto, é muito mais compacta
  • Mais fácil de implementar e mais seguro contra falhas

MWE

_unzip_completor()
{
    # init bash-completion's stuff
    _init_completion || return

    # fill COMPREPLY using bash-completion's routine
    _filedir '@(zip|udp)'
}
complete -F _unzip_completor unzip
    
por 18.08.2018 / 13:11