#!/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 wl-paste local file file="$(parse-file "${result}")" wl-copy < "$file" swaymsg exec "ydotool type $(wl-paste | sed -e "s/'/'\\\\''/g; 1s/^/'/; \$s/\$/'/")" } menu(){ list | fzf --read0 +s \ --info=hidden \ --reverse \ -d "${delim}" --nth ..2 --with-nth 2 \ --bind="del:execute-silent($0 delete {})+reload($0 list),f1:execute($0 qr {})" \ --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. - delete :: deletes the file, requires file. - qr :: bind to f1. Displays a qr code of the value. EOF } qr(){ local file file="$(parse-file "$1")" cat $file | qrencode -o - \ --size=25 \ --background=161720 \ --foreground=AAB5C6 | feh - } delete(){ local file file="$(parse-file "$1")" rm $file } preview(){ local file file="$(parse-file "$1")" if [ -f "$1" ]; then kitty +kitten icat --silent --stdin=no "$1" return fi 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|delete|qr) var=$1 shift ; $var $*;; *) usage;; esac exit;