Reglas de finalización de zsh: eliminar la extensión de archivo del resultado de finalización

Reglas de finalización de zsh: eliminar la extensión de archivo del resultado de finalización

Estoy intentando crear reglas simples de finalización de zsh para un script de administrador de contraseñas pass.

passalmacena sus contraseñas en la estructura de directorios, los archivos en sí son .gpgarchivos.

Quiero completar directorios y archivos en la ruta dada $HOME/passwords, de modo que los nombres de los directorios se completen simplemente y los nombres de los archivos se completen sin .gpgextensión.

Las siguientes reglas completan los nombres de directorio correctamente,

#compdef pass

_pass() {
    _arguments '1: :->directory'
    case $state in

    directory)
        _directories -W $HOME/passwords
    ;;

    esac
}

pero completa los nombres de archivos por su nombre completo, es decir foo.gpg.

¿Cómo puedo completar archivos sin la .gpgextensión?

Respuesta1

La idea básica es _files -g '*.gpg(:r)': completar *.gpgarchivos, pero quitarles su extensión mientras lo hace, usando elr modificador de historiapasó como uncalificador global. Sin embargo, esto no inserta automáticamente un espacio después de una finalización exitosa.

Entonces llama_path_filespor separado para directorios y archivos para agregar el sufijo apropiado ( /o un espacio) explícitamente con -S(que _path_filespasa acompadd.

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

información relacionada