Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Generic Prompt Type #696

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open

Conversation

hoseinzadeh
Copy link

Sometimes we want to asynchronously update the prompt. For example, if we are using rustyline as a remote terminal, we want to display the connection info in the prompt. When disconnected, it is nicer to show a message and change the prompt to a ready state. With a Generic prompt type, it is possible to do that.

Performance overhead: in order to display the prompt, it should implement ToString trait. Therefore, it has a little performance overhead because it calls to_string every time it needs the prompt as a string (printing the prompt or calculating the cursor position). However, it is negligible as the whole system is a human interface that does not affect functionality.

@gwenn
Copy link
Collaborator

gwenn commented Apr 11, 2023

Prompt related stuff:
#208
#372
#369
#417
#598
4ec26e8

dmlary added a commit to dmlary/rustyline that referenced this pull request Apr 6, 2024
rustyline doesn't currently support changing the prompt while in the
core readline loop.  There are a number of open PRs and issues for this
functionality, but all of them appear to be stalled for more than a
year.

Looking at kkawakam#696 and 4ec26e8, the traditional appoach to this is to
provide a reference to a trait object (`Prompt` or `ToString`), but with
that appoach there's no way to cause the prompt to be redrawn for a
change without user input.  This means for these appoaches the prompt
could change without being displayed to the user.

There's an existing mechanism to allow another async task/thread to push
input into the core readline loop, the `ExternalPrinter`.

In this commit, I expand `ExternalPrinter` to add `set_prompt()`.  With
various plumbing, this function results in `wait_for_input` to return
`Cmd::SetPrompt(String)`.

One of key change here is `State.prompt` changes from `&str`
to `String`.  There is a performance hit here from the copy, but
rustyline would need to prompt and receive input hundreds of times per
second for the copy to have a noticable performance inpact.

Added examples/dynamic_prompt.rs to demonstrate the functionality.

Closes kkawakam#417

Related kkawakam#208, kkawakam#372, kkawakam#369, kkawakam#417, kkawakam#598, kkawakam#696
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants