Command-Line

自定義腳本的 zsh 補全

  • May 6, 2022

我有zsh completion我的自定義腳本。它需要 3 個可選參數--insert, --edit--rm並從給定路徑完成文件:

#compdef pass

_pass() {

 local -a args

 args+=(
   '--insert[Create a new password entry]'
   '--edit[Edit a password entry]'
   '--rm[Delete a password entry]'
 )

 _arguments $args '1: :->directory'

 case $state in
 directory)
   _path_files -W $HOME/passwords -g '*(/)' -S /
   _path_files -W $HOME/passwords -g '*.gpg(:r)' -S ' '
   ;;
 esac
}

我需要添加另一個選項-P,也將提供完成(當我輸入-and時TAB),但不提供路徑完成。這個選項應該只接受一個字元串。-P所以它不應該匹配一個路徑,如果已經指定,它也不應該提供其他選項。

如何將此新選項添加到我的完成腳本?

更新:

完成不適用於 option -P,即當我這樣做時:

pass -P <TAB>

它什麼也不做,因為選項 -P 需要一個字元串。這很好。但是,當我這樣做時

pass -P foo <TAB> 

它也沒有完成任何事情。但它應該完成目前路徑中的目錄。怎麼能這樣做?

假設您提到的所有選項都是相互排斥的,那麼解決方案如下:

#compdef pass

_pass() {
 local -a args=(
     # (-) makes an option mutually exclusive with all other options. 
     '(-)--insert[Create a new password entry]'
     '(-)--edit[Edit a password entry]'
     '(-)--rm[Delete a password entry]'
     '(-)-P:string:'
     '1:password entry:->directory'
 )

 _arguments $args

 case $state in
   directory)
     _path_files -W $HOME/passwords -g '*(/)' -S /
     _path_files -W $HOME/passwords -g '*.gpg(:r)' -S ' '
     ;;
 esac
}

此處的文件:http: //zsh.sourceforge.net/Doc/Release/Completion-System.html#index-_005farguments

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