1. Insert `-` in `echo -nE "$suggestion"`. This is necessary to prevent
`"$suggestion"` from being treated as an option for `echo`.
2. Close file descriptors only in `_zsh_autosuggest_async_response` to
ensure that each file descriptor is closed only once.
It's the second bug that prompted the fix. The original code in some
cases could close the same file descriptor twice. The code relied on
an invalid assumption that `_zsh_autosuggest_async_response` cannot
fire after the file descriptor is closed. Here's a demo that shows
this assumption being violated:
() {
emulate -L zsh
function callback1() {
zle -I
emulate -L zsh -o xtrace
: "$@"
zle -F $fd1
exec {fd1}>&-
zle -F $fd2
exec {fd2}>&-
}
function callback2() {
zle -I
emulate -L zsh -o xtrace
: "$@"
}
exec {fd1} </dev/null
exec {fd2} </dev/null
zle -F $fd1 callback1
zle -F $fd2 callback2
}
And here's the output I get if the code is pasted into an interactive zsh:
+callback1:3> : 12
+callback1:4> zle -F 12
+callback1:6> zle -F 13
+callback2:3> : 13
Note that `callback2` fires after its file descriptor has been closed
by `callback1`.
This bug was the culprit of several issues filed against powerlevel10k.
In a nutshell:
1. `_zsh_autosuggest_async_request` opens a file.
2. `_zsh_autosuggest_async_request` closes the file descriptor.
3. powerlevel10k opens a file and gets the same file descriptor as above.
4. `_zsh_autosuggest_async_response` fires and closes the same file descriptor.
5. powerlevel10k encounters errors when trying to read from the file descriptor.
There's something funny occasionally happening when `with_history` is
used twice in the same test. It seems to be happening more frequently
since asynchronous mode was enabled by default. My guess is it has
something to do with the `C-c` keys being sent toward the end not
consistently terminating the prompt. But I'm really not sure how it
would ever get into a `then` block like it seems to:
```
Failure/Error: wait_for { session.content }.to eq('echo "hello\nworld"')
expected: "echo \"hello\\nworld\""
got: "then> echo \"hello\\"
```
Sticking to only one `with_history` per terminal session (per test)
seems to fix the flakiness.
I also removed an old test case because I could not understand why it
was necessary and so couldn't write a good description for it. Could be
we'll need to add it back in at some point.
To avoid wrapping the built-in widgets (e.g. `autosuggest-fetch`,
`autosuggest-toggle`), we were ignoring all widgets whose names start
with `autosuggest-`. This had the downside of preventing wrapping of
user-defined widgets whose names happened to also start with that
prefix.
By being more specific about the exact built-in widgets we want to avoid
wrapping, we can allow users to define widgets whose names start with
`autosuggest-`.
See GitHub issue #496.
Set ZSH_AUTOSUGGEST_COMPLETION_IGNORE to a glob pattern to have the
completion suggestion strategy never make suggestions when the buffer
matches the pattern.
This can be helpful when some completion routines you have are
particularly expensive and you want to prevent them from running
automatically on every keystroke.
See GitHub issue #463.
We are getting errors on circle ci builds (e.g. see [1]):
```
CircleCI was unable to run the job runner because we were unable to
execute commands in build container.
This typically means that the build container entrypoint or command is
terminating the container prematurely, or interfering with executed
commands. Consider clearing entrypoint/command values and try again.
```
Folks in this thread [2] suggest removing the `command: /sbin/init` line
initially added by the v1 => v2 migration script.
---
1: https://circleci.com/gh/zsh-users/zsh-autosuggestions/381
2: https://discuss.circleci.com/t/circleci-was-unable-to-run-the-job-runner/31894/18
We are getting errors on circle ci builds (e.g. see [1]):
```
CircleCI was unable to run the job runner because we were unable to
execute commands in build container.
This typically means that the build container entrypoint or command is
terminating the container prematurely, or interfering with executed
commands. Consider clearing entrypoint/command values and try again.
```
Folks in this thread [2] suggest removing the `command: /sbin/init` line
initially added by the v1 => v2 migration script.
---
1: https://circleci.com/gh/zsh-users/zsh-autosuggestions/381
2: https://discuss.circleci.com/t/circleci-was-unable-to-run-the-job-runner/31894/18
Set ZSH_AUTOSUGGEST_HISTORY_IGNORE to a glob pattern to have the history
and match_prev_cmd suggestion strategies never make suggestions matching
that pattern.
For example, set to "cd *" to never suggest any `cd` commands from
history (see issues #340 and #425). Or set to "?(#c50,)" to never
suggest anything 50 characters or longer (see issue #429).