Shell

zsh 補全:以任何順序為文件和 –options 提供補全

  • August 15, 2021

我有範例命令foo,它採用一個或多個文件名,以及 3 個 –options 的任意組合。此外,可以在命令行上的任何位置,在文件名之前、之後或之間指定選項。

foo --bbb file.txt --aaa file2.txt --ccc

我有這個完成文件,我在其中指定了藥水:

#compdef foo

local -a args

args+=(
   '--aaa'
   '--bbb'
   '--ccc'
)

我必須在最後添加什麼,以便使用我的 –options 完成本地文件?

您可以compadd根據需要多次呼叫內置函式來聲明更多完成。通常,這是通過“新”完成系統的許多輔助功能之一發生的。

您可以做的最簡單的事情是同時呼叫compadd_files

#compdef foo
local -a args
args=(--aaa --bbb --ccc)
compadd -- $args
_files

而不是compadd直接呼叫,您應該呼叫一個幫助函式,例如_describe它允許根據上下文配置完成並具有描述。

#compdef foo
local args
args=('--aaa:Enable aye' '--bbb:Enable bee' '--ccc:Enable sea')
_describe -o 'Options' args
_files

_arguments函式通常可以更輕鬆地指定命令的完成,儘管在您的簡單情況下並沒有太多好處。如果您的命令支持--指示後面的所有內容--是文件名而不是選項,請使用它,即使它以破折號開頭 - 這就是_arguments’s -Soption 的作用。before 選項表示該*選項可能出現多次;沒有它,如果它已經存在,將不會再次提供該選項。

#compdef foo
_arguments -S \
   '*--aaa[Enable aye]' \
   '*--bbb[Enable bee]' \
   '*--ccc[Enable sea]' \
   '*:file:_files'

如果您的命令支持--help以與 GNU 建立的事實標準足夠接近的格式列印幫助,您可以告訴_arguments解析 的輸出--help,然後您只需要指定無法從--help輸出中推斷出的更精細的行為.

#compdef foo
_arguments --

如果您不需要從--help輸出中推斷出的任何內容,則無需定義完成函式:只需聲明_gnu_generic為命令的完成函式即可。

compdef _gnu_generic foo

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