Estou tentando criar regras simples de conclusão zsh para um script de gerenciador de senhas pass
.
pass
armazena suas senhas na estrutura de diretórios, os arquivos em si são .gpg
arquivos.
Quero completar diretórios e arquivos em determinado caminho $HOME/passwords
, para que os nomes dos diretórios sejam simplesmente preenchidos e os nomes dos arquivos sejam concluídos sem .gpg
extensão
As regras a seguir completam os nomes dos diretórios corretamente,
#compdef pass
_pass() {
_arguments '1: :->directory'
case $state in
directory)
_directories -W $HOME/passwords
;;
esac
}
mas completa os nomes dos arquivos pelo nome completo, ou seja foo.gpg
, .
Como posso completar arquivos sem a .gpg
extensão?
Responder1
A ideia básica é _files -g '*.gpg(:r)'
: completar *.gpg
os arquivos, mas retirar suas extensões ao fazê-lo, usando or
modificador de históricopassou como umqualificador global. No entanto, isso não insere automaticamente um espaço após a conclusão bem-sucedida.
Então ligue_path_files
separadamente para diretórios e arquivos para adicionar o sufixo apropriado ( /
ou um espaço) explicitamente com -S
(que _path_files
passa paracompadd
.
_path_files -W $HOME/passwords -g '*(/)' -S /
_path_files -W $HOME/passwords -g '*.gpg(:r)' -S ' '