我正在嘗試為密碼管理器腳本建立簡單的 zsh 完成規則pass
。
pass
將其密碼儲存在目錄結構中,檔案本身就是.gpg
檔案。
我想完成給定路徑中的目錄和文件$HOME/passwords
,以便簡單地完成目錄名稱,並且完成文件名稱而不帶.gpg
擴展名
以下規則正確完成目錄名稱,
#compdef pass
_pass() {
_arguments '1: :->directory'
case $state in
directory)
_directories -W $HOME/passwords
;;
esac
}
但它用全名來完成檔名,即foo.gpg
.
如何完成沒有.gpg
副檔名的檔案?
答案1
基本思想是_files -g '*.gpg(:r)'
:完整*.gpg
文件,但在執行此操作時剝離其擴展名,使用r
歷史修改器透過作為全域限定符。但是,這不會在成功完成後自動插入空格。
所以打電話_path_files
分別為目錄和文件明確添加適當的後綴(/
或空格)-S
(_path_files
傳遞到compadd
。
_path_files -W $HOME/passwords -g '*(/)' -S /
_path_files -W $HOME/passwords -g '*.gpg(:r)' -S ' '