dotfiles/.zsh/.functions/copy
2026-08-15 19:39:06 +01:00

47 lines
1.4 KiB
Text

# PIPED INPUT HANDLING
# read directly from standard input when no arguments are provided
if [ ! -t 0 ] && [ $# -eq 0 ]; then
wl-copy
return 0
fi
# ARGUMENT VALIDATION
# ensure at least one file argument is passed when not piping
if [ $# -eq 0 ]; then
echo "usage: copy <file...> or <command> | copy" >&2
return 1
fi
# FILE EXISTENCE CHECK
# verify the target argument is a readable file
if [ ! -r "$1" ]; then
echo "error: cannot read file '$1'" >&2
return 1
fi
# MIME TYPE DETECTION
# inspect the file header to determine the correct clipboard target
local mime_type
mime_type=$(file --mime-type -b "$1")
# CLIPBOARD DISPATCH
# route the file to wl-copy with the appropriate target flags
case "$mime_type" in
image/png|image/jpeg|image/webp|image/gif|image/bmp)
wl-copy -t "$mime_type" < "$1"
echo "copied $1 ($mime_type) to clipboard."
;;
image/svg+xml)
if command -v rsvg-convert >/dev/null 2>&1; then
rsvg-convert "$1" | wl-copy -t image/png
echo "rasterised $1 to png and copied to clipboard."
else
wl-copy -t image/svg+xml < "$1"
echo "copied $1 (raw svg) to clipboard. install librsvg for automatic png rasterisation."
fi
;;
*)
cat "$@" | wl-copy
echo "copied text content ($# file(s)) to clipboard."
;;
esac