Shell

zsh 完成:使用錯誤選項時停止完成

  • August 20, 2021

我的腳本foo將給定路徑中的目錄/foo/path作為參數,此外它還有一個可選參數-l

我有這個完成文件:

#compdef foo

_arguments : \
   '-l' \
   '*: :->directory'

case $state in
   directory)
       _directories -W /foo/path
;;
esac

我在完成時遇到以下問題:

當我使用錯誤的(不存在的)可選參數時,例如-c,然後按 Tab

foo -c <TAB>

然後它會自動完成存在的選項-l,就好像目錄完成已經被不存在的選項消除了一樣-c

這很奇怪,因為我至少預計它會再次提供目錄和-l.

但是無論如何,如果提供了錯誤/不存在的選項,我怎樣才能完全停止完成,以明確它不能繼續使用錯誤的選項?

使用此程式碼,我無法重現您描述的行為。之後foo -c ,如果我按Tab,提供的完成是目錄。

請注意,當您將狀態與 一起使用時_arguments,您應該將它使用的變數聲明為函式中的局部變數。如果沒有同名的全域變數,我認為在這種簡單的情況下並不重要。


我認為沒有辦法為所有以-. 如果存在無法辨識的選項,要禁用完成,我想不出比迭代參數更好的方法,即words1(命令名,獨占)和$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

引用自:https://unix.stackexchange.com/questions/665439