Назад | Перейти на главную страницу

zsh автоматически заполняет несуществующие папки

Только начал использовать zsh с помощью oh-my-zsh, и я заметил что-то странное при автозаполнении с помощью cd.

Допустим, у меня есть папка:

my_folder/
    subfolder/
    another_subfolder/
    file.txt

Когда я использовал bash, я мог набирать:

$ cd p<tab>

И ничего бы не случилось, потому что ничего в my_folder начинается с p, но если я сделаю то же самое в zsh, он автозаполнит слово proxy, я предполагаю, что это какой-то каталог где-то еще в файловой системе?

Я не уверен, что что-то настроено неправильно, или я не понимаю, как работает автозаполнение в zsh.

РЕДАКТИРОВАТЬ:

Вывод CTRL + Xh:

tags in context :completion::complete:cd::
    local-directories named-directories      (_alternative _cd (eval)) 
    users named-directories directory-stack  (_tilde _alternative _cd (eval)) 
    users                                    (_users _tilde _alternative _cd (eval))

Я не уверен, что вы все еще отслеживаете этот вопрос, но я хотел бы помочь. Прошло некоторое время с тех пор, как я погрузился в кишки системы завершения zsh, так что это будет хорошим оправданием.

На данный момент мы будем использовать этот ответ как постоянный инструмент для меня, чтобы предоставить полезные лакомые кусочки, которые помогут вам (и мне) устранить проблему.

Как видите, система завершения zsh очень мощная. Иногда он выполняет элементы, которые вы не хотите выполнять. Например, вы почти всегда хотите ограничить аргументы команды cd каталогами. ОДНАКО в zsh это могут быть каталоги файловой системы, именованные каталоги, каталоги с различными переменными пути или даже каталоги, хранящиеся в стандартных переменных оболочки. Итак, я думаю, что первый шаг - это определить «контекст» вашего завершения.

Пожалуйста, перейдите в каталог my_folder выше, а затем введите:

cd p<CTRL-X>h

CTRL-Xh - это комбинация клавиш по умолчанию для отображения текущего контекста для завершения. Пожалуйста, дайте мне знать, каков результат этой комбинации клавиш. Например, мой вывод выглядел так:

tags in context :completion::complete:cd::
    local-directories  (_alternative _cd (eval))

Ключевой элемент, на который следует обратить внимание - это «локальные каталоги». Чего мы НЕ видим здесь, так это часто встречающегося элемента path-directoryies, который относится к каталогам, которые можно найти в $ cdpath, и, возможно, в других местах. (Навскидку не припомню.)

Если вы видите элементы, отличные от «локальных каталогов», это будет намеком на то, откуда может взяться эта мошенническая запись «прокси». Например, вот типы элементов, которые моя установка zsh попытается завершить, если я попытаюсь завершить работу с начала командной строки, ничего не набирая:

commands builtins functions aliases suffix-aliases reserved-words jobs parameters  

Вы действительно можете увидеть один или несколько из этих элементов с выводом CTRL-Xh или даже элементы, которые я не перечисляю выше. (Это всего лишь примеры)

Вот способ, которым вы можете помочь ограничить zsh предоставлением только локальных каталогов и каталогов $ cdpath в качестве параметров завершения:

zstyle ':completion:*:cd:*' tag-order local-directories path-directories

Если вам не нужна какая-то умеренно полезная магия компакт-диска, которую предлагает zsh, отбросьте «каталоги путей» с конца, и я верю, что вы получите желаемое поведение. Вы захотите поместить это в свой файл .zshrc, чтобы сделать его постоянным во всех сеансах. Позвольте мне знать, если это помогает.