Previously `command git rev-list --left-right --count HEAD...@'{u}'`
was run in a subshell, and upon `git fetch` completion, run once again.
This is now done as an async job (`prompt_pure_async_git_arrows`) and
is also called within `prompt_pure_async_git_fetch` to return the arrow
status immediately after `git fetch` has completed, this saves us from
waiting until the git fetch is done to only then execute a new async
job to check the arrow status.
Changes in git arrow / git dirty status are also handled better and
`prompt_pure_preprompt_render` is not called unless they actually
changed.
This commit fixes a problem where SSH (used by Git) is able to
interactively prompt for a password that can not be redirected to
`/dev/null`.
An interactive SSH password prompt inside the async worker does three
things:
1. Leave the `git fetch` hanging due to waiting for input
2. Capture part of the input to the async worker, thus creating
nonsense commands
3. Use some characters from future async jobs as a password and
attempts to login
Even if this was fixed in `zsh-async`, it is still good to disable the
password prompt to avoid issue numero uno.
We store the user setting for `prompt_subst` before changing it in the
local scope of `prompt_pure_preprompt_render`. This allows us to restore
it when we render the real prompt (`PS1`) through `zle .redraw-prompt`.
Fixes#230.
By unsetting `prompt_subst` for the `prompt_pure_preprompt_render`
function we can avoid e.g. git branch names with a `$`-sign to be
expanded as parameters.
Fixes#224 and #225 (as a result of 6cbd49a).
* Compare expanded preprompt when rendering
The expanded content of the preprompt was not considered previously when
checking if the content had changed. E.g. path changes were never detected.
The typeset (definition) and assignment are performed on separate lines as it
would cause issues otherwise.
Fixes#213.
This fixes#145 by calculating how many lines the previous preprompt
assumes in the current terminal window and either erases preprompt lines
that are no longer relevant or allocates more space for the new
preprompt.
prompt_pure_string_length is used for calculating the length of the
preprompt, but the preprompt doesn't contain a newline, so we shouldn't
subtract by one in prompt_pure_string_length.
What should happen instead is that when we subtract one from the length
when we calculate the number of lines the preprompt occupies.
Preprompt and prompt are two distinct concepts in pure: the preprompt is
where the directory and git info live, whereas the prompt (`PROMPT`) is
as pure and simple as `%(?.%F{magenta}.%F{red})❯%f`.
In the `prompt_pure_preprompt_render` function though, prompt and
preprompt are used interchangeably, which makes it confusing the first
time one reads it. (The lines `[[ "${prompt_pure_last_preprompt}" !=
"${prompt}" ]]` and `prompt_pure_last_preprompt=$prompt` perfectly
illustrate the interchangeable use and the potential point of
confusion.)
Therefore, this commits corrects the problem by renaming the `prompt`
local variable to `preprompt`, and updating comments accordingly.
* `prompt_pure_git_delay_dirty_check` holds the (finish) timestamp of
the last dirty check (if the dirty check took more than 2 seconds);
renamed to `prompt_pure_git_last_dirty_check_timestamp`.
* Local variable `dirty_check` holds the elapsed time in seconds since
the last dirty check (if the timestamp is set); renamed to
`time_since_last_dirty_check`.