aboutsummaryrefslogtreecommitdiff
path: root/zsh-system-clipboard.zsh
blob: 06d7dc1c02db50c93bd44e694cace7893834bca5 (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
##
# zsh-system-clipboard
#
# @author Kutsan Kaplan <me@kutsankaplan.com>
# @license GPLv3
# @version v0.1.0
##

function _zsh_system_clipboard_api() {
	local -A CLIPBOARD

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

			linux-android*)
				if (hash termux-clipboard-set 2>/dev/null && hash termux-clipboard-get 2>/dev/null) {
					typeset -g CLIPBOARD[set]='termux-clipboard-set'
					typeset -g CLIPBOARD[get]='termux-clipboard-get'
				}
				;;

			linux*)
				if (hash xsel 2>/dev/null) {
					typeset -g CLIPBOARD[set]='xsel --clipboard --input'
					typeset -g CLIPBOARD[get]='xsel --clipboard'
				}
				;;
		}
	}
	determinate_clipboard_manager

	function sub_set() {
		local ZSH_SYSTEM_CLIPBOARD_TMUX_SUPPORT='true'

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

		printf "$@" | eval "${CLIPBOARD[set]}"
	}

	function sub_get() {
		set -x
		local CLIPBOARD_CONTENT=$(eval "${CLIPBOARD[get]}")
		printf "$CLIPBOARD_CONTENT"
	}

	local subcommand=${1:-''}

	case "$subcommand" {
		set)
			shift
			sub_${subcommand} "$*"

			return true
			;;

		get)
			shift
			sub_${subcommand}

			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)
	tmux display-message $CLIPBOARD

	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 widget (
	zsh-system-clipboard-key-y
	zsh-system-clipboard-key-Y
	zsh-system-clipboard-key-p
	zsh-system-clipboard-key-P
	zsh-system-clipboard-key-x
) {
	zle -N $widget
}

# Normal mode bindings
bindkey -M vicmd 'y' zsh-system-clipboard-key-y
bindkey -M vicmd 'Y' zsh-system-clipboard-key-Y
bindkey -M vicmd 'p' zsh-system-clipboard-key-p
bindkey -M vicmd 'P' zsh-system-clipboard-key-P

# Visual mode bindings
bindkey -M visual 'x' zsh-system-clipboard-key-x