Shell

從 ZSH 自動完成中排除環境變數

  • October 19, 2021

快速範例:

~ $ 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在執行修補函式之前,需要轉義它以進行擴展。

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