從 ZSH 自動完成中排除環境變數
快速範例:
~ $ wor<TAB> ~ $ WORDCHARS= WORDCHARS WORKON_HOME WORKON_HOME workon
workon
是所需的命令。有沒有辦法從 ZSH 中的自動完成中排除環境變數?
我沒有找到這樣的選項,但如果您的完成區分大小寫,也許您會得到幫助。你可以在你的
~/.zshrc
:# Set to this to use case-sensitive completion CASE_SENSITIVE="true"
TL; 博士
將此添加到您的
~/.zshrc
function _parameters() {}
解釋:
在 zsh 補全系統中,每個可補全模式都與某個補全函式相匹配。在命令位置呼叫完成的情況下(在 zsh 術語中),zsh 呼叫與特殊模式關聯的函式
-command-
。
_comps_
所有完成模式和函式都作為關聯數組儲存在變數中。因此,您可以看到呼叫哪個函式來完成如下命令:echo ${_comps[-command-]}
在我的情況下,功能是
_command_names
. 如果我們看一下這個函式的原始碼,whence -f _command_names
然後你會看到所有可能完成的來源。如果完成前綴包含斜杠、別名、函式、作業、保留字以及最重要的參數,包括環境變數,則它可以是內置的、路徑上的執行檔、本地執行檔。查看我的程式碼,
_command_names
我發現是否應該建議參數不是可配置的 - 該_parameters
函式總是被呼叫。該_parameters
功能似乎也沒有足夠的可配置性。在這一點上,我們知道的足夠多,可以看看一些解決方案。一種是修改
_command_names
和刪除parameters:_parameters
源。另一個是使該_parameters
功能成為空操作。第二個選項看起來不太容易出錯,因此是我的建議。請注意,覆蓋該
_parameters
函式還會禁用其他地方的完成環境變數(例如,鍵入$
然後按 Tab)。為了允許在其他地方完成環境變數,修補_parameters
而不是覆蓋它是一種可能的解決方案。這是一個例子:autoload +X _parameters # load it for patching latter functions[_parameters]=" [[ \$curcontext = -command- ]] && return $functions[_parameters]"
$curcontext
如果被呼叫的完成函式的上下文在程序名稱中,它會跳過處理環境變數。$curcontext
在執行修補函式之前,需要轉義它以進行擴展。