Wechseln zu einem Verzeichnis, das sich irgendwo in der Baumstruktur befindet

361
Damian Nadales

Ich tippe oft auf:

cd a/directory/I/use/a/lot 

und in diesem Verzeichnis gibt es eine Menge Ordner, die ich cdhin und her bewegen kann.

Gibt es ein oh-my-zshPlugin, das folgende Eingabe zulässt:

cd somd<TAB> 

Und dann Autovervollständigungen mit einer Liste von Verzeichnissen, deren Name die Zeichenfolge enthält somedund die vom aktuellen Verzeichnis aus erreichbar sind ? Zum Beispiel die Verzeichnisstruktur gegeben

somedirX foo/bar/somedirY baz/somedirZ/bum 

Die Eingabe cd somed<TAB>sollte diese Abschlussliste zurückgeben

somedirX somedirY somedirZ 

Ich konnte noch nichts finden.

0
Nein, die Liste sollte "somedirX foo / bar / somedirY baz / somedirZ" lauten, andernfalls funktioniert "cd" nicht. xenoid vor 6 Jahren 0

1 Antwort auf die Frage

0
rools

Zuerst müssen Sie eine Funktion für die Fertigstellung definieren:

_children_dirs() { find . -type d -name "$*" -printf "%P\n" \ | while read -r line; do compadd -U -X "Subdirectories: " "$line" done compstate[insert]=menu # no expand } 

Diese Funktion kann jetzt als Ergänzung für cdFolgendes verwendet werden:

compdef _children_dirs cd 

Ich denke jedoch nicht, dass es eine gute Idee ist, den letzten Befehl zu verwenden. Versuchen Sie dies in Ihrem Home-Verzeichnis, und Sie werden Ihre Shell für eine Weile einfrieren ( Strg + c zum Stoppen). Eine bessere Lösung könnte sein, diesem Abschluss eine Schlüsselsequenz zuzuweisen und sie nur dann zu verwenden, wenn sie benötigt wird und sicher ist:

zstyle ':completion:children-dirs:*' completer _children_dirs zle -C children-dirs menu-complete _generic bindkey '^Y' children-dirs 

Mit diesem Befehl wird durch Drücken von Strg + y die Vollendung von children_dirs ausgelöst .

Es gibt eine andere Lösung, die meiner Meinung nach besser ist, wenn Sie bereit sind, einen anderen Befehl zu verwenden.

function ccd { cd $1 } compdef _children_dirs ccd 

Dieser Block definiert einen neuen Befehl ccd, der _ \ children_dirs_ als Vervollständiger verwendet (also mit TAB ausgelöst).

Sie können den Namen Filter personalisieren finden mit für das Muster überall im Dateinamen suchen: "*$*".

Edit: Ich habe ein Plugin für zsh damit erstellt.