comparison .zfun/zsh-autosuggestions/src/widgets.zsh @ 467:e1ce8897030d

zsh: import df6f6f9ff41 of zsh-autosuggestions
author Augie Fackler <raf@durin42.com>
date Mon, 03 Dec 2018 22:37:29 -0500
parents
children
comparison
equal deleted inserted replaced
466:f248cf012d9a 467:e1ce8897030d
1
2 #--------------------------------------------------------------------#
3 # Autosuggest Widget Implementations #
4 #--------------------------------------------------------------------#
5
6 # Disable suggestions
7 _zsh_autosuggest_disable() {
8 typeset -g _ZSH_AUTOSUGGEST_DISABLED
9 _zsh_autosuggest_clear
10 }
11
12 # Enable suggestions
13 _zsh_autosuggest_enable() {
14 unset _ZSH_AUTOSUGGEST_DISABLED
15
16 if (( $#BUFFER )); then
17 _zsh_autosuggest_fetch
18 fi
19 }
20
21 # Toggle suggestions (enable/disable)
22 _zsh_autosuggest_toggle() {
23 if [[ -n "${_ZSH_AUTOSUGGEST_DISABLED+x}" ]]; then
24 _zsh_autosuggest_enable
25 else
26 _zsh_autosuggest_disable
27 fi
28 }
29
30 # Clear the suggestion
31 _zsh_autosuggest_clear() {
32 # Remove the suggestion
33 unset POSTDISPLAY
34
35 _zsh_autosuggest_invoke_original_widget $@
36 }
37
38 # Modify the buffer and get a new suggestion
39 _zsh_autosuggest_modify() {
40 emulate -L zsh
41
42 local -i retval
43
44 # Only available in zsh >= 5.4
45 local -i KEYS_QUEUED_COUNT
46
47 # Save the contents of the buffer/postdisplay
48 local orig_buffer="$BUFFER"
49 local orig_postdisplay="$POSTDISPLAY"
50
51 # Clear suggestion while waiting for next one
52 unset POSTDISPLAY
53
54 # Original widget may modify the buffer
55 _zsh_autosuggest_invoke_original_widget $@
56 retval=$?
57
58 # Don't fetch a new suggestion if there's more input to be read immediately
59 if (( $PENDING > 0 )) || (( $KEYS_QUEUED_COUNT > 0 )); then
60 POSTDISPLAY="$orig_postdisplay"
61 return $retval
62 fi
63
64 # Optimize if manually typing in the suggestion
65 if (( $#BUFFER > $#orig_buffer )); then
66 local added=${BUFFER#$orig_buffer}
67
68 # If the string added matches the beginning of the postdisplay
69 if [[ "$added" = "${orig_postdisplay:0:$#added}" ]]; then
70 POSTDISPLAY="${orig_postdisplay:$#added}"
71 return $retval
72 fi
73 fi
74
75 # Don't fetch a new suggestion if the buffer hasn't changed
76 if [[ "$BUFFER" = "$orig_buffer" ]]; then
77 POSTDISPLAY="$orig_postdisplay"
78 return $retval
79 fi
80
81 # Bail out if suggestions are disabled
82 if [[ -n "${_ZSH_AUTOSUGGEST_DISABLED+x}" ]]; then
83 return $?
84 fi
85
86 # Get a new suggestion if the buffer is not empty after modification
87 if (( $#BUFFER > 0 )); then
88 if [[ -z "$ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE" ]] || (( $#BUFFER <= $ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE )); then
89 _zsh_autosuggest_fetch
90 fi
91 fi
92
93 return $retval
94 }
95
96 # Fetch a new suggestion based on what's currently in the buffer
97 _zsh_autosuggest_fetch() {
98 if zpty -t "$ZSH_AUTOSUGGEST_ASYNC_PTY_NAME" &>/dev/null; then
99 _zsh_autosuggest_async_request "$BUFFER"
100 else
101 local suggestion
102 _zsh_autosuggest_fetch_suggestion "$BUFFER"
103 _zsh_autosuggest_suggest "$suggestion"
104 fi
105 }
106
107 # Offer a suggestion
108 _zsh_autosuggest_suggest() {
109 emulate -L zsh
110
111 local suggestion="$1"
112
113 if [[ -n "$suggestion" ]] && (( $#BUFFER )); then
114 POSTDISPLAY="${suggestion#$BUFFER}"
115 else
116 unset POSTDISPLAY
117 fi
118 }
119
120 # Accept the entire suggestion
121 _zsh_autosuggest_accept() {
122 local -i max_cursor_pos=$#BUFFER
123
124 # When vicmd keymap is active, the cursor can't move all the way
125 # to the end of the buffer
126 if [[ "$KEYMAP" = "vicmd" ]]; then
127 max_cursor_pos=$((max_cursor_pos - 1))
128 fi
129
130 # Only accept if the cursor is at the end of the buffer
131 if [[ $CURSOR = $max_cursor_pos ]]; then
132 # Add the suggestion to the buffer
133 BUFFER="$BUFFER$POSTDISPLAY"
134
135 # Remove the suggestion
136 unset POSTDISPLAY
137
138 # Move the cursor to the end of the buffer
139 CURSOR=${#BUFFER}
140 fi
141
142 _zsh_autosuggest_invoke_original_widget $@
143 }
144
145 # Accept the entire suggestion and execute it
146 _zsh_autosuggest_execute() {
147 # Add the suggestion to the buffer
148 BUFFER="$BUFFER$POSTDISPLAY"
149
150 # Remove the suggestion
151 unset POSTDISPLAY
152
153 # Call the original `accept-line` to handle syntax highlighting or
154 # other potential custom behavior
155 _zsh_autosuggest_invoke_original_widget "accept-line"
156 }
157
158 # Partially accept the suggestion
159 _zsh_autosuggest_partial_accept() {
160 local -i retval cursor_loc
161
162 # Save the contents of the buffer so we can restore later if needed
163 local original_buffer="$BUFFER"
164
165 # Temporarily accept the suggestion.
166 BUFFER="$BUFFER$POSTDISPLAY"
167
168 # Original widget moves the cursor
169 _zsh_autosuggest_invoke_original_widget $@
170 retval=$?
171
172 # Normalize cursor location across vi/emacs modes
173 cursor_loc=$CURSOR
174 if [[ "$KEYMAP" = "vicmd" ]]; then
175 cursor_loc=$((cursor_loc + 1))
176 fi
177
178 # If we've moved past the end of the original buffer
179 if (( $cursor_loc > $#original_buffer )); then
180 # Set POSTDISPLAY to text right of the cursor
181 POSTDISPLAY="${BUFFER[$(($cursor_loc + 1)),$#BUFFER]}"
182
183 # Clip the buffer at the cursor
184 BUFFER="${BUFFER[1,$cursor_loc]}"
185 else
186 # Restore the original buffer
187 BUFFER="$original_buffer"
188 fi
189
190 return $retval
191 }
192
193 for action in clear modify fetch suggest accept partial_accept execute enable disable toggle; do
194 eval "_zsh_autosuggest_widget_$action() {
195 local -i retval
196
197 _zsh_autosuggest_highlight_reset
198
199 _zsh_autosuggest_$action \$@
200 retval=\$?
201
202 _zsh_autosuggest_highlight_apply
203
204 zle -R
205
206 return \$retval
207 }"
208 done
209
210 zle -N autosuggest-fetch _zsh_autosuggest_widget_fetch
211 zle -N autosuggest-suggest _zsh_autosuggest_widget_suggest
212 zle -N autosuggest-accept _zsh_autosuggest_widget_accept
213 zle -N autosuggest-clear _zsh_autosuggest_widget_clear
214 zle -N autosuggest-execute _zsh_autosuggest_widget_execute
215 zle -N autosuggest-enable _zsh_autosuggest_widget_enable
216 zle -N autosuggest-disable _zsh_autosuggest_widget_disable
217 zle -N autosuggest-toggle _zsh_autosuggest_widget_toggle