Significant rewrite of maximbaz's clipboard tool
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.
This commit is contained in:
		
							parent
							
								
									f22e414af7
								
							
						
					
					
						commit
						e79c2439f9
					
				| 
						 | 
					@ -12,6 +12,7 @@ set $tty-popup $scripts/tty-popup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set $menu bash $scripts/menu
 | 
					set $menu bash $scripts/menu
 | 
				
			||||||
set $pass_menu $tty-popup pass $scripts/fzf-pass
 | 
					set $pass_menu $tty-popup pass $scripts/fzf-pass
 | 
				
			||||||
 | 
					set $clip_menu $tty-popup pass $scripts/clipboard menu
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set $printscreen bash $scripts/printscreen
 | 
					set $printscreen bash $scripts/printscreen
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,6 +12,8 @@ bindsym $mod+backslash exec $pass_menu
 | 
				
			||||||
# reload the configuration file
 | 
					# reload the configuration file
 | 
				
			||||||
bindsym $mod+Shift+c reload
 | 
					bindsym $mod+Shift+c reload
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bindsym $mod++c exec $clip_menu
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# exit sway (logs you out of your Wayland session)
 | 
					# exit sway (logs you out of your Wayland session)
 | 
				
			||||||
bindsym $mod+Shift+e exec swaynag -t \
 | 
					bindsym $mod+Shift+e exec swaynag -t \
 | 
				
			||||||
        warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' \
 | 
					        warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,50 +1,126 @@
 | 
				
			||||||
#!/bin/bash
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
workdir="${XDG_DATA_HOME:-$HOME/.local/share/clipboard/history}"
 | 
					workdir="${XDG_DATA_HOME:-$HOME/.local/share/clipboard/history}"
 | 
				
			||||||
mkdir -p "$workdir"
 | 
					maxsize="${CLIPBOARD_MAX_SIZE:-30M}"
 | 
				
			||||||
cd "$workdir"
 | 
					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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if [ "$1" = "daemon" ]; then
 | 
					 | 
				
			||||||
    wl-paste -w $0 on-copy
 | 
					 | 
				
			||||||
elif [ "$1" = "lock" ]; then
 | 
					 | 
				
			||||||
    touch .lock
 | 
					 | 
				
			||||||
elif [ "$1" = "unlock" ]; then
 | 
					 | 
				
			||||||
    rm -f .lock
 | 
					 | 
				
			||||||
elif [ "$1" = "on-copy" ]; then
 | 
					 | 
				
			||||||
    [ -f .lock ] && exit 0
 | 
					 | 
				
			||||||
    file="$(date +%s)"
 | 
					    file="$(date +%s)"
 | 
				
			||||||
    cat >"$file"
 | 
					    cat | sed -e 's/^[ \t]*//' >"$file"
 | 
				
			||||||
    ext="$(file --mime-type "$file" | cut -d' ' -f2 | cut -d'/' -f2)"
 | 
					    ext="$(file --mime-type "$file" | cut -d' ' -f2 | cut -d'/' -f2)"
 | 
				
			||||||
    mv "$file" "$file.$ext"
 | 
					    mv "$file" "$file.$ext"
 | 
				
			||||||
    fdupes -idN .
 | 
					    fdupes -idN .
 | 
				
			||||||
    find . -type f -size 0 -delete
 | 
					    find . -type f -size 0 -delete
 | 
				
			||||||
    find . -type f -size +10000000c -delete
 | 
					    find . -type f -size "+$maxsize" -delete
 | 
				
			||||||
    find . -type f -print0 | sort -zn | head -z -n -10000 | xargs -r -0 rm
 | 
					    find . -type f -print0 \
 | 
				
			||||||
elif [ "$1" = "dmenu" ]; then
 | 
					        | sort -zn \
 | 
				
			||||||
    find . -type f -printf '%P\0' | sort -znr | while IFS= read -r -d '' file; do
 | 
					        | 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
 | 
					        if [[ "$file" =~ \.(plain|x-python)$ ]]; then
 | 
				
			||||||
            cat "$file"
 | 
					            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
 | 
					        else
 | 
				
			||||||
            printf '%s' "$file"
 | 
					            printf "%s${delim}" "$file" "${red}${reset} $file"
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
        printf '\0'
 | 
					        printf '\0'
 | 
				
			||||||
    done | dmenu -0 -p clipboard -r "$(realpath "$0") preview" | {
 | 
					    done
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					parse-file(){
 | 
				
			||||||
 | 
					        echo "$1" | awk '{print $1}' FS="$delim"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					on-select(){
 | 
				
			||||||
        read -r -d '' result
 | 
					        read -r -d '' result
 | 
				
			||||||
        if [ -z "$result" ]; then
 | 
					        if [ -z "$result" ]; then
 | 
				
			||||||
            exit 0
 | 
					            exit 0
 | 
				
			||||||
        elif [ -f "$result" ]; then
 | 
					 | 
				
			||||||
            wl-copy <"$result"
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            printf '%s' "$result" | sed -e 's/[[:space:]]*$//' | sed -Ez 's/\s+$//' | wl-copy
 | 
					 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
    }
 | 
					        (cat "$(parse-file "${result}")" || exit 1) | wl-copy
 | 
				
			||||||
elif [ "$1" = "preview" ]; then
 | 
					}
 | 
				
			||||||
    if [ -f "$2" ]; then
 | 
					
 | 
				
			||||||
        kitty +kitten icat --silent --stdin=no "$2"
 | 
					menu(){
 | 
				
			||||||
    else
 | 
					       #--bind "del:execute-silent($0 delete '{}')+abort" \
 | 
				
			||||||
        echo "$2" | bat -l bash --color always -pp
 | 
					       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
 | 
					    fi
 | 
				
			||||||
else
 | 
					    
 | 
				
			||||||
    echo >&2 "Usage: $0 <daemon|lock|unlock|on-copy|dmenu|preview>"
 | 
					    printf $(bat -l bash --color always -pp "$file")
 | 
				
			||||||
    exit 1
 | 
					}
 | 
				
			||||||
fi
 | 
					
 | 
				
			||||||
 | 
					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;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user