Skip to content

Commit

Permalink
Yank to system clipboard
Browse files Browse the repository at this point in the history
  • Loading branch information
Bror Winther committed Sep 24, 2022
1 parent 0b1381b commit aaaabd6
Showing 1 changed file with 81 additions and 0 deletions.
81 changes: 81 additions & 0 deletions zsh-vi-mode.zsh
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,83 @@ for commands_array_name in $commands_array_names; do
fi
done

function _zsh_system_clipboard_command_exists() {
type "$1" &> /dev/null;
}

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

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

if [[ "$ZSH_SYSTEM_CLIPBOARD_METHOD" == "" ]]; then
case "$OSTYPE" {
darwin*)
if _zsh_system_clipboard_command_exists pbcopy && _zsh_system_clipboard_command_exists pbpaste; then
ZSH_SYSTEM_CLIPBOARD_METHOD="pb"
else
_zsh_system_clipboard_suggest_to_install 'pbcopy, pbpaste'
fi
;;
linux-android*)
if _zsh_system_clipboard_command_exists termux-clipboard-set && _zsh_system_clipboard_command_exists termux-clipboard-get; then
ZSH_SYSTEM_CLIPBOARD_METHOD="termux"
else
_zsh_system_clipboard_suggest_to_install 'Termux:API (from Play Store), termux-api (from apt package)'
fi
;;
linux*|freebsd*)
if [[ "$DISPLAY" == "" ]]; then
ZSH_SYSTEM_CLIPBOARD_METHOD="wlc"
elif _zsh_system_clipboard_command_exists xclip; then
ZSH_SYSTEM_CLIPBOARD_METHOD="xcc"
elif _zsh_system_clipboard_command_exists xsel; then
ZSH_SYSTEM_CLIPBOARD_METHOD="xsc"
else
_zsh_system_clipboard_suggest_to_install 'wl-clipboard / xclip / xsel'
fi
;;
*)
_zsh_system_clipboard_error 'Unsupported system.'
return 1
;;
esac
fi

unfunction _zsh_system_clipboard_error
unfunction _zsh_system_clipboard_suggest_to_install
unfunction _zsh_system_clipboard_command_exists

function zsh-system-clipboard-set-tmux(){ tmux load-buffer -; }
function zsh-system-clipboard-get-tmux(){ tmux show-buffer; }
# wl{c,p} stands for 'wayland with {CLIPBOARD,PRIMARY} selection'
function zsh-system-clipboard-set-wlc(){ wl-copy; }
function zsh-system-clipboard-get-wlc(){ wl-paste -n; }
function zsh-system-clipboard-set-wlp(){ wl-copy -p; }
function zsh-system-clipboard-get-wlp(){ wl-paste -p -n; }
# xs{c,p} stands for 'xsel with {CLIPBOARD,PRIMARY} selection'
function zsh-system-clipboard-set-xsc(){ xsel -b -i; }
function zsh-system-clipboard-get-xsc(){ xsel -b -o; }
function zsh-system-clipboard-set-xsp(){ xsel -p -i; }
function zsh-system-clipboard-get-xsp(){ xsel -p -o; }
# xc{c,p} stands for 'xclip with {CLIPBOARD,PRIMARY} selection'
function zsh-system-clipboard-set-xcc(){ xclip -sel CLIPBOARD -in; }
function zsh-system-clipboard-get-xcc(){ xclip -sel CLIPBOARD -out; }
function zsh-system-clipboard-set-xcp(){ xclip -sel PRIMARY -in; }
function zsh-system-clipboard-get-xcp(){ xclip -sel PRIMARY -out; }
# pb stands for pbcopy and pbpaste
function zsh-system-clipboard-set-pb(){ pbcopy; }
function zsh-system-clipboard-get-pb(){ pbpaste; }
function zsh-system-clipboard-set-termux(){ termux-clipboard-set; }
function zsh-system-clipboard-get-termux(){ termux-clipboard-get; }

function zsh-system-clipboard-set(){ zsh-system-clipboard-set-${ZSH_SYSTEM_CLIPBOARD_METHOD}; }
function zsh-system-clipboard-get(){ zsh-system-clipboard-get-${ZSH_SYSTEM_CLIPBOARD_METHOD}; }

# All the handlers for switching keyword
zvm_switch_keyword_handlers=(
zvm_switch_number
Expand Down Expand Up @@ -1014,6 +1091,7 @@ function zvm_calc_selection() {
echo $bpos $epos $cpos
}


# Yank characters of the marked region
function zvm_yank() {
local ret=($(zvm_calc_selection $1))
Expand All @@ -1022,6 +1100,7 @@ function zvm_yank() {
if [[ ${1:-$ZVM_MODE} == $ZVM_MODE_VISUAL_LINE ]]; then
CUTBUFFER=${CUTBUFFER}$'\n'
fi
printf '%s' "$CUTBUFFER" | zsh-system-clipboard-set
CURSOR=$bpos MARK=$epos
}

Expand Down Expand Up @@ -1174,6 +1253,7 @@ function zvm_vi_delete() {
fi
CUTBUFFER=${CUTBUFFER}$'\n'
fi
printf '%s' "$CUTBUFFER" | zsh-system-clipboard-set

BUFFER="${BUFFER:0:$bpos}${BUFFER:$epos}"
CURSOR=$cpos
Expand All @@ -1192,6 +1272,7 @@ function zvm_vi_change() {
if [[ $ZVM_MODE == $ZVM_MODE_VISUAL_LINE ]]; then
CUTBUFFER=${CUTBUFFER}$'\n'
fi
printf '%s' "$CUTBUFFER" | zsh-system-clipboard-set

BUFFER="${BUFFER:0:$bpos}${BUFFER:$epos}"
CURSOR=$bpos
Expand Down

0 comments on commit aaaabd6

Please sign in to comment.