Zsh

zsh 自動完成不存在的文件夾

  • September 14, 2011

剛開始將 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 中,這些可能是文件系統目錄、命名目錄、各種路徑變數中的目錄,甚至是儲存在標準 shell 變數中的目錄。所以,我認為第一步是確定你完成的“背景”。

請 cd 進入上面的 my_folder 目錄,然後鍵入:

cd p<CTRL-X>h

CTRL-Xh 是顯示目前完成上下文的預設組合鍵。請讓我知道這個組合鍵的輸出是什麼。例如,我的輸出如下所示:

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

要注意的關鍵項目是“本地目錄”。我們在這裡看不到的是一個常見的項目“路徑目錄”,它指的是可以在 $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 提供的一些適度有用的 cd 魔法,請從末尾刪除“路徑目錄”,我相信您會得到您想要的行為。您需要將其放入您的 .zshrc 文件中,以使其在會話中持久存在。讓我知道這是否有幫助。

引用自:https://serverfault.com/questions/288129