como editar e colorir a lista de conclusão da guia do bash

6

A seguir, o que eu gostaria de ter. Quando a conclusão da tabulação é ambígua, o bash imprime a lista de possibilidades. Eu gostaria que ele colorisse o próximo caractere que eu deveria pressionar em cada palavra da lista.

A seguir está o que eu fiz até agora. Na minha .bashrc eu defini a seguinte função e chamei o comando completo

_colourunique() {
    local word=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=($(compgen -f -- "${word}"))
    if [[ "$word" ]] && [[ ${#COMPREPLY[@]} -gt 1 ]]; then
        local  w
        local  i=0
        for ((i=0;i<${#COMPREPLY[@]};i++)) ; do
            w=${COMPREPLY[$i]}
            n=${#word}
            COMPREPLY[$i]="${w:0:n}3[91m${w:n:1}3[0m${w:$((n+1))}"
        done
    fi
}

complete -D -F _colourunique

Mas não está funcionando ... Quando eu digito

ls D[TAB]

Autocomplete como

ls D3[91m

Em vez de listar as possibilidades, documentos, área de trabalho, etc. O que poderia estar errado aqui? Ou há algum outro caminho direto para conseguir isso?

UPDATE 1:

Acho que entendo o que está acontecendo aqui. Uma vez que eu adiciono \ 033 [91m para cada palavra em COMPREPLY, o bash vê que esta parte é comum a todos, e autocomplete esse termo comum no próprio prompt de comando. (em vez de simplesmente imprimir a lista)

Portanto, não acho que esse método de edição do array COMPRELICE seja a maneira de fazê-lo. Existe algum outro método?

UPDATE 2:

Para preservar a uniqness, tentei adicionar um $ i e \ b na string.

COMPREPLY[$i]="${w:0:n}$i\b3[91m${w:n:1}3[0m${w:$((n+1))}"

Agora, imprime as possíveis conclusões da guia da seguinte forma.

D0\b3[91mo3[0mwnloads  D1\b3[91me3[0msktop

O que significa que a lista é impressa como tal. Não há avaliação de \ b ou \ 033 [caracteres de 91m. :-(

UPDATE 3:

Como as respostas parecem, não há como realizar o que eu quero no bash (a menos que eu mude para zsh). Eu decidi me contentar com outra opção. Vou tentar acrescentar o próximo toque de tecla exclusivo ao final de cada palavra, para que ele se destaque.

A seguir está o código até o momento.

SanitiseString () {
    local String="$1"
    local j
    for j in \ \! \@ \# \$ \% \^ \& \* \( \) \+ \{ \[ \] \} \| \; \: \" \' \, \? \ ; do
        String=${String//"$j"/\"$j"}
    done
    echo "$String"
}

_colourunique() {
    saveIFS=$IFS
    IFS=$'\n'                                   
    local word=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=($(compgen -f -- "${word}"))
    if [[ "$word" ]] ; then
        local  w
        local  i=0
        for ((i=0;i<${#COMPREPLY[@]};i++)) ; do
            w="${COMPREPLY[$i]}"
            n=${#word}
            w=$(SanitiseString "$w")
            if  [[ ${#COMPREPLY[@]} -gt 1 ]] ; then
                COMPREPLY[$i]="$w :${w:n:1}"
            else
                COMPREPLY[$i]="$w"
            fi
        done
    fi
    IFS=$saveIFS
}

complete -D -F _colourunique

Isso imprimirá as opções com o próximo pressionamento de tecla exclusivo separado por:

Mas o código ainda tem dois problemas irritantes. que eu tenho que resolver

  1. Já não acrescenta o / no final dos diretórios preenchidos automaticamente
  2. Ele não faz mais o espaçamento inteligente após o preenchimento automático.

Alguma sugestão?

    
por indiajoe 06.04.2014 / 14:19

2 respostas

1

Embora isto não seja exatamente o que você pediu, eu decidi postar esta resposta porque originalmente eu tive a mesma idéia que você, mas no final eu resolvo assim e eu a acho ainda melhor do que a coloração.

Pode-se definir essa opção para a biblioteca readline do GNU :

completion-prefix-display-length O comprimento em caracteres do prefixo comum de uma lista de possíveis conclusões exibida sem modificação. Quando definido com um valor maior que zero, os prefixos comuns mais longos que esse valor são substituídos por reticências ao exibir possíveis conclusões.

Por exemplo, esta linha em ~ / .inputrc :

set completion-prefix-display-length 2

também mostra o truque (quando o prefixo comum é maior que dois caracteres).

    
por 09.08.2015 / 22:19
0

meu .c não é tão bom, mas lê-lo em link , parece-me que COMPRELICE nada mais é do que dados de texto não acionados. Até mesmo conseguir um Escape lá corretamente acaba sendo impresso como uma representação não-mágica / não-especial dos personagens que usamos para expressá-los.

como 3 ou \e não é o caractere único "Escape", mas os quatro ou dois caracteres de barras invertidas e zeros, threes e Es.

Eu fiz várias iterações de printf / echo / eval antes de mergulhar no .c para ver como elas realmente lidavam com os valores em COMPREPLY.

pode estar errado, mas verifique se strlist_print() em lib/sh/stringlist.c é COMPREPLY como uma estrutura do tipo STRINGLIST (conforme definido em externs.h ).

    
por 11.07.2014 / 02:22