126 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			126 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"
 | 
						|
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;
 |