| 
									
										
										
										
											2016-07-20 11:04:18 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #--------------------------------------------------------------------# | 
					
						
							|  |  |  | # Async                                                              # | 
					
						
							|  |  |  | #--------------------------------------------------------------------# | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-25 10:53:26 +08:00
										 |  |  | # Pty is spawned running this function | 
					
						
							| 
									
										
										
										
											2017-01-28 06:18:26 +08:00
										 |  |  | _zsh_autosuggest_async_server() { | 
					
						
							| 
									
										
										
										
											2017-01-25 10:58:25 +08:00
										 |  |  | 	emulate -R zsh | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-25 13:27:09 +08:00
										 |  |  | 	# Output only newlines (not carriage return + newline) | 
					
						
							|  |  |  | 	stty -onlcr | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-25 13:48:30 +08:00
										 |  |  | 	local strategy=$1 | 
					
						
							| 
									
										
										
										
											2017-01-25 15:00:53 +08:00
										 |  |  | 	local last_pid | 
					
						
							| 
									
										
										
										
											2017-01-25 13:48:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-28 06:18:26 +08:00
										 |  |  | 	while IFS='' read -r -d $'\0' query; do | 
					
						
							| 
									
										
										
										
											2016-07-20 11:04:18 +08:00
										 |  |  | 		# Kill last bg process | 
					
						
							| 
									
										
										
										
											2017-01-25 15:00:53 +08:00
										 |  |  | 		kill -KILL $last_pid &>/dev/null | 
					
						
							| 
									
										
										
										
											2016-07-20 11:04:18 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		# Run suggestion search in the background | 
					
						
							| 
									
										
										
										
											2017-01-28 06:18:26 +08:00
										 |  |  | 		( | 
					
						
							|  |  |  | 			local suggestion | 
					
						
							|  |  |  | 			_zsh_autosuggest_strategy_$ZSH_AUTOSUGGEST_STRATEGY "$query" | 
					
						
							|  |  |  | 			echo -n -E "$suggestion"$'\0' | 
					
						
							|  |  |  | 		) & | 
					
						
							| 
									
										
										
										
											2017-01-25 15:00:53 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		last_pid=$! | 
					
						
							| 
									
										
										
										
											2016-07-20 11:04:18 +08:00
										 |  |  | 	done | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-28 06:18:26 +08:00
										 |  |  | _zsh_autosuggest_async_request() { | 
					
						
							|  |  |  | 	# Send the query to the pty to fetch a suggestion | 
					
						
							| 
									
										
										
										
											2017-01-30 01:39:07 +08:00
										 |  |  | 	zpty -w -n $ZSH_AUTOSUGGEST_ASYNC_PTY_NAME "${1}"$'\0' | 
					
						
							| 
									
										
										
										
											2017-01-28 06:18:26 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-25 10:53:26 +08:00
										 |  |  | # Called when new data is ready to be read from the pty | 
					
						
							|  |  |  | # First arg will be fd ready for reading | 
					
						
							|  |  |  | # Second arg will be passed in case of error | 
					
						
							| 
									
										
										
										
											2017-01-28 06:18:26 +08:00
										 |  |  | _zsh_autosuggest_async_response() { | 
					
						
							| 
									
										
										
										
											2017-01-25 10:58:52 +08:00
										 |  |  | 	local suggestion | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-30 01:39:07 +08:00
										 |  |  | 	zpty -rt $ZSH_AUTOSUGGEST_ASYNC_PTY_NAME suggestion '*'$'\0' 2>/dev/null | 
					
						
							| 
									
										
										
										
											2017-01-28 06:18:26 +08:00
										 |  |  | 	zle autosuggest-suggest "${suggestion%$'\0'}" | 
					
						
							| 
									
										
										
										
											2016-07-20 11:04:18 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-28 06:18:26 +08:00
										 |  |  | _zsh_autosuggest_async_pty_create() { | 
					
						
							| 
									
										
										
										
											2017-01-27 07:50:19 +08:00
										 |  |  | 	# With newer versions of zsh, REPLY stores the fd to read from | 
					
						
							| 
									
										
										
										
											2016-07-20 11:04:18 +08:00
										 |  |  | 	typeset -h REPLY | 
					
						
							| 
									
										
										
										
											2017-01-25 10:53:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-27 07:50:19 +08:00
										 |  |  | 	# If we won't get a fd back from zpty, try to guess it | 
					
						
							|  |  |  | 	if [ $_ZSH_AUTOSUGGEST_ZPTY_RETURNS_FD -eq 0 ]; then | 
					
						
							|  |  |  | 		integer -l zptyfd | 
					
						
							|  |  |  | 		exec {zptyfd}>&1  # Open a new file descriptor (above 10). | 
					
						
							|  |  |  | 		exec {zptyfd}>&-  # Close it so it's free to be used by zpty. | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-25 10:53:26 +08:00
										 |  |  | 	# Start a new pty running the server function | 
					
						
							| 
									
										
										
										
											2017-01-30 01:39:07 +08:00
										 |  |  | 	zpty -b $ZSH_AUTOSUGGEST_ASYNC_PTY_NAME "_zsh_autosuggest_async_server _zsh_autosuggest_strategy_$ZSH_AUTOSUGGEST_STRATEGY" | 
					
						
							| 
									
										
										
										
											2017-01-25 10:53:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-27 08:00:56 +08:00
										 |  |  | 	# Store the fd so we can remove the handler later | 
					
						
							| 
									
										
										
										
											2017-01-27 07:50:19 +08:00
										 |  |  | 	if (( REPLY )); then | 
					
						
							|  |  |  | 		_ZSH_AUTOSUGGEST_PTY_FD=$REPLY | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		_ZSH_AUTOSUGGEST_PTY_FD=$zptyfd | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-25 10:53:26 +08:00
										 |  |  | 	# Set up input handler from the pty | 
					
						
							| 
									
										
										
										
											2017-01-28 06:18:26 +08:00
										 |  |  | 	zle -F $_ZSH_AUTOSUGGEST_PTY_FD _zsh_autosuggest_async_response | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _zsh_autosuggest_async_pty_destroy() { | 
					
						
							|  |  |  | 	if [ -n "$_ZSH_AUTOSUGGEST_PTY_FD" ]; then | 
					
						
							|  |  |  | 		# Remove the input handler | 
					
						
							|  |  |  | 		zle -F $_ZSH_AUTOSUGGEST_PTY_FD | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		# Destroy the pty | 
					
						
							| 
									
										
										
										
											2017-01-30 01:39:07 +08:00
										 |  |  | 		zpty -d $ZSH_AUTOSUGGEST_ASYNC_PTY_NAME &>/dev/null | 
					
						
							| 
									
										
										
										
											2017-01-28 06:18:26 +08:00
										 |  |  | 	fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _zsh_autosuggest_async_pty_recreate() { | 
					
						
							|  |  |  | 	_zsh_autosuggest_async_pty_destroy | 
					
						
							|  |  |  | 	_zsh_autosuggest_async_pty_create | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _zsh_autosuggest_async_start() { | 
					
						
							|  |  |  | 	typeset -g _ZSH_AUTOSUGGEST_PTY_FD | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_zsh_autosuggest_async_pty_create | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	# We recreate the pty to get a fresh list of history events | 
					
						
							|  |  |  | 	add-zsh-hook precmd _zsh_autosuggest_async_pty_recreate | 
					
						
							| 
									
										
										
										
											2016-07-20 11:04:18 +08:00
										 |  |  | } |