Shell
zsh 完成:使用錯誤選項時停止完成
我的腳本
foo
將給定路徑中的目錄/foo/path
作為參數,此外它還有一個可選參數-l
。我有這個完成文件:
#compdef foo _arguments : \ '-l' \ '*: :->directory' case $state in directory) _directories -W /foo/path ;; esac
我在完成時遇到以下問題:
當我使用錯誤的(不存在的)可選參數時,例如
-c
,然後按 Tabfoo -c <TAB>
然後它會自動完成存在的選項
-l
,就好像目錄完成已經被不存在的選項消除了一樣-c
。這很奇怪,因為我至少預計它會再次提供目錄和
-l
.但是無論如何,如果提供了錯誤/不存在的選項,我怎樣才能完全停止完成,以明確它不能繼續使用錯誤的選項?
使用此程式碼,我無法重現您描述的行為。之後
foo -c
,如果我按Tab
,提供的完成是目錄。請注意,當您將狀態與 一起使用時
_arguments
,您應該將它使用的變數聲明為函式中的局部變數。如果沒有同名的全域變數,我認為在這種簡單的情況下並不重要。我認為沒有辦法為所有以
-
. 如果存在無法辨識的選項,要禁用完成,我想不出比迭代參數更好的方法,即words
1(命令名,獨占)和$CURRENT
(正在完成的單詞,獨占)之間的元素。local context state state_descr line typeset -A opt_args _arguments : \ '-l' \ '*: :->directory' local i for ((i = 2; i < CURRENT; i++)); do if [[ $words[$i] = -* && $words[$i] != -l ]]; then state=nothing break fi done case $state in directory) _directories -W /usr ;; esac