die folgende Situation Unter der Annahme, darunter zwei Unterverzeichnisse:
.
├── colors
│ ├── blue.txt
│ └── red.txt
├── completion.bash
├── people
│ ├── rdir
│ ├── roger.txt
│ └── subdir
│ └── rhino.txt
└── readme.txt
Sie können die Art der Fertigstellung erhalten Sie w ith dieser Funktion:
_comp_less() {
# Store current globstar setting and set globstar if necessary
local glob_flag
if shopt -q globstar; then
glob_flag=0
else
glob_flag=1
shopt -s globstar
fi
# $2 is the word being completed
local cur=$2
# Loop over all files and directories in the current and all subdirectories
local fname
for fname in **/"$cur"*; do
# Only add files
if [[ -f "$fname" ]]; then
COMPREPLY+=("$fname")
fi
done
# Set globstar back to previous value if necessary
if ((glob_flag == 1)); then
shopt -u globstar
fi
return 0
}
Es prüft für die globstar
Shell Option und stellt sie bei Bedarf (und führt zum Löschen es wieder, wenn es nicht mit zu beginnen gesetzt wurde), verwendet dann die **/"$cur"*
glob alle Dateien und Verzeichnisse zu erhalten (einschließlich Unterverzeichnisse), die das aktuelle Wort vervollständigen und schließlich Verzeichnisnamen herausfiltern.
Die Funktion kann mit der Anweisung in Ihrem .bashrc
, zusammen gehen sie für less
zu verwenden: Jetzt
complete -F _comp_less less
, less r<tab>
schließt wie folgt:
$ less r
colors/red.txt people/subdir/rhino.txt
people/roger.txt readme.txt
Für nur einen bestimmten Befehl oder immer ? –
Immer. Überall, wo "x" normalerweise alle Dateien zurückgibt, die mit x im aktuellen Ordner beginnen, möchte ich, dass auch alle in den Ordnern darunter angezeigt werden. –
mahemoff
Ich bin mir nicht sicher, ob das _always_ passieren kann, da es 'compgen -F'-Verhalten überschreiben müsste. Sie könnten jedoch etwas ähnliches für bestimmte Befehle mit Ihrer eigenen Vervollständigungsfunktion erhalten. –