mirrored from git://git.code.sf.net/p/zsh/code
-
Notifications
You must be signed in to change notification settings - Fork 441
/
surround
80 lines (77 loc) · 2.06 KB
/
surround
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