Folgendes möchte ich haben. Wenn die Tab-Vervollständigung nicht eindeutig ist und Bash die Liste der Möglichkeiten druckt. Ich möchte, dass es das nächste Zeichen färbt, das ich in jedes Wort in der Liste drücken soll.
Folgendes habe ich bisher getan. In meiner .bashrc habe ich folgende Funktion definiert und den vollständigen Befehl aufgerufen
_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
Aber es funktioniert nicht ... Wenn ich tippe
ls D[TAB]
Es wird automatisch vervollständigt als
ls D\033[91m
Anstatt die Möglichkeiten Dokumente, Desktop usw. aufzulisten. Was könnte hier falsch laufen? Oder gibt es einen anderen direkten Weg, um dies zu erreichen?
UPDATE 1:
Ich glaube ich verstehe was hier passiert. Da ich jedem Wort in COMPREPLY \ 033 [91m] hinzufüge, sieht bash, dass dieser Teil allen gemeinsam ist, und vervollständigt diesen gemeinsamen Begriff automatisch in der Eingabeaufforderung selbst. (anstatt einfach die Liste zu drucken)
Daher denke ich nicht, dass diese Methode zum Bearbeiten des COMPREPLY-Arrays der richtige Weg ist. Gibt es eine andere Methode?
UPDATE 2:
Um die Einheitlichkeit zu bewahren, habe ich versucht, ein $ i und \ b in den String einzufügen.
COMPREPLY[$i]="${w:0:n}$i\b\033[91m${w:n:1}\033[0m${w:$((n+1))}"
Jetzt werden die möglichen Tab-Vervollständigungen wie folgt gedruckt.
D0\b\033[91mo\033[0mwnloads D1\b\033[91me\033[0msktop
Das heißt, die Liste wird als solche gedruckt. Es gibt keine Auswertung von \ b oder \ 033 [91m Zeichen. :-(
UPDATE 3:
Da die Antworten so aussehen, gibt es keine Möglichkeit, das zu erreichen, was ich in Bash will (es sei denn, ich wechsle zu zsh). Ich entschied mich für eine andere Option. Ich werde versuchen, den nächsten eindeutigen Tastenanschlag an das Ende jedes Wortes anzuhängen, damit es auffällt.
Es folgt der bisherige Code.
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
Dadurch werden die Optionen mit dem nächsten eindeutigen Tastendruck gedruckt, der durch Folgendes getrennt ist:
Der Code weist jedoch immer noch zwei irritierende Probleme auf. was ich lösen muss
- Das / am Ende von automatisch vervollständigten Verzeichnissen wird nicht mehr angehängt
- Der intelligente Abstand nach der automatischen Vervollständigung wird nicht mehr ausgeführt.
Irgendwelche Vorschläge?
bash
bieten jedoch einfach keinen Hook für die benutzerdefinierte Formatierung der möglichen Vervollständigungen.