-
Notifications
You must be signed in to change notification settings - Fork 185
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
vi modal indicator #208
Comments
I think a good way would be to follow NVim's way: using a line cursor ('\033[6 q') for insert and emacs mode and switch to a block cursor for command mode. |
I disagree @AdminXVII. The issue is that not all terminals support cursor modes. The default behavior of iPython (which doesn't use readline anymore) is to show |
I should also say that the default indicators of readline are |
FWIW this is the config I use for IPython, to get cursors: 3 │ import sys
4 │ from prompt_toolkit.key_binding.vi_state import InputMode, ViState
5 │
6 │
7 │ def get_input_mode(self):
8 │ return self._input_mode
9 │
10 │
11 │ def set_input_mode(self, mode):
12 │ shape = {InputMode.NAVIGATION: 2, InputMode.REPLACE: 4}.get(mode, 6)
13 │ raw = u'\x1b[{} q'.format(shape)
14 │ if hasattr(sys.stdout, '_cli'):
15 │ out = sys.stdout._cli.output.write_raw
16 │ else:
17 │ out = sys.stdout.write
18 │ out(raw)
19 │ sys.stdout.flush()
20 │ self._input_mode = mode
21 │
22 │
23 │ ViState._input_mode = InputMode.INSERT
24 │ ViState.input_mode = property(get_input_mode, set_input_mode)
25 │ c.TerminalInteractiveShell.editing_mode = 'vi'
26 │ c.TerminalInteractiveShell.prompt_includes_vi_mode = False |
Well can't we have a graceful fall-back for those that don't? Or allow this as a configuration option somewhere? |
For reference, replxx uses a callback to update prompt dynamically: |
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
Readline supports the vi editing mode, with these options in
~/.inputrc
The
show-mode-in-prompt
feature is a really helpful bit of user feedback for a modal editing system like Vi. You can test this feature by writing the configuration above, and running Bash.The text was updated successfully, but these errors were encountered: