-
-
Notifications
You must be signed in to change notification settings - Fork 141
/
_autocomplete.history_lines
113 lines (103 loc) 路 3.27 KB
/
_autocomplete.history_lines
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
#autoload
_autocomplete.history_lines() {
local tag=history-lines
_tags $tag
_tags ||
return 1
_requested $tag ||
return 1
local -A events=()
local -i min_lines max_lines
zstyle -s ":autocomplete:${curcontext}:" list-lines min_lines ||
min_lines=16
(( max_lines = min( min_lines, HISTNO - 1, LINES - BUFFERLINES ) ))
if [[ -z $BUFFER ]]; then
if [[ $curcontext == *-forward:* ]]; then
local -i inc=1 histno=1
else
local -i inc=-1 histno=$(( HISTNO - 1 ))
fi
if [[ -o histfindnodups ]]; then
while (( $#events[@] < max_lines && 0 < histno && histno < HISTNO )); do
[[ -v history[$histno] && ! -v events[$history[$histno]] ]] &&
events[$history[$histno]]=$histno
(( histno += inc ))
done
events=( "${(@Oa)${(@kv)events}}" )
else
while (( $#events[@] < max_lines && 0 < histno && histno < HISTNO )); do
[[ -v history[$histno] ]] &&
events[$histno]="$history[$histno]"
(( histno += inc ))
done
fi
else
local -aU queries results reply
if [[ $curcontext == *-incremental-*:* ]]; then
local word=$IPREFIX$PREFIX$SUFFIX$ISUFFIX
local lbuffer="${words[1,CURRENT-1]}[[:blank:]]#"
local rbuffer="[[:blank:]]#${words[CURRENT+1,-1]}"
queries=( "$lbuffer*((#ia"{0..$(( min(7, $#word / 3) ))}")${(b)word})*$rbuffer" )
else
queries=( '(#ia'{0..$(( min(7, $#words / 3) ))}')*'${words[CURRENT]//$'\0'/*}'*' )
fi
if [[ -o histfindnodups ]]; then
local -a numbers
local q; for q in $queries[@]; do
numbers=( "${(@k)history[(R)$~q]}" )
(( $#numbers[@] > 0 )) &&
break
done
local -a lines=( "${(@v)history[(I)(${(~j:|:)numbers})]}" )
if [[ $curcontext != *-forward:* ]]; then
numbers=( "${(@Oa)numbers}" )
lines=( "${(@Oa)lines}" )
fi
events=( "${(@)lines:^numbers}" )
events=( "${(@Oa)${(@kv)events}}" )
else
local q; for q in $queries[@]; do
events=( "${(@kv)history[(R)$~q]}" )
(( $#events[@] > 0 )) &&
break
done
fi
fi
(( $#events[@] )) ||
return
local -a displays=()
printf -v displays "%s:%s" "${(@kv)events}"
displays=( "$displays[@]" )
local -i diff=$(( $#displays[@] - max_lines ))
local -a sopt
if [[ $curcontext == *-incremental-* ]]; then
if [[ $curcontext == *-forward:* ]]; then
displays=( ${(@n)displays} )
else
displays=( ${(@On)displays} )
fi
(( diff > 0 )) &&
shift -p "$diff" displays
if [[ -n $BUFFER ]]; then
_autocomplete.sort_by_length $displays[@]
displays=( $reply[@] )
fi
sopt=( -S '' )
else
displays=( ${(@n)displays} )
(( diff > 0 )) &&
shift "$diff" displays
sopt=( -S ';' -r '^ ' )
fi
local -a matches=( "${displays[@]##[[:blank:]]#<->:}" )
[[ $curcontext == *-incremental-* ]] &&
matches=( "${(@)${(@)matches[@]##$~lbuffer}%%$~rbuffer}" )
local -a match mbegin mend
displays=(
"${(@r:COLUMNS-1:)displays[@]/%(#b)(<->):(*)/${(l:$#HISTNO:)match[1]} ${(V)${(Z+C+)match[2]}}}"
)
local _comp_no_ignore=1 expl
_description -2V "$tag" expl 'history line'
compadd "$expl[@]" "$sopt[@]" -QU -ld displays -a matches
}
_autocomplete.history_lines "$@"