-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathsmartinput.plugin.zsh
104 lines (95 loc) · 2.26 KB
/
smartinput.plugin.zsh
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
declare -g __smartinput_rules=(
"'"
"\""
'`'
'()'
'[]'
'{}'
)
function __smartinput:widget:input_left_bracket {
if [[ "$LBUFFER[-1]" == '\' ]]; then
# Support Escape "\"
:
else
local rule
for rule in $__smartinput_rules; do
if [[ $#rule == 2 && "$rule[1]" == "$KEYS" ]]; then
RBUFFER="$rule[2]$RBUFFER"
break
fi
done
fi
zle self-insert
}
function __smartinput:widget:input_right_bracket {
local left right
if [[ "$RBUFFER[1]" == "$KEYS" ]]; then
# [xxxxxx|]<right bracket key>
zle forward-char
return
fi
zle self-insert
}
function __smartinput:widget:input_quote {
if [[ "$LBUFFER[-1]" == '\' ]]; then
# Support Escape "\"
:
elif [[ "$RBUFFER[1]" == "$KEYS" ]]; then
# 'xxxxxx|'<quote key>
zle forward-char
return
elif [[ "$KEYS" == "'" && "'$LBUFFER[-1]" =~ '\w' ]]; then
# Support English "someone's"
:
else
RBUFFER="$KEYS$RBUFFER"
fi
zle self-insert
}
function __smartinput:widget:backward_delete_char {
local rule left right
for rule in $__smartinput_rules; do
if [[ $#rule == 1 ]]; then
left="$rule"
right="$rule"
elif [[ $#rule == 2 ]]; then
left="$rule[1]"
right="$rule[2]"
else
# Not Support rule
continue
fi
# [|]<BS>
if [[ "$LBUFFER[-1]" == "$left" && "$RBUFFER[1]" == "$right" ]]; then
zle backward-delete-char
zle delete-char
return
fi
# []|<BS>
if [[ "$LBUFFER[-2,-1]" == "$left$right" ]]; then
zle backward-delete-char
zle backward-delete-char
return
fi
done
zle backward-delete-char
}
() {
zle -N __smartinput:widget:input_quote
zle -N __smartinput:widget:input_left_bracket
zle -N __smartinput:widget:input_right_bracket
local rule
for rule in $__smartinput_rules; do
if [[ $#rule == 1 ]]; then
# quote
bindkey "$rule" __smartinput:widget:input_quote
elif [[ $#rule == 2 ]]; then
# brackets
bindkey "$rule[1]" __smartinput:widget:input_left_bracket
bindkey "$rule[2]" __smartinput:widget:input_right_bracket
fi
done
zle -N __smartinput:widget:backward_delete_char
bindkey "^H" __smartinput:widget:backward_delete_char
bindkey "^?" __smartinput:widget:backward_delete_char
}