zsh-autosuggestions/completion-server.zsh
2013-10-28 19:51:04 -03:00

70 lines
1.4 KiB
Bash
Executable file

#!/usr/bin/env zsh
# Based on:
# https://github.com/Valodim/zsh-capture-completion/blob/master/capture.zsh
exec &> /dev/null
zmodload zsh/zpty
zmodload zsh/net/socket
setopt noglob
# Start an interactive zsh connected to a zpty
zpty z ZLE_DISABLE_AUTOSUGGEST=1 zsh -i
# Source the init script
zpty -w z "source '${0:a:h}/completion-server-init.zsh'"
read-to-null() {
connection=$1
integer consumed=0
while zpty -r z chunk; do
[[ $chunk == *$'\0'* ]] && break
(( consumed++ )) && continue
if [[ -n $connection ]]; then
print -n -u $connection $chunk
else
print -n $chunk &> /dev/null
fi
done
}
# wait for ok from shell
read-to-null
# listen on an unix domain socket
server_dir=$1
pid_file=$2
socket_path=$3
cleanup() {
rm -f $socket_path
rm -f $pid_file
}
trap cleanup TERM INT HUP EXIT
mkdir $server_dir &> /dev/null
while ! zsocket -l $socket_path; do
if [[ ! -r $pid_file ]] || ! kill -0 $(<$pid_file) &> /dev/null; then
rm -f $socket_path
else
exit 1
fi
done
print $$ > $pid_file
server=$REPLY
while zsocket -a $server &> /dev/null; do
connection=$REPLY
# connection accepted, read the request and send response
while read -u $connection prefix &> /dev/null; do
zpty -w -n z $prefix$'\t'
zpty -r z chunk &> /dev/null # read empty line before completions
read-to-null $connection
exec {connection}>&-
zpty -w z $'\n'
done
done