-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathzsh-incsearch.plugin.zsh
117 lines (97 loc) · 3.04 KB
/
zsh-incsearch.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
105
106
107
108
109
110
111
112
113
114
115
116
117
incsearch_hooks_enter=()
incsearch_hooks_leave=()
incsearch-forward() {
incsearch-enter 1 1
}
incsearch-backward() {
incsearch-enter -1 1
}
incsearch-forward-beginning() {
incsearch-enter 1 0
}
incsearch-backward-beginning() {
incsearch-enter -1 0
}
incsearch-enter() {
incsearch_dir=$1
incsearch_to_end=$2
incsearch_input=""
incsearch_start=$(( $CURSOR + $incsearch_dir ))
incsearch_postdisplay_save="$POSTDISPLAY"
(( $incsearch_start < 0 )) && incsearch_start=0
(( $incsearch_start > $#BUFFER - 1 )) && incsearch_start=$(( $#BUFFER - 1 ))
zle -A self-insert saved-self-insert
zle -A accept-line saved-accept-line
zle -A backward-delete-char saved-backward-delete-char
zle -N self-insert incsearch-self-insert
zle -N accept-line incsearch-leave
zle -N backward-delete-char incsearch-backward-delete-char
incsearch-update-display
for hook in $incsearch_hooks_enter; do
eval "$hook"
done
}
incsearch-leave() {
POSTDISPLAY="$incsearch_postdisplay_save"
unset incsearch_postdisplay_save
unset incsearch_dir
unset incsearch_input
zle -A saved-self-insert self-insert
zle -A saved-accept-line accept-line
zle -A saved-backward-delete-char backward-delete-char
zle -D saved-self-insert
zle -D saved-accept-line
zle -D saved-backward-delete-char
for hook in $incsearch_hooks_leave; do
eval "$hook"
done
}
incsearch-self-insert() {
incsearch_input="${incsearch_input}${KEYS}"
incsearch-exec
}
incsearch-backward-delete-char() {
incsearch_input=${incsearch_input[1,(($#incsearch_input - 1))]}
incsearch-exec
}
incsearch-exec() {
INDEX=$(incsearch-index-of "$BUFFER" "$incsearch_input" "$incsearch_start" "$incsearch_dir")
if [ $? = 0 ]; then
if [ $incsearch_to_end = 0 ]; then
CURSOR=$INDEX
else
CURSOR=$(($INDEX + $#incsearch_input - 1))
fi
fi
incsearch-update-display
}
incsearch-update-display() {
POSTDISPLAY=$'\n'"search: ${incsearch_input}_"
}
# From https://github.com/soheilpro/zsh-vi-search/blob/445c8a27dd2ce315176f18b4c7213c848f215675/src/zsh-vi-search.zsh
# Copyright (c) 2014 Soheil Rashidi
incsearch-index-of() {
setopt localoptions no_sh_word_split
local STR=$1
local STRLEN=${#STR}
local SUBSTR=$2
local SUBSTRLEN=${#SUBSTR}
local START=${3:-0}
local DIRECTION=${4:-1}
[[ $STRLEN -ge 0 ]] || return 1
[[ $SUBSTRLEN -ge 0 ]] || return 2
[[ $START -ge 0 ]] || return 3
[[ $START -lt $STRLEN ]] || return 4
[[ $DIRECTION -eq 1 || $DIRECTION -eq -1 ]] || return 5
for ((INDEX = $START; INDEX >= 0 && INDEX < $STRLEN; INDEX = INDEX + $DIRECTION)); do
if [[ "${STR:$INDEX:$SUBSTRLEN}" == "$SUBSTR" ]]; then
echo $INDEX
return
fi
done
return -1
}
zle -N incsearch-forward incsearch-forward
zle -N incsearch-backward incsearch-backward
zle -N incsearch-forward-beginning incsearch-forward-beginning
zle -N incsearch-backward-beginning incsearch-backward-beginning