Mercurial > dotfiles
comparison .zfun/zsh-autosuggestions/src/async.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 # Async # | |
| 4 #--------------------------------------------------------------------# | |
| 5 | |
| 6 # Zpty process is spawned running this function | |
| 7 _zsh_autosuggest_async_server() { | |
| 8 emulate -R zsh | |
| 9 | |
| 10 # There is a bug in zpty module (fixed in zsh/master) by which a | |
| 11 # zpty that exits will kill all zpty processes that were forked | |
| 12 # before it. Here we set up a zsh exit hook to SIGKILL the zpty | |
| 13 # process immediately, before it has a chance to kill any other | |
| 14 # zpty processes. | |
| 15 zshexit() { | |
| 16 kill -KILL $$ | |
| 17 sleep 1 # Block for long enough for the signal to come through | |
| 18 } | |
| 19 | |
| 20 # Don't add any extra carriage returns | |
| 21 stty -onlcr | |
| 22 | |
| 23 # Don't translate carriage returns to newlines | |
| 24 stty -icrnl | |
| 25 | |
| 26 # Silence any error messages | |
| 27 exec 2>/dev/null | |
| 28 | |
| 29 local last_pid | |
| 30 | |
| 31 while IFS='' read -r -d $'\0' query; do | |
| 32 # Kill last bg process | |
| 33 kill -KILL $last_pid &>/dev/null | |
| 34 | |
| 35 # Run suggestion search in the background | |
| 36 ( | |
| 37 local suggestion | |
| 38 _zsh_autosuggest_fetch_suggestion "$query" | |
| 39 echo -n -E "$suggestion"$'\0' | |
| 40 ) & | |
| 41 | |
| 42 last_pid=$! | |
| 43 done | |
| 44 } | |
| 45 | |
| 46 _zsh_autosuggest_async_request() { | |
| 47 # Write the query to the zpty process to fetch a suggestion | |
| 48 zpty -w -n $ZSH_AUTOSUGGEST_ASYNC_PTY_NAME "${1}"$'\0' | |
| 49 } | |
| 50 | |
| 51 # Called when new data is ready to be read from the pty | |
| 52 # First arg will be fd ready for reading | |
| 53 # Second arg will be passed in case of error | |
| 54 _zsh_autosuggest_async_response() { | |
| 55 setopt LOCAL_OPTIONS EXTENDED_GLOB | |
| 56 | |
| 57 local suggestion | |
| 58 | |
| 59 zpty -rt $ZSH_AUTOSUGGEST_ASYNC_PTY_NAME suggestion '*'$'\0' 2>/dev/null | |
| 60 zle autosuggest-suggest -- "${suggestion%%$'\0'##}" | |
| 61 } | |
| 62 | |
| 63 _zsh_autosuggest_async_pty_create() { | |
| 64 # With newer versions of zsh, REPLY stores the fd to read from | |
| 65 typeset -h REPLY | |
| 66 | |
| 67 # If we won't get a fd back from zpty, try to guess it | |
| 68 if (( ! $_ZSH_AUTOSUGGEST_ZPTY_RETURNS_FD )); then | |
| 69 integer -l zptyfd | |
| 70 exec {zptyfd}>&1 # Open a new file descriptor (above 10). | |
| 71 exec {zptyfd}>&- # Close it so it's free to be used by zpty. | |
| 72 fi | |
| 73 | |
| 74 # Fork a zpty process running the server function | |
| 75 zpty -b $ZSH_AUTOSUGGEST_ASYNC_PTY_NAME _zsh_autosuggest_async_server | |
| 76 | |
| 77 # Store the fd so we can remove the handler later | |
| 78 if (( REPLY )); then | |
| 79 _ZSH_AUTOSUGGEST_PTY_FD=$REPLY | |
| 80 else | |
| 81 _ZSH_AUTOSUGGEST_PTY_FD=$zptyfd | |
| 82 fi | |
| 83 | |
| 84 # Set up input handler from the zpty | |
| 85 zle -F $_ZSH_AUTOSUGGEST_PTY_FD _zsh_autosuggest_async_response | |
| 86 } | |
| 87 | |
| 88 _zsh_autosuggest_async_pty_destroy() { | |
| 89 # Remove the input handler | |
| 90 zle -F $_ZSH_AUTOSUGGEST_PTY_FD &>/dev/null | |
| 91 | |
| 92 # Destroy the zpty | |
| 93 zpty -d $ZSH_AUTOSUGGEST_ASYNC_PTY_NAME &>/dev/null | |
| 94 } | |
| 95 | |
| 96 _zsh_autosuggest_async_pty_recreate() { | |
| 97 _zsh_autosuggest_async_pty_destroy | |
| 98 _zsh_autosuggest_async_pty_create | |
| 99 } | |
| 100 | |
| 101 _zsh_autosuggest_async_start() { | |
| 102 typeset -g _ZSH_AUTOSUGGEST_PTY_FD | |
| 103 | |
| 104 _zsh_autosuggest_feature_detect_zpty_returns_fd | |
| 105 _zsh_autosuggest_async_pty_recreate | |
| 106 | |
| 107 # We recreate the pty to get a fresh list of history events | |
| 108 add-zsh-hook precmd _zsh_autosuggest_async_pty_recreate | |
| 109 } |
