Переход к каталогу, найденному где-то в древовидной иерархии

298
Damian Nadales

Я часто печатаю:

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

и внутри этого каталога есть много папок, которые я могу cdтуда и обратно.

Есть ли oh-my-zshплагин, который позволяет напечатать как:

cd somd<TAB> 

И затем автозаполнение со списком каталогов, чье имя содержит строку somed, и которые доступны из текущего каталога? Например, учитывая структуру каталогов

somedirX foo/bar/somedirY baz/somedirZ/bum 

Печатание cd somed<TAB>должно вернуть этот список завершения

somedirX somedirY somedirZ 

Я пока не мог ничего найти.

0
Нет, список должен быть `somedirX foo / bar / somedirY baz / somedirZ`, иначе` cd` не будет работать. xenoid 6 лет назад 0

1 ответ на вопрос

0
rools

Во-первых, вам нужно определить функцию для завершения следующим образом:

_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 } 

Теперь эту функцию можно использовать как завершитель для cd:

compdef _children_dirs cd 

Тем не менее, я не думаю, что это хорошая идея использовать последнюю команду. В самом деле, попробуйте сделать это из вашего домашнего каталога, и вы на некоторое время заморозите свою оболочку ( Ctrl + c, чтобы остановить). Лучшим решением может быть назначение последовательности ключей для этого завершения и использование ее только тогда, когда это необходимо и безопасно:

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

При этом Ctrl + y запустит завершение children_dirs .

Есть другое решение, которое я считаю лучше, если вы готовы использовать другую команду.

function ccd { cd $1 } compdef _children_dirs ccd 

Этот блок определяет новую команду ccd, которая использует _ \ children_dirs_ в качестве завершителя (запускается с помощью TAB).

Вы можете настроить фильтр в находке для поиска шаблона в любом месте в имени файла: "*$*".

Изменить: я создал плагин для Zsh с этим.

Похожие вопросы