aboutsummaryrefslogtreecommitdiff
path: root/zsh-system-clipboard.zsh
blob: 2d9c9dbfa69d405479d6b7991e846fb7519dce10 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
##
# zsh-system-clipboard
#
# @author Kutsan Kaplan <me@kutsankaplan.com>
# @license GPLv3
# @version v0.3.0
##

function _zsh_system_clipboard_api() {
	function _console.error() {
		echo -e "\n\n  \033[41;37m ERROR \033[0m \033[01mzsh-system-clipboard:\033[0m $@\n" >&2
		return true
	}

	function _console.error_and_suggest_to_install() {
		_console.error "Could not find any available clipboard manager. Make sure you have \033[01m${@}\033[0m installed."
		return true
	}

	local -A CLIPBOARD

	function determinate_clipboard_manager() {
		case "$OSTYPE" {
			darwin*)
				if ((hash pbcopy && hash pbpaste) 2>/dev/null) {
					typeset -g CLIPBOARD[set]='pbcopy'
					typeset -g CLIPBOARD[get]='pbpaste'
				} else {
					_console.error_and_suggest_to_install 'pbcopy, pbpaste'
				}
				;;

			linux-android*)
				if ((hash termux-clipboard-set && hash termux-clipboard-get) 2>/dev/null) {
					typeset -g CLIPBOARD[set]='termux-clipboard-set'
					typeset -g CLIPBOARD[get]='termux-clipboard-get'
				} else {
					_console.error_and_suggest_to_install 'Termux:API (from Play Store), termux-api (from apt package)'
				}
				;;

			linux*)
				if (hash xclip 2>/dev/null) {
					typeset -g CLIPBOARD[set]='xclip -i -sel clip'
					typeset -g CLIPBOARD[get]='xclip -o -sel clip'
				} else {
					_console.error_and_suggest_to_install 'xclip'
				}
				;;

			*)
				_console.error 'Unsupported system.'
				;;
		}
	}
	determinate_clipboard_manager

	function sub_set() {
		if [[ "$ZSH_SYSTEM_CLIPBOARD_TMUX_SUPPORT" != '' ]] {
			# Set also tmux clipboard buffer if tmux available.
			if (hash tmux &>/dev/null && [[ "$TMUX" != '' ]]) {
				tmux set-buffer -- "$@"
			}
		}

		echo -E "$@" | eval "${CLIPBOARD[set]}"
	}

	function sub_get() {
		echo -E $(${CLIPBOARD[get]})
	}

	local subcommand=${1:-''}

	case "$subcommand" {
		set)
			shift
			sub_${subcommand} "$*" || return false

			return true
			;;

		get)
			shift
			sub_${subcommand} || return false

			return true
			;;

		*)
			return false
	}
}

function zsh-system-clipboard-key-y() {
	zle vi-yank
	_zsh_system_clipboard_api set "$CUTBUFFER"
}

function zsh-system-clipboard-key-Y() {
	zle vi-yank-whole-line
	_zsh_system_clipboard_api set "$CUTBUFFER"
}

function zsh-system-clipboard-key-p() {
	local CLIPBOARD=$(_zsh_system_clipboard_api get)

	BUFFER="${BUFFER:0:$(( ${CURSOR} + 1 ))}${CLIPBOARD}${BUFFER:$(( ${CURSOR} + 1 ))}"
	CURSOR=$(( $#LBUFFER + $#CLIPBOARD ))
}

function zsh-system-clipboard-key-P() {
	local CLIPBOARD=$(_zsh_system_clipboard_api get)

	BUFFER="${BUFFER:0:$(( ${CURSOR} ))}${CLIPBOARD}${BUFFER:$(( ${CURSOR} ))}"
	CURSOR=$(( $#LBUFFER + $#CLIPBOARD - 1 ))
}

function zsh-system-clipboard-key-x() {
	zle vi-delete
	_zsh_system_clipboard_api set "$CUTBUFFER"
}

# Load functions as widgets
foreach key (y Y p P x) {
	zle -N zsh-system-clipboard-key-$key
}

# Normal mode bindings
foreach key (Y p P) {
	bindkey -M vicmd $key zsh-system-clipboard-key-$key
}

# Visual mode bindings
foreach key (y x) {
	bindkey -M visual $key zsh-system-clipboard-key-$key
}