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_filescompadd

_path_files -W $HOME/passwords -g '*(/)' -S /
_path_files -W $HOME/passwords -g '*.gpg(:r)' -S ' '

関連情報