comment éditer et colorier la list d'achèvement des tabs de bash

Voici ce que je voudrais avoir. Lorsque l'achèvement de l'onglet est ambigu et que bash imprime la list des possibilités. Je voudrais que la couleur du prochain personnage que je devrais appuyer à l'intérieur de chaque mot dans la list.

Voici ce que j'ai fait jusqu'à présent. Dans mon .bashrc j'ai défini la fonction suivante et j'ai appelé la command complète

_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}\033[91m${w:n:1}\033[0m${w:$((n+1))}" done fi } complete -D -F _colourunique 

Mais ça ne marche pas … Quand je tape

 ls D[TAB] 

Il se complète automatiquement

 ls D\033[91m 

Au lieu d'énumérer les possibilités Documents, Bureau, etc. Qu'est-ce qui pourrait mal se passer ici? Ou y a-t-il une autre façon directe d'accomplir cela?

MISE À JOUR 1:

Je pense que je comprends ce qui se passe ici. Puisque j'ajoute \ 033 [91m à chaque mot dans COMPREPLY, bash voit cette partie commune à tous et remplit automatiquement ce terme commun dans la command. (au lieu d'imprimer simplement la list)

Donc, je ne pense pas que cette méthode d'édition COMPREPLY array est le moyen de le faire. Y a-t-il une autre méthode?

MISE À JOUR 2:

Pour préserver l'uniqness, j'ai essayé d'append un $ i et \ b dans la string.

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

Maintenant, il affiche les compléments d'onglet possibles comme suit.

 D0\b\033[91mo\033[0mwnloads D1\b\033[91me\033[0msktop 

Ce qui signifie que la list est imprimée comme telle. Il n'y a pas d'évaluation de \ b ou \ 033 [91m caractères. 🙁

MISE À JOUR 3:

Depuis les réponses, il n'y a aucun moyen d'accomplir ce que je veux dans bash (à less que je passe à zsh). J'ai décidé de me contenter d'une autre option. Je vais essayer d'append le prochain trait key unique à la fin de chaque mot, afin qu'il se démarque.

Voici le code jusqu'à présent.

 SanitiseSsortingng () { local Ssortingng="$1" local j for j in \\ \! \@ \# \$ \% \^ \& \* \( \) \+ \{ \[ \] \} \| \; \: \" \' \, \? \ ; do Ssortingng=${Ssortingng//"$j"/\\"$j"} done echo "$Ssortingng" } _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=$(SanitiseSsortingng "$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 

Cela imprimera les options avec la prochaine frappe unique séparée par:

Mais le code a toujours deux problèmes irritants. que je dois résoudre

  1. Il n'appose plus le / à la fin des directorys remplis automatiquement
  2. Il ne fait plus l'espacement intelligent après l'auto complète.

Aucune suggestion?

Bien que ce ne soit pas exactement ce que vous aviez demandé, j'ai décidé de postr cette réponse parce qu'à l'origine j'avais la même idée que vous, mais au final je la résous comme ça et je la trouve encore mieux que la coloration.

On peut définir cette option pour la bibliothèque GNU readline :

completion-prefix-display-length Longueur en caractères du préfixe commun d'une list de complétions possibles affichée sans modification. Lorsqu'elle est définie sur une valeur supérieure à zéro, les préfixes communs plus longs que cette valeur sont remplacés par une ellipse lors de l'affichage des compléments possibles.

Donc par exemple cette ligne dans ~ / .inputrc :

 set completion-prefix-display-length 2 

fait également l'affaire (lorsque le préfixe commun est plus long que deux caractères).

mon .c n'est pas si chaud, mais de la lecture à l'intérieur http://git.savannah.gnu.org/cgit/bash.git/snapshot/bash-master.tar.gz , il me semble que COMPREPLY n'est rien de plus que datatables textuelles non activées. iow, même si vous obtenez une Escape là-bas correctement finit par être imprimé comme une représentation non-magique / non-spéciale des personnages que nous utilisons pour les exprimer.

comme \033 ou \e n'est pas le seul caractère "Escape", mais les quatre ou deux caractères des barres obliques inverses et des zéros, des trois et Es.

J'ai piqué avec diverses itérations de printf / echo / eval avant de plonger dans le .c pour voir comment il a réellement géré les valeurs dans COMPREPLY.

peut être faux, mais vérifier strlist_print() dans lib/sh/ssortingnglist.c ressemble à COMPREPLY est une structure de type STRINGLIST (comme défini dans externs.h ).