shclip/shclip-menu

105 lines
2.7 KiB
Bash
Executable File

#!/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