revisão de código: conclusão automática para aliases bash

3

Eu estava lendo Como obtenho a conclusão do bash? para aliases de comandos? e eu pensei, que a resposta de Shawn J. Goff precisava de um pouco de coisa: menos configuração de usuário, então eu escrevi um pequeno script que se destina a ser originado de seu .bashrc , mas não Não funciona muito bem, por isso espero que alguém possa detectar o meu erro.

function make-completion-wrapper-1 () {
    local function_name="$2"
    local arg_count=$(($#-3))
    local comp_function_name="$(complete -pr $1|sed -e 's/^\(.* -F \)\([^ ]*\) [^ ]*$//')"
    shift 2
    local function="
        function $function_name {
            ((COMP_CWORD+=$arg_count))
            COMP_WORDS=( "$@" \${COMP_WORDS[@]:1} )
            "$comp_function_name"
            return 0
        }"
    echo "$function"
    eval "$function"
}

function make-completion-wrapper-2 () {
    local function_name="$1"
    local alias_name="$2"
    local comp_function_base="$(complete -pr $3|sed -e 's/^\(.* -F\)\( [^ ]*\) [^ ]*$//')"
    echo "$comp_function_base $function_name $alias_name"
    eval "$comp_function_base $function_name $alias_name"
}

[ -e ~/.cache/bash_alias_complete ] && rm ~/.cache/bash_alias_complete

alias | \
    sed \
        -e 's/^alias //' \
        -e '/^\([^=]\+\)='\'' /d' \
        -e "/'.*=/d" -e '/\$/d' \
        -e h \
        -e "s/.*='\([^ ]*\)\( .*\)'$/! /" \
        -e 'y/ -!/__ /' -eG -e 's!\n[^=]*='\''\(.*\)'\''! !' \
        -e 's/^/make-completion-wrapper-1 /p' \
        -e 's/^[^ ]* [^ ]* \([^ ]*\) .*$//' \
        -e x \
        -e 's!='\''\([^ ]*\) .*$! !' \
        -e x \
        -e 's!^!make-completion-wrapper-2 !' \
        -e G \
        -e 'y/\n/ /' \
    > ~/.cache/bash_alias_complete

. ~/.cache/bash_alias_complete

Estou recebendo o seguinte erro quando pressiono a tecla Tab :

bash: COMP_POINT - : syntax error: operand expected (error token is "- ")

OBSERVAÇÃO: O código acima pode ser colocado em um arquivo, como myfuncs.bash , que pode ser originado diretamente no shell ou em $HOME/.bashrc .

Para o histórico completo de alterações neste código, consulte o link

    
por hildred 23.11.2013 / 20:24

1 resposta

1

A mensagem de erro COMP_POINT do Manual de referência do Bash :

COMP_POINT

The index of the current cursor position relative to the beginning of the current command. If the current cursor position is at the end of the current command, the value of this variable is equal to ${#COMP_LINE}. This variable is available only in shell functions and external commands invoked by the programmable completion facilities (see Programmable Completion).

Tentando isso

Eu tentei usar seu código como está. Quando o sourcing tudo até a última linha funciona bem. Quando essa linha é executada, . ~/.cache/bash_alias_complete recebo erros. Muitos para incluir aqui.

Parece haver alguns problemas com o resultado sendo gerado no arquivo, ~/.cache/bash_alias_complete .

Erros que encontrei

Eu tenho os seguintes aliases:

$ alias|grep cdc
alias cdl='cdctl -o1'
alias cdu='cdctl -o0'

E o seu comando sed está deixando isso passar, que então está sendo propagado para o meu arquivo de cache, resultando nesses comandos que causam os seguintes erros:

$ make-completion-wrapper-1 cdctl _cdctl__o1 cdctl -o1
$ make-completion-wrapper-2 _cdctl__o1 cdl cdctl
$ make-completion-wrapper-1 cdctl _cdctl__o0 cdctl -o0
$ make-completion-wrapper-2 _cdctl__o0 cdu cdctl
bash: complete: cdctl: no completion specification
 _cdctl__o1 cdl

Existem outros exemplos, mas o ponto é que o comando sed não é tão apertado quanto provavelmente precisa ser, o que é o seu problema.

    
por 23.11.2013 / 20:56