#!/bin/zsh setopt no_unset warn_create_global zmodload zsh/stat zsh/datetime || exit $? typeset -ga clipboards typeset -g map=/run/display-container-map #set -x get-clip() { local sel out name=$1 local -a env=( env ) [[ -f /run/Xauthority.${DISPLAY#:} ]] && \ env+=( XAUTHORITY=/run/Xauthority.${DISPLAY#:} ) for sel in CLIPBOARD PRIMARY; do out=$( $env xclip -o -sel $sel ) && \ [[ -n $out ]] && clipboards[${sel:l}@$name]=$out done } scan() { local d f mtime local -a found files stat for d in /run/xclipring/*/*(/); do local -a l=( $d/*(.Nom) ) for f in $l[1,2]; do zstat -A stat +mtime $f || exit $? strftime -s mtime '%Y-%m-%dT%H:%M:%S' $stat[1] || exit $? files+=( "$mtime|$f" ) done done local -a sorted set +s -A sorted $files for f in $sorted; do mtime=${f%%|*} f=${f#*|} found=( $map/${f:h:t}=*(N) ) clipboards+=( $mtime/${${found[1]:-${f:h:t}}##*=}/${f:h:h:t} "$(<$f)" ) done } typeset -f -t scan print-clip() { local name content for name content in "${(kv@)clipboards}"; do printf '>> %s <<\n%s\n\n' $name $content done } print-clip-0() { local name content for name content in "${(kv@)clipboards}"; do printf '%s\0' $name $content done } main() { scan if (($#)) && [[ $1 == -0 ]]; then print-clip-0 else print-clip fi } main "$@"