aboutsummaryrefslogtreecommitdiff
path: root/zsh-system-clipboard.zsh
diff options
context:
space:
mode:
Diffstat (limited to 'zsh-system-clipboard.zsh')
-rw-r--r--zsh-system-clipboard.zsh127
1 files changed, 127 insertions, 0 deletions
diff --git a/zsh-system-clipboard.zsh b/zsh-system-clipboard.zsh
new file mode 100644
index 0000000..06d7dc1
--- /dev/null
+++ b/zsh-system-clipboard.zsh
@@ -0,0 +1,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