#!/bin/bash workdir="${XDG_DATA_HOME:-$HOME/.local/share/clipboard/history}" maxsize="${CLIPBOARD_MAX_SIZE:-30M}" histcount="${CLIPBOARD_HISTORY_COUNT:-300}" red=$(tput setaf 1) reset=$(tput sgr0) delim="\034" umask 077 mkdir -p "$workdir" cd "$workdir" || exit daemon(){ echo "values may be subject to change" echo " workdir: $workdir" echo " maxsize: $maxsize" echo " histcount: $histcount" echo " current: $(find "${workdir}" | wc | awk '{print $2}')" wl-paste -w "$0" on-copy } on-copy(){ if [ -f "$workdir/.lock" ] ; then echo "script is currently locked." exit 0 fi file="$(date +%s)" cat | sed -e 's/^[ \t]*//' >"$file" ext="$(file --mime-type "$file" | cut -d' ' -f2 | cut -d'/' -f2)" mv "$file" "$file.$ext" fdupes -idN . find . -type f -size 0 -delete find . -type f -size "+$maxsize" -delete find . -type f -print0 \ | sort -zn \ | head -z --lines="-$histcount" \ | xargs -r -0 rm } list(){ find . -type f -printf '%P\0' \ | sort -znr \ | while IFS= read -r -d '' file ; do if [[ "$file" =~ \.(plain|x-python)$ ]]; then printf "%s${delim}" "$file" "${red}${reset} $(sed ':a;N;$!ba;s/\n/+/g' < "$file")" elif [[ "$file" =~ \.octet-stream$ ]]; then printf "%s${delim}" "$file" "${red}${reset} $(sed ':a;N;$!ba;s/\n/+/g' < "$file")" else printf "%s${delim}" "$file" "${red}${reset} $file" fi printf '\0' done } parse-file(){ echo "$1" | awk '{print $1}' FS="$delim" } on-select(){ read -r -d '' result if [ -z "$result" ]; then exit 0 fi (cat "$(parse-file "${result}")" || exit 1) | wl-copy } menu(){ #--bind "del:execute-silent($0 delete '{}')+abort" \ list | fzf --read0 +s \ --info=hidden \ --reverse \ -d "${delim}" --nth ..2 --with-nth 2 \ --bind="del:execute()" \ --prompt='clip:: ' \ --pointer='➜' \ --color="gutter:0,prompt:4" \ --no-multi \ --preview "$0 preview '{}'" --preview-window=down:3:wrap --ansi \ | on-select } usage(){ cat <<EOF Hello, this is the usuage menu. $0 supports the following arguments. - deamon :: starts a process that watches the clipboard, calling on-copy on copy. - on-copy :: saves clipped content to history folder. Dedups, and trims as well. - menu :: clip history menu using fzf. - list :: null terminated list that fzf populates. Need fo fzf reload. - lock :: prevents daemon/on-clip from saving value. Use for passwords, etc. - unlock :: like lock, but in reverse. - preview :: the preview used by fzf. Requires clip file. EOF } preview(){ local file file="$(parse-file "$1")" if [ -f "$1" ]; then kitty +kitten icat --silent --stdin=no "$1" return fi printf $(bat -l bash --color always -pp "$file") } case "$1" in daemon|on-copy|menu|list) $1;; lock) touch "$workdir/.lock" ; echo "locked";; unlock) rm -f "$workdir/.lock" ; echo "unlocked";; preview) shift ; preview "$*";; *) usage;; esac exit;