James Patrick
e79c2439f9
Currently this adds file object and descriptions separated by a control delim, rather than raw clipboard text, fixes some issues with invalidly rendered null terminated clipped objects. I am also working on a delete function that uses fzf --bind method and the reload function. This is currently not working for some unknown issue. I'm working on resolving this issue.
127 lines
3.2 KiB
Bash
Executable File
127 lines
3.2 KiB
Bash
Executable File
#!/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"
|
|
#delim=":::::::"
|
|
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;
|