zsh automatycznie uzupełnia foldery, które nie istnieją

4

Po prostu zacząłem używać zsh z oh-my-zsh i zauważyłem coś dziwnego podczas autouzupełniania z cd.

Załóżmy, że mam folder:

my_folder/
    subfolder/
    another_subfolder/
    file.txt

Kiedy użyłem bash, mogłem wpisać:

$ cd p<tab>

I nic by się nie wydarzyło, ponieważ nic nie my_folderzaczyna się od p, ale jeśli zrobię to samo w Zsh, to automatycznie uzupełnia słowo proxy, które, jak zakładam, jest jakimś katalogiem w innym systemie plików?

Nie jestem pewien, czy coś jest źle skonfigurowane lub czy jest to coś w sposobie, w jaki autouzupełnianie działa w zsh, czego nie rozumiem.

EDYTOWAĆ:

Wyjście 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))
seth
źródło
nigdy nie korzystałem z zsh, ale wiem, że bash obsługuje uzupełnianie nazw hostów z / etc / hosts oprócz istniejących folderów. Czy w twoim pliku hosts jest serwer proxy?
penguin359
Czy $CDPATHzawiera katalog, który zawiera podkatalog o nazwie proxy? Jeśli tak, to pożądane zachowanie.
Gilles
Obie dobre sugestie, ale nie wygląda na to, żeby miało to coś wspólnego z plikiem hostów i $CDPATHpo prostu powraca ..
seth
Z ciekawości, czy w twoim systemie był użytkownik o nazwie „proxy”?
Larold
@ Larold Nie to widzę.
seth

Odpowiedzi:

5

Nie jestem pewien, czy nadal śledzisz to pytanie, ale chciałbym pomóc. Minęło trochę czasu, odkąd zagłębiłem się w system uzupełniania zsh, więc będzie to dobra wymówka.

Na razie wykorzystamy tę odpowiedź jako ciągłe narzędzie, aby dostarczyć użytecznych ciekawostek, które pomogą Tobie (i mnie) rozwiązać problem.

Jak widać, system uzupełniania zsh jest bardzo wydajny. Czasami wykonuje zadania, których nie chcesz uzupełniać. Na przykład prawie zawsze chcesz ograniczyć argumenty do polecenia „cd”, aby były katalogami. JEDNAK w Zsh mogą to być katalogi systemu plików, nazwane katalogi, katalogi w różnych zmiennych ścieżek, a nawet katalogi przechowywane w standardowych zmiennych powłoki. Myślę więc, że pierwszym krokiem jest określenie „kontekstu” ukończenia.

Przejdź do katalogu my_folder powyżej, a następnie wpisz:

cd p<CTRL-X>h

CTRL-Xh to domyślna kombinacja klawiszy wyświetlająca bieżący kontekst do ukończenia. Daj mi znać, jaki jest wynik działania tej kombinacji klawiszy. Na przykład moje dane wyjściowe wyglądały tak:

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

Kluczową kwestią, na którą należy zwrócić uwagę, są „katalogi lokalne”. To, czego nie widzimy tutaj, to często występujący element „path-katalogi”, który odnosi się do katalogów, które można znaleźć w $ cdpath i ewentualnie w innych lokalizacjach. (Nie pamiętam od razu.)

Jeśli zobaczysz elementy inne niż „katalogi lokalne”, będzie to wskazówka, skąd może pochodzić ten nieuczciwy wpis „proxy”. Na przykład, oto typy elementów, które moja konfiguracja zsh będzie próbowała wykonać, jeśli spróbuję ukończyć od początku wiersza poleceń bez wpisywania czegokolwiek:

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

Rzeczywiście możesz zobaczyć jeden lub więcej tych elementów z wyjściem CTRL-Xh, a nawet przedmioty, których nie wymieniłem powyżej. (To tylko przykłady)

Oto sposób, w jaki możesz pomóc ograniczyć zsh do zapewniania tylko lokalnych katalogów i katalogów $ cdpath jako opcji uzupełniania:

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

Jeśli nie chcesz jakiejś średnio przydatnej magii cd, którą oferuje zsh, porzuć „katalogi ścieżek” od końca i wierzę, że uzyskasz pożądane zachowanie. Będziesz chciał umieścić to w swoim pliku .zshrc, aby był trwały między sesjami. Daj mi znać, jeśli to pomoże.

Larold
źródło
Dziękuję Ci! To doskonale odpowiada na moje pytanie. Wygląda na to, że miałem więcej czasu w tym kontekście niż chciałem.
seth
@seth Czy z ciekawości udało Ci się znaleźć, jaki typ elementu „proxy” był lub skąd pochodzi?
Larold
Właściwie nie. Kiedy dzisiaj postanowiłem odtworzyć ten problem, otrzymałem kilka ciekawych sugestii z autouzupełniania, ale „proxy” nie było jednym z nich.
seth
Ciekawy. To zawsze niesamowite, ile różnych rzeczy może wykonać Zsh. Z pewnością trzeba trochę staranności, aby dostosować to, co zostanie ukończone, ale gdy poświęcisz temu trochę czasu, możesz osiągnąć niesamowite rezultaty.
Larold