vis

a vi-like editor based on Plan 9's structural regular expressions

git clone https://9o.is/git/vis.git

vis-clipboard

(3072B)


      1 #!/bin/sh
      2 # Copyright (C) 2016 Richard Burke, ISC licensed
      3 # shellcheck disable=SC2317
      4 set -e
      5 
      6 vc_fatal() {
      7 	echo "$@" >&2
      8 	exit 1
      9 }
     10 
     11 vc_usage() {
     12 	vc_fatal "Usage: $(basename "$0") [--selection sel] [--usable|--copy|--paste]
     13 
     14 Copy/paste clipboard interface with support on all provided platforms.
     15 
     16 Options:
     17     --copy       copy text from standard input
     18     --paste      paste text to standard output
     19     --usable     silently exit with a status code indicating if a supported
     20                  clipboard implementation was found
     21     --selection  take input from sel. valid options: clipboard, primary"
     22 }
     23 
     24 vc_determine_command() {
     25 	if [ -n "$WAYLAND_DISPLAY" ]; then
     26 		for c in wl-copy wl-paste; do
     27 			if command -v "$c" >/dev/null 2>&1; then
     28 				echo "wlclipboard"
     29 				return 0
     30 			fi
     31 		done
     32 
     33 		for c in waycopy waypaste; do
     34 			if command -v "$c" >/dev/null 2>&1; then
     35 				echo "wayclip"
     36 				return 0
     37 			fi
     38 		done
     39 	fi
     40 
     41 	if [ -n "$DISPLAY" ]; then
     42 		for c in xclip xsel; do
     43 			if command -v "$c" >/dev/null 2>&1; then
     44 				echo "$c"
     45 				return 0
     46 			fi
     47 		done
     48 	fi
     49 
     50 	if command -v pbcopy >/dev/null 2>&1; then
     51 		echo 'mac'
     52 		return 0
     53 	fi
     54 
     55 	if command -v wslclip >/dev/null 2>&1; then
     56 		echo 'wsl'
     57 		return 0
     58 	fi
     59 
     60 	if [ -c /dev/clipboard ]; then
     61 		echo 'cygwin'
     62 		return 0
     63 	fi
     64 
     65 	return 1
     66 }
     67 
     68 vc_usable() {
     69 	if vc_determine_command >/dev/null 2>&1; then
     70 		exit 0
     71 	fi
     72 
     73 	exit 1
     74 }
     75 
     76 vc_copy() {
     77 	COPY_CMD="$(vc_determine_command 2>/dev/null)"
     78 
     79 	# shellcheck disable=SC2181
     80 	if [ $? -ne 0 ] || [ -z "$COPY_CMD" ]; then
     81 		vc_fatal 'System clipboard not supported'
     82 	fi
     83 
     84 	"vc_${COPY_CMD}_copy"
     85 
     86 	exit $?
     87 }
     88 
     89 vc_paste() {
     90 	PASTE_CMD="$(vc_determine_command 2>/dev/null)"
     91 
     92 	# shellcheck disable=SC2181
     93 	if [ $? -ne 0 ] || [ -z "$PASTE_CMD" ]; then
     94 		vc_fatal 'System clipboard not supported'
     95 	fi
     96 
     97 	"vc_${PASTE_CMD}_paste"
     98 
     99 	exit $?
    100 }
    101 
    102 vc_wlclipboard_copy() {
    103 	if [ "$sel" = "primary" ]; then
    104 		wl-copy --primary -t TEXT 2>/dev/null
    105 	else
    106 		wl-copy -t TEXT 2>/dev/null
    107 	fi
    108 }
    109 
    110 vc_wlclipboard_paste() {
    111 	if [ "$sel" = "primary" ]; then
    112 		wl-paste --no-newline --primary -t text
    113 	else
    114 		wl-paste --no-newline -t text
    115 	fi
    116 }
    117 
    118 vc_wayclip_copy() {
    119 	if [ "$sel" = "primary" ]; then
    120 		waycopy -p 2>/dev/null
    121 	else
    122 		waycopy 2>/dev/null
    123 	fi
    124 }
    125 
    126 vc_wayclip_paste() {
    127 	if [ "$sel" = "primary" ]; then
    128 		waypaste -p
    129 	else
    130 		waypaste
    131 	fi
    132 }
    133 
    134 vc_xsel_copy() {
    135 	xsel --"$sel" -i
    136 }
    137 
    138 vc_xsel_paste() {
    139 	xsel --"$sel" -o
    140 }
    141 
    142 vc_xclip_copy() {
    143 	xclip -selection "$sel" -i >/dev/null 2>&1
    144 }
    145 
    146 vc_xclip_paste() {
    147 	xclip -selection "$sel" -o
    148 }
    149 
    150 vc_mac_copy() {
    151 	pbcopy
    152 }
    153 
    154 vc_mac_paste() {
    155 	pbpaste
    156 }
    157 
    158 vc_wsl_copy() {
    159 	wslclip
    160 }
    161 
    162 vc_wsl_paste() {
    163 	wslclip -g
    164 }
    165 
    166 vc_cygwin_copy() {
    167 	cat >/dev/clipboard
    168 }
    169 
    170 vc_cygwin_paste() {
    171 	cat /dev/clipboard
    172 }
    173 
    174 while [ $# -gt 0 ]; do
    175 	case "$1" in
    176 		--usable) fn=vc_usable;;
    177 		--copy) fn=vc_copy;;
    178 		--paste) fn=vc_paste;;
    179 		--selection)
    180 			shift
    181 			if [ "$1" != "clipboard" ] && [ "$1" != "primary" ]; then
    182 				vc_fatal "Invalid selection: $1\nValid options are 'clipboard' or 'primary'"
    183 			fi
    184 			sel="$1";;
    185 		*) vc_usage;;
    186 	esac
    187 	shift
    188 done
    189 
    190 sel=${sel:-"clipboard"} $fn
    191 
    192 vc_usage