Shell

zsh 完成:需要數字作為參數的完整選項

  • August 19, 2021

我有一個腳本foo,它採用以下形式的幾個可選命令行參數:

foo -A <NUM> -B <NUM> -i

或者也可以沒有空格:

foo -A<NUM> -B<NUM> -i

其中 NUM 是整數。該腳本不應完成文件名/目錄。

我有以下完成規則:

#compdef foo

local -a args

_arguments -S \
   '*-A' \
   '*-B' \
   '*-i'

我必須添加什麼,以便完成知道選項-A-B自己不完成,但需要一個數字才能繼續完成?

在另一個腳本中,我有類似的情況,唯一的區別是選項使用=

foo --port=<PORT>

我怎麼也能做到這一點?

更新:

我遇到了奇怪的問題,完成後:

#compdef foo

_arguments -S \
   '-A+:' \
   '-B+:' \
   '-i'

由於某種原因,第一個參數A被忽略,即:

foo -<TAB>
-B -i

但是當我把其他選項放在前面時A

#compdef foo

_arguments -S \
   '-x+:' \
   '-A+:' \
   '-B+:' \
   '-i'

then 不僅會A顯示,還會顯示其他新選項:

foo -<TAB>
-A  -B  -i  -x

這裡發生了什麼?

告訴_arguments該選項需要一個參數。選項後面的表示該+選項可以在同一個詞中,也可以在單獨的詞中。第一個之後的部分:是生成匹配時顯示的消息,這裡沒有任何意義,因為不會有任何完成。第二列之後的部分是補全函式,大概沒有。

_arguments -S : \
   '*-A+:number:' \
   '*-B+:number:' \
   '*-i'

對於長選項,如果同時接受and或僅接受,則放在選項名稱之後=而不是放在選項名稱之後。對於網路 (TCP/UDP) 埠,如果您的命令接受埠名稱,請用作完成函式。:``--port 123``--port=123``=-``--port=123``_port

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