#!/bin/sh # shclip, by yosh # https://git.unix.dog/yosh/shclip set -eu # config file if exists SHCLIP_CONFIG_DIR="${SHCLIP_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/shclip}" . "$SHCLIP_CONFIG_DIR/config" SHCLIP_MENU_MAIN_CMD=${SHCLIP_MENU_MAIN_CMD:-fzfmenu -p shclip} SHCLIP_MENU_DEL_CMD=${SHCLIP_MENU_DEL_CMD:-${SHCLIP_MENU_MAIN_CMD}} SHCLIP_MENU_COPY_CMD=${SHCLIP_MENU_COPY_CMD:-${SHCLIP_MENU_MAIN_CMD}} SHCLIP_MENU_EDIT_CMD=${SHCLIP_MENU_EDIT_CMD:-${SHCLIP_MENU_MAIN_CMD}} SHCLIP_TEXT_EDITOR=${SHCLIP_TEXT_EDITOR:-xdg-open} SHCLIP_IMAGE_EDITOR=${SHCLIP_IMAGE_EDITOR:-gimp -n} SHCLIP_TEMP_DIR="${XDG_RUNTIME_DIR:-${TMPDIR:-/tmp}}/shclip-$USER-$DISPLAY" showmenu() { choice="$(printf 'copy\ndelete\nedit\nshclip toggle\nfilter toggle\nexit' | $SHCLIP_MENU_MAIN_CMD)" case $choice in delete) delmenu ;; copy) copymenu ;; edit) editmenu ;; shclip*) [ -d "$SHCLIP_TEMP_DIR/lock" ] && kill -s USR1 "$(cat "$SHCLIP_TEMP_DIR/pid")" ;; filter*) [ -d "$SHCLIP_TEMP_DIR/lock" ] && kill -s USR2 "$(cat "$SHCLIP_TEMP_DIR/pid")" ;; *) exit ;; esac } menu_gen() { while read -r ind; do file="$SHCLIP_TEMP_DIR/$ind" [ ! -f "$file" ] && continue # build menu mime="$(file -bi "$file")" if [ "${mime%%/*}" = "text" ]; then preview="${ind%%.*} | $(dd if="$file" bs=128 count=1 2>/dev/null | tr '\n' ' ')" else preview="${ind%%.*} * --- ${mime%%;*} --- $(du -k "$file" | cut -f 1)KiB" fi printf '%s\n' "${preview}" done < "$SHCLIP_TEMP_DIR/order" } delmenu() { choice="$({ echo "ALL"; menu_gen; } | $SHCLIP_MENU_DEL_CMD | cut -d ' ' -f 1)" case $choice in ALL) set +f rm -f "$SHCLIP_TEMP_DIR"/*.clip set -f ;; [0-9]*) rm -f "$SHCLIP_TEMP_DIR/$choice.clip" ;; *) exit 1 ;; esac } copymenu() { choice="$(menu_gen | $SHCLIP_MENU_COPY_CMD | cut -d ' ' -f 1)" case $choice in [!0-9]*) exit 1 ;; *) ;; esac mime="$(file -bi "$SHCLIP_TEMP_DIR/$choice.clip")" ln="$(grep -n "$choice" "$SHCLIP_TEMP_DIR/order")" ed -s "$SHCLIP_TEMP_DIR/order" - <<-EOF ${ln%%:*}m0 wq EOF case $mime in text*) xclip -sel clipboard "$SHCLIP_TEMP_DIR/$choice.clip" ;; *) xclip -sel clipboard -t "${mime%%;*}" "$SHCLIP_TEMP_DIR/$choice.clip" ;; esac exit } editmenu() { choice="$(menu_gen | $SHCLIP_MENU_EDIT_CMD | cut -d ' ' -f 1)" case $choice in [!0-9]*) exit 1 ;; *) ;; esac mime="$(file -bi "$SHCLIP_TEMP_DIR/$choice.clip")" case $mime in image/*) mv "$SHCLIP_TEMP_DIR/$choice.clip" "$SHCLIP_TEMP_DIR/$choice.png" $SHCLIP_IMAGE_EDITOR "$SHCLIP_TEMP_DIR/$choice.png" mv "$SHCLIP_TEMP_DIR/$choice.png" "$SHCLIP_TEMP_DIR/$choice.clip" ;; *) $SHCLIP_TEXT_EDITOR "$SHCLIP_TEMP_DIR/$choice.clip" ;; esac exit } while true; do showmenu done