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