bash completion

10/08/2008 - 17:58 von Christian Garbs | Report spam
Mahlzeit!

Wenn ich im Netz nach "bash completion howto" suche, finde ich immer
nur Hinweise darauf, wie man die Vervollstàndigung aktiviert und
benutzt, aber nichts darüber, wie man sie selber erstellt. Daher
frage ich hier mal.

Folgendes Konstrukt als Beispiel:

# bash completion test
_foo()
{
# 1st parameter: one of "bar baz bam"
# 2nd parameter: all directories or files named *.txt
# all other: bash default (files, directories, ...)
local cur=${COMP_WORDS[COMP_CWORD]}
if [ $COMP_CWORD -eq 1 ] ; then
COMPREPLY=( $( compgen -W "bar baz bam" -- $cur ) )
elif [ $COMP_CWORD -eq 2 ] ; then
COMPREPLY=( $( compgen -f -X '!*.txt' -- $cur) $(compgen -d -o dirnames -- $cur ))
fi
}

Das soll expandieren zu "bar, baz, bam" als ersten Parameter, zu allen
Directories plus Dateien, die auf .txt Enden als zweiten Parameter und
danach nach den üblichen bash-Defaults.

Wenn ich das über "complete -F _foo -o default foo" aktiviere,
funktionieren der erste und alle Parameter ab dem dritten wie
gewünscht.

Der zweite Parameter arbeitet nicht ganz korrekt: Die Verzeichnisse
werden ohne abschließenden Slash ergànzt. Man kann sich nicht in ein
Unterverzeichnis zu beispielsweise unterordner/foo.txt durchhangeln,
"unterordner" word expandiert, ein Leerzeichen eingefügt und man ist
dann im dritten Parameter gelandet.

"unte<tab>" wird also zu "unterordner " statt zu "unterordner/".

Aktiviere ich die Expansion über -o plusdirs statt -o default, dann
klappt das mit dem zweiten Parameter wie gewünscht. Jetzt werden aber
auch beim ersten Parameter immer Ordnernamen mit expandiert und bei
den Parametern ab dem dritten werden nur noch Ordner angezeigt, keine
Dateien mehr - das will ich beides nicht.

Wie bekomme ich das richtig hin?

Gruß,
Christian
Christian.Garbs.http://www.cgarbs.de
Wo ist das Wissen? Verschwunden in der Information.
(T.S. Eliot)
 

Lesen sie die antworten

#1 Christian Garbs
10/08/2008 - 22:55 | Warnen spam
Mahlzeit!

Christian Garbs wrote:

Wenn ich das über "complete -F _foo -o default foo" aktiviere,
funktionieren der erste und alle Parameter ab dem dritten wie
gewünscht.

Der zweite Parameter arbeitet nicht ganz korrekt: Die Verzeichnisse
werden ohne abschließenden Slash ergànzt. Man kann sich nicht in
ein Unterverzeichnis zu beispielsweise unterordner/foo.txt
durchhangeln, "unterordner" word expandiert, ein Leerzeichen
eingefügt und man ist dann im dritten Parameter gelandet.

"unte<tab>" wird also zu "unterordner " statt zu "unterordner/".



Wenn ich das auf

elif [ $COMP_CWORD -eq 2 ] ; then
COMPREPLY=( $( compgen -f -X '!*.txt' -- $cur) \
$(compgen -d -o dirnames -- $cur | while read I; do printf -- "$I/ "; done ))
fi

àndere, bekomme ich den abschließenden Slash, aber das schließt den
Parameter dann trotzdem mit einem Leerzeichen ab ("unterordner/ ").

Problem bleibt also erhalten.

Gruß,
Christian
Christian.Garbs.http://www.cgarbs.de
_o o/ \o_ \ / __ __o |o \__/o | o____ _o o/
__|- |__ __/ \__/o | / | / o\ / \ |
| > / \ /o\ o| << | << < \

Ähnliche fragen