zsh 完成規則 - 從完成結果中刪除檔案副檔名

zsh 完成規則 - 從完成結果中刪除檔案副檔名

我正在嘗試為密碼管理器腳本建立簡單的 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 ' '

相關內容