我正在尝试为密码管理器脚本创建简单的 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 ' '