nushell/crates/nu-cli/src
Yash Thakur 414216edfa
Transient prompt (#10391)
## Description

This PR uses environment variables to enable and set a transient prompt,
which lets you draw a different prompt once you've entered a command and
you've moved on to the next line. This is useful if you have a fancy
two-line prompt with a bunch of info about time and git status that you
don't really need in your scrollback buffer.

Here's a screenshot. You can see how my usual prompt has two lines and
would take up a lot more space if every past command also used the full
prompt, but reducing past prompts to `🚀` or `>` makes it take up less
space.

![image](https://github.com/nushell/nushell/assets/45539777/dde8d0f5-f95f-4529-9a14-b7919bd51126)

I added the following lines to my `env.nu` to get that rocket as the
prompt initially:
```nu
$env.TRANSIENT_PROMPT_COMMAND = {|| "" }
$env.TRANSIENT_PROMPT_INDICATOR = {|| open --raw "~/.prompt-indicator" }
$env.TRANSIENT_PROMPT_INDICATOR_VI_INSERT = $env.TRANSIENT_PROMPT_INDICATOR
```

## User-Facing Changes

If you want to change a segment of the prompt, set the corresponding
`TRANSIENT_PROMPT_*` variable.

<!-- If your PR had any user-facing changes, update [the
documentation](https://github.com/nushell/nushell.github.io) after the
PR is merged, if necessary. This will help us keep the docs up to date.
-->

## Problems/Things to Consider:
- The transient prompt clones the `Stack` at the very beginning of the
session and keeps that around. I'm not sure if that could cause
problems, but if so, it could probably take an `Arc<State>` instead.
- This isn't truly a problem, but now there's even more environment
variables, which is kinda annoying.
- There might be some performance issues with creating a new
`NushellPrompt` object and cloning the `Stack` for every segment of the
transient prompt. What's more, the transient prompt is added to the
`Reedline` object whether or not the user has enabled transient prompt,
so if there are indeed performance issues, simply disabling the
transient prompt won't help.
- Perhaps instead of a separate `TRANSIENT_PROMPT_INDICATOR_VI_INSERT`
and `TRANSIENT_PROMPT_INDICATOR_VI_NORMAL`, `TRANSIENT_PROMPT_INDICATOR`
could be used for both (if it exists). Insert and normal mode don't
really matter for previously entered commands.
2023-09-22 14:35:09 -05:00
..
commands Adapt for improved history isolation in reedline (#10402) 2023-09-18 13:49:26 +08:00
completions Deref &String arguments to &str where appropriate (#10321) 2023-09-12 14:06:56 +08:00
menus Fix a crash when moving the cursor after accepting a suggestion from the help menu (#9784) 2023-08-14 05:58:39 -05:00
config_files.rs Fix config creation during printing (#9353) 2023-06-04 22:04:28 +03:00
eval_cmds.rs Move CLI related commands to nu-cli (#8832) 2023-04-10 10:56:47 +12:00
eval_file.rs Deref &String arguments to &str where appropriate (#10321) 2023-09-12 14:06:56 +08:00
lib.rs cratification: move the bytes command to nu-cmd-extra (#9509) 2023-06-23 12:23:08 -07:00
nu_highlight.rs Move Value to helpers, separate span call (#10121) 2023-09-03 07:27:29 -07:00
print.rs allow print to take data as input again (#9823) 2023-07-27 21:40:25 +02:00
prompt_update.rs Transient prompt (#10391) 2023-09-22 14:35:09 -05:00
prompt.rs Fix default prompt indicators (#9914) 2023-08-05 04:47:46 +12:00
reedline_config.rs support tab completion cycling (#10199) 2023-09-03 19:19:39 -05:00
repl.rs Transient prompt (#10391) 2023-09-22 14:35:09 -05:00
syntax_highlight.rs Use slices directly instead of &Vec (#10328) 2023-09-12 11:38:20 +08:00
util.rs Move Value to helpers, separate span call (#10121) 2023-09-03 07:27:29 -07:00
validation.rs Remove old alias implementation (#8797) 2023-04-07 21:09:38 +03:00