The `string.gsub()` function in Lua always uses Lua patterns (which are
similar to regular expressions). Cmder's custom prompt wants to perform
simple plain text find/replace operations on strings. `string.gsub()`
is the right Lua function for that, but since it always uses Lua
patterns it's necessary to apply escaping to the input strings otherwise
they can get misinterpreted and cause runtime errors.
For example, if the current working directory name contains a percent
sign, such as literally "My%20Home".
This change fixes that. It introduces a helper function `gsub_plain()`
which behaves like `string.gsub()` but applies appropriate escaping to
convert the plain text input strings into the corresponding Lua
patterns so that it can achieve plain text find/replace operations.
It also introduces separate helper functions for escaping the `find` and
`replace` parameters for `string.gsub()`, since they have different
escaping rules.
Holding ^C made git.exe hang while cmd.exe (Clink) updated the prompt.
The prompt script had three problems:
1. It invoked `git config` every time a prompt was displayed, to
figure out where to skip invoking `git status`. But it even did
that if the current directory wasn't part of a git repo.
2. It invoked `git config` two times for every single prompt, to
attempt to improve performance if the user disables `git status`
coloring. But two times for every single prompt is expensive, so
it has the opposite effect in the general case, and noticeably
degrades performance.
3. It invoked `git config` using a blocking call, instead of using the
async prompt support in Clink. That significantly reduced the
benefit of having used async prompt filtering for `git status`.
Now the `git config` invocations use async prompt filtering, which lets
the prompt display instantaneously. It also now uses a timer to avoid
invoking `git config` repeatedly when new prompts show up in rapid
succession.
Also, the `cmderGitStatusOptIn` variable is no longer leaked into the
Lua global namespace.
These changes resolve the issue: holding ^C is very fast and no longer
causes git.exe to hang.
The Cmder prompt normally includes version control info, which involves
running some potentially expensive commands. The cmder-powerline-prompt
project (and maybe other projects) replaces the Cmder prompt and runs
the same potentially expensive commands -- so expensive commands get run
twice!
This change makes it possible for the user and/or other scripts to
disable the version control part of the built-in Cmder prompt.
https://github.com/chrisant996/cmder-powerline-prompt
Setting `prompt_overrideGitStatusOptIn = true` will override the
`cmder.status` and `cmder.cmdstatus` git config settings and run the git
prompt status commands in the background. But it only takes effect when
using Clink v1.2.10, since that's required in order to run prompt update
commands in the background.
`git status` and `git diff` can be slow in large repos. Clink v1.2.10
and higher support using Lua coroutines to do expensive parts of prompt
filtering in the background. When the expensive parts complete, the
prompt gets refreshed.
This means even large repos can have fast prompts PLUS git status all
the time!
This change should be backward/forward compatible with both older and
newer versions of Clink (of course only newer versions will gain the
benefit).
In `string.gsub()`, the `%` character has special meaning and must be escaped to be treated verbatim, otherwise the "invalid use of '%' in replacement string" warning will show up.
This adds a verbatim() function for that purpose. It fixes this warning for situations where `'%` characters are in the current path (cwd), version control branch names, or in the previous `PROMPT` set by the user.