Introdução ao código de conclusão do Tmux bash

3
if [[ $COMP_CWORD -le $cmd_index ]]; then
        # The user has not specified a command yet
        local all_commands="$(tmux -q list-commands | cut -f 1 -d ' ')"
        COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "${all_commands}" -- "${cur}") )

Estou tentando entender o snippet de código acima para o tmux bash autocompletar

O argumento W do compgen pega uma lista de palavras. Mas por que foi necessária uma opção extra -- com a palavra atual, ${cur} como argumento?

O que significa :- dentro dos parênteses de flor? ${COMPREPLY[@]:-}

Quando eu faço, tmux<tab> a lista de conclusão exibida é igual a $(tmux -q list-commands | cut -f 1 -d ' ') . Então, por que precisamos de ${COMPREPLY[@]:-} no começo da matriz?

    
por Madhavan Kumar 27.07.2015 / 16:26

2 respostas

3

compgen -W "${all_commands}" -- "${cur}" corre compgen , passando:

  • a opção -W com um argumento, o valor da variável all_commands ;
  • um argumento não opcional, o valor da variável cur .

O argumento -- marca o final das opções. Mesmo se o valor de cur começar com um traço, ele não será interpretado como uma opção. Esta é uma convenção extremamente comum para a análise de opções de linha de comando.

${COMPREPLY[@]:-} é estranho. Ele usa o constructo de expansão de parâmetro ${VARIABLE:-TEXT} , que se expande para o valor de VARIABLE se definido e não vazio e para TEXT caso contrário, de uma maneira totalmente sem sentido. Ele pega os elementos da matriz COMPREPLY , exceto que se a matriz estiver vazia ou indefinida, resultará em uma string vazia. Então o resultado é dividido em palavras e cada palavra é interpretada como um padrão glob . Isso é exatamente equivalente a ${COMPREPLY[@]} , exceto quando COMPREPLY não está definido e set -u está em vigor: em set -u , ${COMPREPLY[@]} acionaria um erro se COMPREPLY não estivesse definido. Observe, em particular, que essa instrução não é anexada à matriz COMPREPLY , ela a manipula. Para acrescentar ao array, o código correto seria

COMPREPLY+=($(compgen -W "${all_commands}" -- "${cur}") )

assumindo que a saída de compgen contenha uma lista de padrões globais delimitada por espaços em branco.

    
por 28.07.2015 / 02:39
0

Double hyphen significa o fim dos parâmetros opcionais e tudo o que segue os hífens precisam ser tratados como parâmetros posicionais ... leia mais @ O que significa" - "(duplo traço) significa? (também conhecido como "duplo traço nu") .

E :- foi criado para remover as strings vazias de dentro da matriz ...

todos os problemas resolvidos .. obrigado ...

    
por 27.07.2015 / 19:24