/usr/share/zsh/functions/Zle/surround is in zsh-common 5.4.2-3ubuntu3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 | # Implementation of some functionality of the popular vim surround plugin.
# Allows "surroundings" to be changes: parentheses, brackets and quotes.
# To use
# autoload -Uz surround
# zle -N delete-surround surround
# zle -N add-surround surround
# zle -N change-surround surround
# bindkey -a cs change-surround
# bindkey -a ds delete-surround
# bindkey -a ys add-surround
# bindkey -M visual S add-surround
#
# This doesn't allow yss to operate on a line but VS will work
setopt localoptions noksharrays
autoload -Uz select-quoted select-bracketed
local before after
local -A matching
matching=( \( \) \{ \} \< \> \[ \] )
zle -f vichange
case $WIDGET in
change-*)
local MARK="$MARK" CURSOR="$CURSOR" call
read -k 1 before
if [[ ${(kvj::)matching} = *$before* ]]; then
call=select-bracketed
else
call=select-quoted
fi
read -k 1 after
$call "a$before" || return 1
before="$after"
if [[ -n $matching[$before] ]]; then
after=" $matching[$before]"
before+=' '
elif [[ -n $matching[(r)[$before:q]] ]]; then
before="${(k)matching[(r)[$before:q]]}"
fi
BUFFER[CURSOR]="$after"
BUFFER[MARK+1]="$before"
CURSOR=MARK
;;
delete-*)
local MARK="$MARK" CURSOR="$CURSOR" call
read -k 1 before
if [[ ${(kvj::)matching} = *$before* ]]; then
call=select-bracketed
else
call=select-quoted
fi
if $call "a$before"; then
BUFFER[CURSOR]=''
BUFFER[MARK+1]=''
CURSOR=MARK
fi
;;
add-*)
local save_cut="$CUTBUFFER"
zle .vi-change || return
local save_cur="$CURSOR"
zle .vi-cmd-mode
read -k 1 before
after="$before"
if [[ -n $matching[$before] ]]; then
after=" $matching[$before]"
before+=' '
elif [[ -n $matching[(r)[$before:q]] ]]; then
before="${(k)matching[(r)[$before:q]]}"
fi
CUTBUFFER="$before$CUTBUFFER$after"
if [[ CURSOR -eq 0 || $BUFFER[CURSOR] = $'\n' ]]; then
zle .vi-put-before -n 1
else
zle .vi-put-after -n 1
fi
CUTBUFFER="$save_cut" CURSOR="$save_cur"
;;
esac
|