105 lines
2.7 KiB
Bash
Executable File
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
|