2016-10-30 5 views
1

Gibt es eine Möglichkeit, bash so zu konfigurieren, dass das Drücken der Registerkarte zum Erweitern des Dateinamens alle Unterordner sowie den aktuellen Ordner durchsucht?Bash: Tab Dateiname Vervollständigung in allen Unterverzeichnissen

z.B. meine Ordnerstruktur

readme.txt 
colors/blue.txt 
colors/red.txt 
people/roger.txt 

Ich möchte less r<tab> (oder vielleicht less **/r<tab> erweitern alle Erweiterungsmöglichkeiten mit r beginnen zu zeigen:

readme.txt colors/red.txt people/roger.txt

+0

Für nur einen bestimmten Befehl oder immer ? –

+0

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

+0

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. –

Antwort

1

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 
Verwandte Themen