#!/bin/sh # Copyright (C) 2016 Richard Burke, ISC licensed # shellcheck disable=SC2317 set -e vc_fatal() { echo "$@" >&2 exit 1 } vc_usage() { vc_fatal "Usage: $(basename "$0") [--selection sel] [--usable|--copy|--paste] Copy/paste clipboard interface with support on all provided platforms. Options: --copy copy text from standard input --paste paste text to standard output --usable silently exit with a status code indicating if a supported clipboard implementation was found --selection take input from sel. valid options: clipboard, primary" } vc_determine_command() { if [ -n "$WAYLAND_DISPLAY" ]; then for c in wl-copy wl-paste; do if command -v "$c" >/dev/null 2>&1; then echo "wlclipboard" return 0 fi done for c in waycopy waypaste; do if command -v "$c" >/dev/null 2>&1; then echo "wayclip" return 0 fi done fi if [ -n "$DISPLAY" ]; then for c in xclip xsel; do if command -v "$c" >/dev/null 2>&1; then echo "$c" return 0 fi done fi if command -v pbcopy >/dev/null 2>&1; then echo 'mac' return 0 fi if [ -c /dev/clipboard ]; then echo 'cygwin' return 0 fi return 1 } vc_usable() { if vc_determine_command >/dev/null 2>&1; then exit 0 fi exit 1 } vc_copy() { COPY_CMD="$(vc_determine_command 2>/dev/null)" # shellcheck disable=SC2181 if [ $? -ne 0 ] || [ -z "$COPY_CMD" ]; then vc_fatal 'System clipboard not supported' fi "vc_${COPY_CMD}_copy" exit $? } vc_paste() { PASTE_CMD="$(vc_determine_command 2>/dev/null)" # shellcheck disable=SC2181 if [ $? -ne 0 ] || [ -z "$PASTE_CMD" ]; then vc_fatal 'System clipboard not supported' fi "vc_${PASTE_CMD}_paste" exit $? } vc_wlclipboard_copy() { if [ "$sel" = "primary" ]; then wl-copy --primary -t TEXT 2>/dev/null else wl-copy -t TEXT 2>/dev/null fi } vc_wlclipboard_paste() { if [ "$sel" = "primary" ]; then wl-paste --no-newline --primary -t text else wl-paste --no-newline -t text fi } vc_wayclip_copy() { if [ "$sel" = "primary" ]; then waycopy -p else waycopy fi } vc_wayclip_paste() { if [ "$sel" = "primary" ]; then waypaste -p else waypaste fi } vc_xsel_copy() { xsel --"$sel" -i } vc_xsel_paste() { xsel --"$sel" -o } vc_xclip_copy() { xclip -selection "$sel" -i >/dev/null 2>&1 } vc_xclip_paste() { xclip -selection "$sel" -o } vc_mac_copy() { pbcopy } vc_mac_paste() { pbpaste } vc_cygwin_copy() { cat >/dev/clipboard } vc_cygwin_paste() { cat /dev/clipboard } while [ $# -gt 0 ]; do case "$1" in --usable) fn=vc_usable;; --copy) fn=vc_copy;; --paste) fn=vc_paste;; --selection) shift if [ "$1" != "clipboard" ] && [ "$1" != "primary" ]; then vc_fatal "Invalid selection: $1\nValid options are 'clipboard' or 'primary'" fi sel="$1";; *) vc_usage;; esac shift done sel=${sel:-"clipboard"} $fn vc_usage