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

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

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

1 ответ1

0

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

_children_dirs() {
    find . -type d -name "${words[CURRENT]}*" -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).

Вы можете персонализировать фильтр имен в find для поиска шаблона в любом месте имени файла с помощью: "*${words[CURRENT]}*" .

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .