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 ' '

相关内容