···2233[](https://tangled.org/@jcg.re/tessen)
4455-`tessen` is a bash script that can autotype and copy data from [password-store][1] and [gopass][2]
66-files. A wayland native dmenu is required to use tessen and the following dmenu backends are
77-recognized
55+`tessen` is a bash script that can autotype and copy data from [password-store][1], [gopass][2]
66+and [prs][36]. A wayland native dmenu is required to use tessen and the following dmenu backends
77+are recognized
8899- [fuzzel][4]
1010- [tofi][15]
···24242525### Why use `tessen`?
26262727-- `tessen` can autotype or copy (or do both at the same time!) your password store and gopass data
2828- including all of your key-value pair data
2727+- `tessen` can autotype or copy (or do both at the same time!) your password store, gopass and prs
2828+ data including all of your key-value pair data
29293030 From what I've observed, most scripts out there do not autotype and copy all of your key-value
3131 pair data. They also do not offer choices about autotyping or copying data with the same
···51515252- [bash][16]
53535454-- at least one pass backend is needed - either [password-store][1] or [gopass][2]
5454+- at least one pass backend is needed - either [password-store][1], [gopass][2] or [prs][36]
55555656- at least one Wayland native dmenu backend, preferably [fuzzel][4], or [tofi][15], [bemenu][5],
5757 [yofi][32], [wofi][6], [rofi][3]
···130130131131## Features
132132133133-- autotype or copy (or both at the same time!) data, including all valid key-value pairs, in pass
134134- and gopass
133133+- autotype or copy (or both at the same time!) data, including all valid key-value pairs, in pass,
134134+ gopass and prs
135135- generate TOTP/HOTP
136136- open URLs
137137- use custom values for `user`, `password`, `url`, `autotype` keys
···226226[33]: https://social.treehouse.systems/@psykose/109967460650885493
227227[34]: https://pkgs.alpinelinux.org/packages?name=tessen
228228[35]: https://search.nixos.org/packages?query=tessen
229229+[36]: https://timvisee.com/projects/prs/
+1-1
config
···44# configuration file for tessen
55# place this file in $XDG_CONFIG_HOME/tessen/config
6677-# the default pass program to use - pass or gopass
77+# the default pass program to use - pass, gopass or prs
88# pass_backend="pass"
991010# the default dmenu backend program to use - rofi, fuzzel, bemenu, rofi, or dmenu
+15-6
tessen
···100100 if [[ ${#passdata[@]} -eq 0 ]]; then
101101 _die "the selected file is empty"
102102 fi
103103+ elif [[ $_PASS_BACKEND == "prs" ]]; then
104104+ mapfile -t passdata < <(prs show --quiet "$_TSN_PASSFILE")
105105+ if [[ ${#passdata[@]} -eq 0 ]]; then
106106+ _die "the selected file is empty"
107107+ fi
103108 elif [[ $_PASS_BACKEND == "gopass" ]]; then
104109 # the output from gopass show -n -f that prints the first line and the
105110 # newline before EOF doesn't use file descriptors but is printed only when
···314319315320 if [[ $_PASS_BACKEND == "pass" ]]; then
316321 tmp_otp="$(pass otp "$_TSN_PASSFILE")"
322322+ elif [[ $_PASS_BACKEND == "prs" ]]; then
323323+ tmp_otp="$(prs otp show --quiet "$_TSN_PASSFILE")"
317324 elif [[ $_PASS_BACKEND == "gopass" ]]; then
318325 tmp_otp="$(gopass otp -o "$_TSN_PASSFILE")"
319326 fi
···394401 printf "%s\n" "invalid clipboard timeout value in PASSWORD_STORE_CLIP_TIME" >&2
395402 return 1
396403 fi
404404+ elif [[ $_PASS_BACKEND == "prs" ]]; then
405405+ tsn_cliptime="20"
397406 elif [[ $_PASS_BACKEND == "gopass" ]]; then
398407 tsn_cliptime="$(gopass config core.cliptimeout)"
399408 tsn_cliptime="${tsn_cliptime##*: }"
···430439431440validate_pass_backend() {
432441 if ! is_installed "$1"; then
433433- _die "please install a valid password store backend: pass | gopass"
442442+ _die "please install a valid password store backend: pass | gopass | prs"
434443 fi
435435- if [[ $1 == "pass" ]] || [[ $1 == "gopass" ]]; then
444444+ if [[ $1 == "pass" ]] || [[ $1 == "gopass" ]] || [[ $1 == "prs" ]]; then
436445 _PASS_BACKEND="$1"
437446 else
438438- _die "please specify a valid password store backend: pass | gopass"
447447+ _die "please specify a valid password store backend: pass | gopass | prs"
439448 fi
440449}
441450···526535}
527536528537find_pass_backend() {
529529- local -a tmp_pass_arr=('pass' 'gopass')
538538+ local -a tmp_pass_arr=('pass' 'gopass' 'prs')
530539 local idx
531540532541 for idx in "${tmp_pass_arr[@]}"; do
···536545 fi
537546 done
538547 if [[ -z $_PASS_BACKEND ]]; then
539539- _die "please install a valid password store backend: pass | gopass"
548548+ _die "please install a valid password store backend: pass | gopass | prs"
540549 fi
541550542551 unset -v idx tmp_pass_arr
···811820 fi
812821813822 trap '_clear' EXIT TERM INT
814814- if [[ $_PASS_BACKEND == "pass" ]]; then
823823+ if [[ $_PASS_BACKEND == "pass" ]] || [[ $_PASS_BACKEND == "prs" ]]; then
815824 get_pass_files
816825 elif [[ $_PASS_BACKEND == "gopass" ]]; then
817826 get_gopass_files